annotate lisp/ses.el @ 59144:8d9ea622c741

* term/mac-win.el: Sync with x-win.el. Rearrange the contents. Call mac-clear-font-name-table if invoked on Mac OS 8/9. Call x-open-connection on Mac OS X.
author Steven Tamm <steventamm@mac.com>
date Mon, 27 Dec 2004 17:23:02 +0000
parents 924fa48ab4bf
children c8adcd0d5e2e f2ebccfa87d4
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
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
3 ;; Copyright (C) 2002,03,04 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
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
23 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
24 ;; Boston, MA 02111-1307, USA.
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
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
52 "Simple Emacs Spreadsheet"
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
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
151 (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
152 (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
153 newmap)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
154 "Local keymap for SES minibuffer cell-editing.")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
155
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
156 ;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
157 (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
158 (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
159 [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
160 "\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
161 "\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
162 "\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
163 "\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
164 "\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
165 "\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
166 "\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
167 "\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
168 "\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
169 "\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
170 "\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
171 "\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
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-cell
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
174 "'" 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
175 "=" 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
176 "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
177 "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
178 "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
179 "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
180 "\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
181 (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
182 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
183 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
184 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
185 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
186 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
187 (numeric "0123456789.-")
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
188 (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
189 ;;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
190 (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
191 ;;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
192 (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
193 (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
194 ;;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
195 (while repl
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
196 (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
197 (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
198 (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
199 ;;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
200 (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
201 ;;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
202 (while keys
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
203 (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
204 (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
205 newmap))
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
206
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
207 ;;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
208 (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
209
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
210 ;;Key map used for 'x' key.
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
211 (defalias 'ses-export-keymap
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
212 (let ((map (make-sparse-keymap "SES export")))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
213 (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
214 (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
215 map))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
216
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
217 (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
218 "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
219
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
220 (defconst ses-initial-global-parameters
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
221 "\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
222 "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
223
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
224 (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
225 ";; 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
226 "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
227
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
228 (defconst ses-initial-file-contents
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
229 (concat " \n" ;One blank cell in print area
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
230 ses-print-data-boundary
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
231 "(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
232 "\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
233 "(ses-column-widths [7])\n"
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
234 "(ses-column-printers [nil])\n"
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
235 "(ses-default-printer \"%.7g\")\n"
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
236 "(ses-header-row 0)\n"
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
237 ses-initial-global-parameters
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
238 ses-initial-file-trailer)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
239 "The initial contents of an empty spreadsheet.")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
240
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
241 (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
242 '(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
243 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
244 ses--numcols 10)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
245 "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
246 of a spreadsheet.")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
247
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
248 (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
249 "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
250
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
251 (defconst ses-standard-printer-functions
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
252 '(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
253 ses-tildefill-span)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
254 "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
255 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
256 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
257 default printer and then modify its output.")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
258
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
259 (eval-and-compile
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
260 (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
261 '(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
262 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
263 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
264 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
265 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
266 ;;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
267 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
268 "Buffer-local variables used by SES."))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
269
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
270 ;;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
271 (eval-when-compile
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
272 (dolist (x ses-localvars)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
273 (make-local-variable x)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
274 (set x nil)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
275
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
276
58409
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
277 ;;
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
278 ;; "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
279 ;; 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
280 ;; 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
281 ;; 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
282 ;; 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
283 ;;
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
284
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
285 (defvar ses-relocate-return nil
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
286 "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
287 `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
288 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
289 `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
290 need to be recalculated.")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
291
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
292 (defvar ses-call-printer-return nil
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
293 "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
294 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
295 encountered an error during printing. Nil otherwise.")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
296
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
297 (defvar ses-start-time nil
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
298 "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
299 when to emit a progress message.")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
300
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
301
58409
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
302 ;;----------------------------------------------------------------------------
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
303 ;; Macros
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
304 ;;----------------------------------------------------------------------------
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
305
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
306 (defmacro ses-get-cell (row col)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
307 "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
308 `(aref (aref ses--cells ,row) ,col))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
309
58409
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
310 ;; 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
311 ;; 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
312 (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
313 (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
314
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
315 (defmacro ses-cell-symbol (row &optional col)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
316 "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
317 `(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
318
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
319 (defmacro ses-cell-formula (row &optional col)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
320 "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
321 `(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
322
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
323 (defmacro ses-cell-printer (row &optional col)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
324 "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
325 `(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
326
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
327 (defmacro ses-cell-references (row &optional col)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
328 "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
329 functions refer to its value."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
330 `(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
331
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
332 (defmacro ses-cell-value (row &optional col)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
333 "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
334 `(symbol-value (ses-cell-symbol ,row ,col)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
335
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
336 (defmacro ses-col-width (col)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
337 "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
338 `(aref ses--col-widths ,col))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
339
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
340 (defmacro ses-col-printer (col)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
341 "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
342 `(aref ses--col-printers ,col))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
343
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
344 (defmacro ses-sym-rowcol (sym)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
345 "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
346 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
347 `(and (symbolp ,sym) (get ,sym 'ses-cell)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
348
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
349 (defmacro ses-cell (sym value formula printer references)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
350 "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
351 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
352 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
353 PRINTER are deferred until first use."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
354 (let ((rowcol (ses-sym-rowcol sym)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
355 (ses-formula-record formula)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
356 (ses-printer-record printer)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
357 (or (atom formula)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
358 (eq safe-functions t)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
359 (setq formula `(ses-safe-formula ,formula)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
360 (or (not printer)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
361 (stringp printer)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
362 (eq safe-functions t)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
363 (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
364 (aset (aref ses--cells (car rowcol))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
365 (cdr rowcol)
58409
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
366 (ses-make-cell sym formula printer references)))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
367 (set sym value)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
368 sym)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
369
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
370 (defmacro ses-column-widths (widths)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
371 "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
372 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
373 (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
374 (error "Bad column-width vector"))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
375 ;;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
376 ;;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
377 (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
378 ses--linewidth (apply '+ -1 (mapcar '1+ widths))
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
379 ses--blank-line (concat (make-string ses--linewidth ? ) "\n"))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
380 t)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
381
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
382 (defmacro ses-column-printers (printers)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
383 "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
384 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
385 (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
386 (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
387 (dotimes (x ses--numcols)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
388 (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
389 (setq ses--col-printers printers)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
390 (mapc 'ses-printer-record printers)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
391 t)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
392
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
393 (defmacro ses-default-printer (def)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
394 "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
395 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
396 (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
397 (ses-printer-record def)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
398 t)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
399
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
400 (defmacro ses-header-row (row)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
401 "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
402 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
403 (or (and (wholenump row) (< row ses--numrows))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
404 (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
405 (setq ses--header-row row)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
406 t)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
407
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
408 (defmacro ses-dotimes-msg (spec msg &rest body)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
409 "(ses-dotimes-msg (VAR LIMIT) MSG BODY...): Like `dotimes', but
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
410 a message is emitted using MSG every second or so during the loop."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
411 (let ((msgvar (make-symbol "msg"))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
412 (limitvar (make-symbol "limit"))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
413 (var (car spec))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
414 (limit (cadr spec)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
415 `(let ((,limitvar ,limit)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
416 (,msgvar ,msg))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
417 (setq ses-start-time (float-time))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
418 (message ,msgvar)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
419 (setq ,msgvar (concat ,msgvar " (%d%%)"))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
420 (dotimes (,var ,limitvar)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
421 (ses-time-check ,msgvar '(/ (* ,var 100) ,limitvar))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
422 ,@body)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
423 (message nil))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
424
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
425 (put 'ses-dotimes-msg 'lisp-indent-function 2)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
426 (def-edebug-spec ses-dotimes-msg ((symbolp form) form body))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
427
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
428 (defmacro ses-dorange (curcell &rest body)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
429 "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
430 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
431 variables `minrow', `maxrow', `mincol', and `maxcol'."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
432 (let ((cur (make-symbol "cur"))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
433 (min (make-symbol "min"))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
434 (max (make-symbol "max"))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
435 (r (make-symbol "r"))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
436 (c (make-symbol "c")))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
437 `(let* ((,cur ,curcell)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
438 (,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
439 (,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
440 (let ((minrow (car ,min))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
441 (maxrow (car ,max))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
442 (mincol (cdr ,min))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
443 (maxcol (cdr ,max))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
444 row col)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
445 (if (or (> minrow maxrow) (> mincol maxcol))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
446 (error "Empty range"))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
447 (dotimes (,r (- maxrow minrow -1))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
448 (setq row (+ ,r minrow))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
449 (dotimes (,c (- maxcol mincol -1))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
450 (setq col (+ ,c mincol))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
451 ,@body))))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
452
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
453 (put 'ses-dorange 'lisp-indent-function 'defun)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
454 (def-edebug-spec ses-dorange (form body))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
455
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
456 ;;Support for coverage testing.
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
457 (defmacro 1value (form)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
458 "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
459 the same value."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
460 form)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
461 (defmacro noreturn (form)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
462 "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
463 form)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
464
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
465
58409
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
466 ;;----------------------------------------------------------------------------
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
467 ;; Utility functions
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
468 ;;----------------------------------------------------------------------------
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
469
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
470 (defun ses-vector-insert (array idx new)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
471 "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
472 before element IDX."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
473 (let* ((len (length array))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
474 (result (make-vector (1+ len) new)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
475 (dotimes (x len)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
476 (aset result
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
477 (if (< x idx) x (1+ x))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
478 (aref array x)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
479 result))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
480
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
481 ;;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
482 (defun ses-vector-delete (array idx count)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
483 "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
484 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
485 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
486 (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
487 (len (- (length a) count))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
488 (result (make-vector len nil)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
489 (dotimes (x len)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
490 (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
491 (if (symbolp array)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
492 (set array result))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
493 result))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
494
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
495 (defun ses-delete-line (count)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
496 "Like `kill-line', but no kill ring."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
497 (let ((pos (point)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
498 (forward-line count)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
499 (delete-region pos (point))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
500
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
501 (defun ses-printer-validate (printer)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
502 "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
503 (or (not printer)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
504 (stringp printer)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
505 (functionp printer)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
506 (and (stringp (car-safe printer)) (not (cdr printer)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
507 (error "Invalid printer function"))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
508 printer)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
509
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
510 (defun ses-printer-record (printer)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
511 "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
512 checking that it is a valid printer function."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
513 (ses-printer-validate printer)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
514 ;;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
515 (if printer
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
516 (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
517
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
518 (defun ses-formula-record (formula)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
519 "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
520 for this spreadsheet."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
521 (when (and (eq (car-safe formula) 'quote)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
522 (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
523 (add-to-list 'ses--symbolic-formulas
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
524 (list (symbol-name (cadr formula))))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
525
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
526 (defun ses-column-letter (col)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
527 "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
528 (if (< col 26)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
529 (char-to-string (+ ?A col))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
530 (string (+ ?@ (/ col 26)) (+ ?A (% col 26)))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
531
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
532 (defun ses-create-cell-symbol (row col)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
533 "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
534 (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
535
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
536 (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
537 "Create buffer-local variables for cells. This is undoable."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
538 (push `(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
539 buffer-undo-list)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
540 (let (sym xrow xcol)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
541 (dotimes (row (1+ (- maxrow minrow)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
542 (dotimes (col (1+ (- maxcol mincol)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
543 (setq xrow (+ row minrow)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
544 xcol (+ col mincol)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
545 sym (ses-create-cell-symbol xrow xcol))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
546 (put sym 'ses-cell (cons xrow xcol))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
547 (make-local-variable sym)))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
548
58409
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
549 ;;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
550 ;;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
551 ;;back in.
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
552 (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
553 "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
554 (let (sym)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
555 (dotimes (row (1+ (- maxrow minrow)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
556 (dotimes (col (1+ (- maxcol mincol)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
557 (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
558 (if (boundp sym)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
559 (push `(ses-set-with-undo ,sym ,(symbol-value sym))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
560 buffer-undo-list))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
561 (kill-local-variable sym))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
562 (push `(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
563 buffer-undo-list))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
564
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
565 (defun ses-reset-header-string ()
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
566 "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
567 updated again."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
568 (push '(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
569 (setq ses--header-hscroll -1))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
570
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
571 ;;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
572 (defun ses-time-check (format arg)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
573 "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
574 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
575 (when (> (- (float-time) ses-start-time) 1.0)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
576 (message format (eval arg))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
577 (setq ses-start-time (float-time)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
578 nil)
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
58409
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
581 ;;----------------------------------------------------------------------------
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
582 ;; The cells
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
583 ;;----------------------------------------------------------------------------
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
584
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
585 (defun ses-set-cell (row col field val)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
586 "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
587 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
588 `post-command-hook'."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
589 (let ((cell (ses-get-cell row col))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
590 (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
591 field))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
592 change)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
593 (or elt (signal 'args-out-of-range nil))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
594 (setq change (if (eq elt t)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
595 (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
596 (ses-aset-with-undo cell elt val)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
597 (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
598 (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
599 nil) ;Make coverage-tester happy
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
600
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
601 (defun ses-cell-set-formula (row col formula)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
602 "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
603 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
604 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
605 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
606 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
607 (let* ((cell (ses-get-cell row col))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
608 (old (ses-cell-formula cell)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
609 (let ((sym (ses-cell-symbol cell))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
610 (oldref (ses-formula-references old))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
611 (newref (ses-formula-references formula))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
612 (inhibit-quit t)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
613 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
614 (add-to-list 'ses--deferred-recalc sym)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
615 ;;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
616 ;;in the new list.
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
617 (dolist (ref oldref)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
618 (unless (memq ref newref)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
619 (setq x (ses-sym-rowcol ref)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
620 xrow (car x)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
621 xcol (cdr x))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
622 (ses-set-cell xrow xcol 'references
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
623 (delq sym (ses-cell-references xrow xcol)))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
624 ;;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
625 (dolist (ref newref)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
626 (setq x (ses-sym-rowcol ref)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
627 xrow (car x)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
628 xcol (cdr x)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
629 x (ses-cell-references xrow xcol))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
630 (or (memq sym x)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
631 (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
632 (ses-formula-record formula)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
633 (ses-set-cell row col 'formula formula))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
634
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
635 (defun ses-calculate-cell (row col force)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
636 "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
637 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
638 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
639 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
640 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
641 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
642 the old and FORCE is nil."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
643 (let ((cell (ses-get-cell row col))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
644 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
645 (let ((oldval (ses-cell-value cell))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
646 (formula (ses-cell-formula cell))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
647 newval)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
648 (if (eq (car-safe formula) 'ses-safe-formula)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
649 (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
650 (condition-case sig
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
651 (setq newval (eval formula))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
652 (error
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
653 (setq formula-error sig
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
654 newval '*error*)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
655 (if (and (not newval) (eq oldval '*skip*))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
656 ;;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
657 (setq newval '*skip*))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
658 (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
659 (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
660 (ses-set-cell row col 'value newval)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
661 (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
662 (add-to-list 'ses--deferred-recalc ref))))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
663 (setq printer-error (ses-print-cell row col))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
664 (or formula-error printer-error)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
665
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
666 (defun ses-clear-cell (row col)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
667 "Delete formula and printer for cell (ROW,COL)."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
668 (ses-set-cell row col 'printer nil)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
669 (ses-cell-set-formula row col nil))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
670
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
671 (defun ses-update-cells (list &optional force)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
672 "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
673 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
674 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
675 (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
676 (nextlist list)
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
677 (pos (point))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
678 curlist prevlist rowcol formula)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
679 (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
680 (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
681 ;;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
682 ;;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
683 ;;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
684 ;;set of cells being worked on stops changing.
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
685 (if prevlist
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
686 (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
687 (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
688 (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
689 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
690 prevlist nextlist)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
691 (while curlist
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
692 (setq rowcol (ses-sym-rowcol (car curlist))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
693 formula (ses-cell-formula (car rowcol) (cdr rowcol)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
694 (or (catch 'ref
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
695 (dolist (ref (ses-formula-references formula))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
696 (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
697 (memq ref ses--deferred-recalc))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
698 ;;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
699 (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
700 (throw 'ref t))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
701 ;;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
702 ;;inhibit-quit is implicitly bound to t.
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
703 (when quit-flag
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
704 ;;Abort the recalculation. User will probably undo now.
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
705 (error "Quit"))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
706 (ses-calculate-cell (car rowcol) (cdr rowcol) force))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
707 (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
708 (dolist (ref ses--deferred-recalc)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
709 (add-to-list 'nextlist ref))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
710 (setq nextlist (sort (copy-sequence nextlist) 'string<))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
711 (if (equal nextlist prevlist)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
712 ;;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
713 (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
714 (when ses--deferred-recalc
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
715 ;;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
716 (dolist (x ses--deferred-recalc)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
717 (let ((rowcol (ses-sym-rowcol x)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
718 (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
719 (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
720 (error "Circular references: %s" ses--deferred-recalc))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
721 (message " "))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
722 ;;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
723 ;;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
724 (goto-char pos)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
725
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
726
58409
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
727 ;;----------------------------------------------------------------------------
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
728 ;; The print area
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
729 ;;----------------------------------------------------------------------------
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
730
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
731 (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
732 "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
733 (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
734
58409
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
735 ;;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
736 ;;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
737 ;;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
738 (defun ses-goto-print (row col)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
739 "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
740 (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
741 (goto-char (point-min))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
742 (forward-line row)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
743 (dotimes (c col)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
744 (forward-char (1+ (ses-col-width c))))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
745
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
746 (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
747 "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
748 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
749 (if (or (not mark-active)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
750 deactivate-mark
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
751 (= (region-beginning) (region-end)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
752 ;;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
753 (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
754 ;;Range
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
755 (let ((bcell (get-text-property (region-beginning) 'intangible))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
756 (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
757 (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
758 (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
759 nil))))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
760 nil)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
761
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
762 (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
763 "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
764 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
765 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
766 'needrange."
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
767 (if (eq ses--curcell t)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
768 ;;curcell recalculation was postponed, but user typed ahead
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
769 (ses-set-curcell))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
770 (cond
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
771 ((not ses--curcell)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
772 (or (memq 'end args)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
773 (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
774 ((consp ses--curcell)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
775 (or (memq 'range args)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
776 (memq 'needrange args)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
777 (error "Can't use a range")))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
778 ((memq 'needrange args)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
779 (error "Need a range"))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
780
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
781 (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
782 "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
783 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
784 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
785 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
786 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
787 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
788 preceding cell has spilled over."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
789 (catch 'ses-print-cell
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
790 (let* ((cell (ses-get-cell row col))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
791 (value (ses-cell-value cell))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
792 (printer (ses-cell-printer cell))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
793 (maxcol (1+ col))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
794 text sig startpos x)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
795 ;;Create the string to print
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
796 (cond
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
797 ((eq value '*skip*)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
798 ;;Don't print anything
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
799 (throw 'ses-print-cell nil))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
800 ((eq value '*error*)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
801 (setq text (make-string (ses-col-width col) ?#)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
802 (t
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
803 ;;Deferred safety-check on printer
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
804 (if (eq (car-safe printer) 'ses-safe-printer)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
805 (ses-set-cell row col 'printer
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
806 (setq printer (ses-safe-printer (cadr printer)))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
807 ;;Print the value
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
808 (setq text (ses-call-printer (or printer
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
809 (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
810 ses--default-printer)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
811 value))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
812 (if (consp ses-call-printer-return)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
813 ;;Printer returned an error
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
814 (setq sig ses-call-printer-return))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
815 ;;Adjust print width to match column width
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
816 (let ((width (ses-col-width col))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
817 (len (length text)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
818 (cond
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
819 ((< len width)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
820 ;;Fill field to length with spaces
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
821 (setq len (make-string (- width len) ? )
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
822 text (if (eq ses-call-printer-return t)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
823 (concat text len)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
824 (concat len text))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
825 ((> len width)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
826 ;;Spill over into following cells, if possible
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
827 (let ((maxwidth width))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
828 (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
829 (< maxcol ses--numcols)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
830 (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
831 (eq x '*skip*)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
832 (unless x
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
833 ;;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
834 (ses-set-cell row maxcol 'value '*skip*))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
835 (setq maxwidth (+ maxwidth (ses-col-width maxcol) 1)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
836 maxcol (1+ maxcol)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
837 (if (<= len maxwidth)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
838 ;;Fill to complete width of all the fields spanned
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
839 (setq text (concat text (make-string (- maxwidth len) ? )))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
840 ;;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
841 ;;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
842 (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
843 (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
844 ((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
845 (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
846 ((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
847 (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
848 (>= 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
849 (- 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
850 (- (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
851 ;; 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
852 (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
853 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
854 (- (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
855 (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
856 (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
857 (setq text (make-string maxwidth ?#)))))))))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
858 ;;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
859 ;;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
860 (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
861 (ses-goto-print row col)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
862 (setq startpos (point))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
863 ;;Install the printed result. This is not interruptible.
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
864 (let ((inhibit-read-only t)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
865 (inhibit-quit t))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
866 (delete-char (1+ (length text)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
867 ;;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
868 ;;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
869 (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
870 ;;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
871 ;;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
872 ;;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
873 ;;actually inherit from surrounding text?)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
874 (set-text-properties 0 (length x) nil x)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
875 (insert-and-inherit x)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
876 (put-text-property startpos (point) 'intangible
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
877 (ses-cell-symbol cell))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
878 (when (and (zerop row) (zerop col))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
879 ;;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
880 (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
881 (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
882 (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
883 (if (= row (1- ses--header-row))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
884 ;;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
885 (ses-reset-header-string))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
886 ;;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
887 ;;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
888 (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
889 (eq (ses-cell-value row maxcol) '*skip*))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
890 (ses-set-cell row maxcol 'value nil)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
891 (ses-print-cell row maxcol))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
892 ;;Return to start of cell
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
893 (goto-char startpos)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
894 sig)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
895
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
896 (defun ses-call-printer (printer &optional value)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
897 "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
898 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
899 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
900 used parenthesis to request left-justification, or the error-signal if the
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
901 printer signalled one (and \"%s\" is used as the default printer), else nil."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
902 (setq ses-call-printer-return nil)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
903 (unless value
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
904 (setq value ""))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
905 (condition-case signal
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
906 (cond
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
907 ((stringp printer)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
908 (format printer value))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
909 ((stringp (car-safe printer))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
910 (setq ses-call-printer-return t)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
911 (format (car printer) value))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
912 (t
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
913 (setq value (funcall printer value))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
914 (if (stringp value)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
915 value
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
916 (or (stringp (car-safe value))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
917 (error "Printer should return \"string\" or (\"string\")"))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
918 (setq ses-call-printer-return t)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
919 (car value))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
920 (error
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
921 (setq ses-call-printer-return signal)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
922 (prin1-to-string value t))))
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-adjust-print-width (col change)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
925 "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
926 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
927 inhibit-quit to t."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
928 (let ((inhibit-read-only t)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
929 (blank (if (> change 0) (make-string change ? )))
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
930 (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
931 (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
932 ;;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
933 (1value (ses-set-with-undo 'ses--blank-line
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
934 (concat (make-string ses--linewidth ? ) "\n")))
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
935 (dotimes (row ses--numrows)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
936 (ses-goto-print row col)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
937 (when at-end
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
938 ;;Insert new columns before newline
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
939 (let ((inhibit-point-motion-hooks t))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
940 (backward-char 1)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
941 (if blank
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
942 (insert blank)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
943 (delete-char (- change))))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
944
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
945 (defun ses-print-cell-new-width (row col)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
946 "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
947 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
948 cell (ROW,COL) has changed."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
949 (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
950 (ses-print-cell row col)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
951 ;;Cell was skipped over - reprint previous
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
952 (ses-goto-print row col)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
953 (backward-char 1)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
954 (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
955 (ses-print-cell (car rowcol) (cdr rowcol)))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
956
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
957
58409
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
958 ;;----------------------------------------------------------------------------
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
959 ;; The data area
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
960 ;;----------------------------------------------------------------------------
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
961
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
962 (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
963
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
964 (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
965 "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
966 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
967 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
968 ses--default-printer, ses--numrows, or ses--numcols."
58409
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
969 (if (ses-narrowed-p)
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
970 (setq ses--deferred-narrow t))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
971 (widen)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
972 (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
973 (goto-char (point-min))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
974 (if col
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
975 ;;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
976 (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
977 ;;Convert def-symbol to offset
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
978 (setq def (plist-get ses-paramlines-plist def))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
979 (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
980 (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
981
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
982 (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
983 "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
984 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
985 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
986 (save-excursion
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
987 ;;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
988 ;;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
989 (ses-goto-data def)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
990 (if elem
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
991 (ses-aset-with-undo (symbol-value def) elem value)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
992 (ses-set-with-undo def value))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
993 (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
994 (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
995 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
996 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
997 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
998 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
999 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
1000 ses--numcols " %S ;numcols")
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1001 def)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1002 (delete-region (point) (line-end-position))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1003 (insert (format fmt (symbol-value def))))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1004
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1005 (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
1006 "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
1007 Newlines in the data are escaped."
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1008 (let* ((inhibit-read-only t)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1009 (print-escape-newlines t)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1010 rowcol row col cell sym formula printer text)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1011 (setq ses-start-time (float-time))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1012 (with-temp-message " "
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1013 (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
1014 (while ses--deferred-write
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1015 (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
1016 '(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
1017 (setq rowcol (pop ses--deferred-write)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1018 row (car rowcol)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1019 col (cdr rowcol)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1020 cell (ses-get-cell row col)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1021 sym (ses-cell-symbol cell)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1022 formula (ses-cell-formula cell)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1023 printer (ses-cell-printer cell))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1024 (if (eq (car-safe formula) 'ses-safe-formula)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1025 (setq formula (cadr formula)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1026 (if (eq (car-safe printer) 'ses-safe-printer)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1027 (setq printer (cadr printer)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1028 ;;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
1029 (setq text (concat "(ses-cell "
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1030 (symbol-name sym)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1031 " "
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1032 (prin1-to-string (symbol-value sym))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1033 " "
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1034 (prin1-to-string formula)
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 (prin1-to-string printer)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1037 " "
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1038 (if (atom (ses-cell-references cell))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1039 "nil"
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1040 (concat "("
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1041 (mapconcat 'symbol-name
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1042 (ses-cell-references cell)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1043 " ")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1044 ")"))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1045 ")"))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1046 (ses-goto-data row col)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1047 (delete-region (point) (line-end-position))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1048 (insert text)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1049 (message " "))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1050
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1051
58409
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
1052 ;;----------------------------------------------------------------------------
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
1053 ;; Formula relocation
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
1054 ;;----------------------------------------------------------------------------
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1055
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1056 (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
1057 "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
1058 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
1059 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
1060 (if (atom formula)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1061 (if (ses-sym-rowcol formula)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1062 ;;Entire formula is one symbol
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1063 (add-to-list 'result-so-far formula)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1064 ) ;;Ignore other atoms
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1065 (dolist (cur formula)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1066 (cond
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1067 ((ses-sym-rowcol cur)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1068 ;;Save this reference
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1069 (add-to-list 'result-so-far cur))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1070 ((eq (car-safe cur) 'ses-range)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1071 ;;All symbols in range are referenced
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1072 (dolist (x (cdr (macroexpand cur)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1073 (add-to-list 'result-so-far x)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1074 ((and (consp cur) (not (eq (car cur) 'quote)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1075 ;;Recursive call for subformulas
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1076 (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
1077 (t
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1078 ;;Ignore other stuff
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1079 ))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1080 result-so-far)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1081
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1082 (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
1083 "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
1084 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
1085 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
1086 (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
1087 => (+ A1 B2 C4)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1088 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
1089 removed. Example:
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1090 (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
1091 => (+ A1 C3)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1092 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
1093 (let (rowcol result)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1094 (if (or (atom formula) (eq (car formula) 'quote))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1095 (if (setq rowcol (ses-sym-rowcol formula))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1096 (ses-relocate-symbol formula rowcol
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1097 startrow startcol rowincr colincr)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1098 formula) ;Pass through as-is
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1099 (dolist (cur formula)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1100 (setq rowcol (ses-sym-rowcol cur))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1101 (cond
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1102 (rowcol
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1103 (setq cur (ses-relocate-symbol cur rowcol
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1104 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 ;;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
1108 ;;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
1109 ;;implies 'delete.
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1110 (unless ses-relocate-return
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1111 (setq ses-relocate-return 'delete))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1112 ((eq (car-safe cur) 'ses-range)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1113 (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
1114 (if cur
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1115 (push cur result)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1116 ((or (atom cur) (eq (car cur) 'quote))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1117 ;;Constants pass through unchanged
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1118 (push cur result))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1119 (t
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1120 ;;Recursively copy and alter subformulas
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1121 (push (ses-relocate-formula cur startrow startcol
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1122 rowincr colincr)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1123 result))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1124 (nreverse result))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1125
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1126 (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
1127 "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
1128 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
1129 by (ROWINCR,COLINCR)."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1130 (let ((row (car rowcol))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1131 (col (cdr rowcol)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1132 (if (or (< row startrow) (< col startcol))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1133 sym
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1134 (setq row (+ row rowincr)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1135 col (+ col colincr))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1136 (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
1137 (< row ses--numrows) (< col ses--numcols))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1138 ;;Relocate this variable
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1139 (ses-create-cell-symbol row col)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1140 ;;Delete reference to a deleted cell
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1141 nil))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1142
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1143 (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
1144 "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
1145 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
1146 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
1147 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
1148 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
1149 if the range was altered."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1150 (let* ((minorig (cadr range))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1151 (minrowcol (ses-sym-rowcol minorig))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1152 (min (ses-relocate-symbol minorig minrowcol
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1153 startrow startcol
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1154 rowincr colincr))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1155 (maxorig (nth 2 range))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1156 (maxrowcol (ses-sym-rowcol maxorig))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1157 (max (ses-relocate-symbol maxorig maxrowcol
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1158 startrow startcol
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1159 rowincr colincr))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1160 field)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1161 (cond
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1162 ((and (not min) (not max))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1163 (setq range nil)) ;;The entire range is deleted
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1164 ((zerop colincr)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1165 ;;Inserting or deleting rows
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1166 (setq field 'car)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1167 (if (not min)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1168 ;;Chopped off beginning of range
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1169 (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
1170 ses-relocate-return 'range))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1171 (if (not max)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1172 (if (> rowincr 0)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1173 ;;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
1174 (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
1175 (cdr minrowcol)))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1176 ;;End of range is being deleted
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1177 (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
1178 ses-relocate-return 'range))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1179 (and (> rowincr 0)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1180 (= (car maxrowcol) (1- startrow))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1181 (= (cdr minrowcol) (cdr maxrowcol))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1182 ;;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
1183 (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
1184 (cdr maxrowcol))))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1185 (t
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1186 ;;Inserting or deleting columns
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1187 (setq field 'cdr)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1188 (if (not min)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1189 ;;Chopped off beginning of range
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1190 (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
1191 ses-relocate-return 'range))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1192 (if (not max)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1193 (if (> colincr 0)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1194 ;;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
1195 (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
1196 (1- ses--numcols)))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1197 ;;End of range is being deleted
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1198 (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
1199 ses-relocate-return 'range))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1200 (and (> colincr 0)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1201 (= (cdr maxrowcol) (1- startcol))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1202 (= (car minrowcol) (car maxrowcol))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1203 ;;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
1204 (setq max (ses-create-cell-symbol (car maxrowcol)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1205 (+ startcol colincr -1)))))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1206 (when range
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1207 (if (/= (- (funcall field maxrowcol)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1208 (funcall field minrowcol))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1209 (- (funcall field (ses-sym-rowcol max))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1210 (funcall field (ses-sym-rowcol min))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1211 ;;This range has changed size
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1212 (setq ses-relocate-return 'range))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1213 (list 'ses-range min max))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1214
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1215 (defun ses-relocate-all (minrow mincol rowincr colincr)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1216 "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
1217 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
1218 to each symbol."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1219 (let (reform)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1220 (let (mycell newval)
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1221 (ses-dotimes-msg (row ses--numrows) "Relocating formulas..."
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1222 (dotimes (col ses--numcols)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1223 (setq ses-relocate-return nil
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1224 mycell (ses-get-cell row col)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1225 newval (ses-relocate-formula (ses-cell-formula mycell)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1226 minrow mincol rowincr colincr))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1227 (ses-set-cell row col 'formula newval)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1228 (if (eq ses-relocate-return 'range)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1229 ;;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
1230 ;;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
1231 (push (cons row col) reform))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1232 (if ses-relocate-return
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1233 ;;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
1234 ;;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
1235 ;;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
1236 (add-to-list 'ses--deferred-recalc
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1237 (ses-create-cell-symbol row col)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1238 (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
1239 minrow mincol rowincr colincr))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1240 (ses-set-cell row col 'references newval)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1241 (and (>= row minrow) (>= col mincol)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1242 (ses-set-cell row col 'symbol
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1243 (ses-create-cell-symbol row col))))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1244 ;;Relocate the cell values
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1245 (let (oldval myrow mycol xrow xcol)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1246 (cond
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1247 ((and (<= rowincr 0) (<= colincr 0))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1248 ;;Deletion of rows and/or columns
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1249 (ses-dotimes-msg (row (- ses--numrows minrow)) "Relocating variables..."
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1250 (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
1251 (dotimes (col (- ses--numcols mincol))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1252 (setq mycol (+ col mincol)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1253 xrow (- myrow rowincr)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1254 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
1255 (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
1256 (setq oldval (ses-cell-value xrow xcol))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1257 ;;Cell is off the end of the array
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1258 (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
1259 (ses-set-cell myrow mycol 'value oldval))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1260 ((and (wholenump rowincr) (wholenump colincr))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1261 ;;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
1262 (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
1263 (distx (1- ses--numcols))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1264 myrow mycol)
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1265 (ses-dotimes-msg (row (- ses--numrows minrow)) "Relocating variables..."
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1266 (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
1267 (dotimes (col (- ses--numcols mincol))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1268 (setq mycol (- distx col)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1269 xrow (- myrow rowincr)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1270 xcol (- mycol colincr))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1271 (if (or (< xrow minrow) (< xcol mincol))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1272 ;;Newly-inserted value
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1273 (setq oldval nil)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1274 ;;Transfer old value
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1275 (setq oldval (ses-cell-value xrow xcol)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1276 (ses-set-cell myrow mycol 'value oldval)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1277 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
1278 (t
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1279 (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
1280 ;;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
1281 ;;have changed size.
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1282 (when reform
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1283 (message "Fixing ses-ranges...")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1284 (let (row col)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1285 (setq ses-start-time (float-time))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1286 (while reform
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1287 (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
1288 (setq row (caar reform)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1289 col (cdar reform)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1290 reform (cdr reform))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1291 (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
1292 (message nil))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1293
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1294
58409
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
1295 ;;----------------------------------------------------------------------------
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
1296 ;; Undo control
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
1297 ;;----------------------------------------------------------------------------
47667
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 (defadvice undo-more (around ses-undo-more activate preactivate)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1300 "Define a meaning for conses in buffer-undo-list whose car is a symbol
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1301 other than t or nil. To undo these, apply the car--a function--to the
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1302 cdr--its arglist."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1303 (let ((ses-count (ad-get-arg 0)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1304 (catch 'undo
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1305 (dolist (ses-x pending-undo-list)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1306 (unless ses-x
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1307 ;;End of undo boundary
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1308 (setq ses-count (1- ses-count))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1309 (if (<= ses-count 0)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1310 ;;We've seen enough boundaries - stop undoing
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1311 (throw 'undo nil)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1312 (and (consp ses-x) (symbolp (car ses-x)) (fboundp (car ses-x))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1313 ;;Undo using apply
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1314 (apply (car ses-x) (cdr ses-x)))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1315 (if (not (eq major-mode 'ses-mode))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1316 ad-do-it
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1317 ;;Here is some extra code for 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
1318 (setq ses--deferred-narrow
58409
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
1319 (or ses--deferred-narrow (ses-narrowed-p)))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1320 (widen)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1321 (condition-case x
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1322 ad-do-it
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1323 (error
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1324 ;;Restore narrow if appropriate
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1325 (ses-command-hook)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1326 (signal (car x) (cdr x)))))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1327
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1328 (defun ses-begin-change ()
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1329 "For undo, remember current buffer-position before we start changing hidden
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1330 stuff."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1331 (let ((inhibit-read-only t))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1332 (insert-and-inherit "X")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1333 (delete-region (1- (point)) (point))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1334
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1335 (defun ses-set-with-undo (sym newval)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1336 "Like set, but undoable. Result is t if value has changed."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1337 ;;We avoid adding redundant entries to the undo list, but this is
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1338 ;;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
1339 ;;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
1340 (unless (and (boundp sym)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1341 (equal (symbol-value sym) newval)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1342 (not (stringp newval)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1343 (push (if (boundp sym)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1344 `(ses-set-with-undo ,sym ,(symbol-value sym))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1345 `(ses-unset-with-undo ,sym))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1346 buffer-undo-list)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1347 (set sym newval)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1348 t))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1349
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1350 (defun ses-unset-with-undo (sym)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1351 "Set SYM to be unbound. This is undoable."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1352 (when (1value (boundp sym)) ;;Always bound, except after a programming error
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1353 (push `(ses-set-with-undo ,sym ,(symbol-value sym)) buffer-undo-list)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1354 (makunbound sym)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1355
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1356 (defun ses-aset-with-undo (array idx newval)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1357 "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
1358 (unless (equal (aref array idx) newval)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1359 (push `(ses-aset-with-undo ,array ,idx ,(aref array idx)) buffer-undo-list)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1360 (aset array idx newval)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1361 t))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1362
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1363
58409
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
1364 ;;----------------------------------------------------------------------------
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
1365 ;; 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
1366 ;;----------------------------------------------------------------------------
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1367
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1368 (defun ses-load ()
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1369 "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
1370 execute cell formulas or print functions."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1371 (widen)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1372 ;;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
1373 (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
1374 (search-backward ";; Local Variables:\n" nil t)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1375 (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
1376 (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
1377 (or (and (= (safe-length params) 3)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1378 (numberp (car params))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1379 (numberp (cadr params))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1380 (> (cadr params) 0)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1381 (numberp (nth 2 params))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1382 (> (nth 2 params) 0))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1383 (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
1384 (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
1385 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
1386 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
1387 (when (= ses--file-format 1)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1388 (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
1389 (ses-goto-data 'ses--header-row)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1390 (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
1391 (ses-set-parameter 'ses--file-format 2)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1392 (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
1393 (or (= ses--file-format 2)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1394 (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
1395 (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
1396 ;;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
1397 (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
1398 (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
1399 (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
1400 ;;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
1401 (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
1402 (forward-line ses--numrows)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1403 (or (looking-at ses-print-data-boundary)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1404 (error "Missing marker between print and data areas"))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1405 (forward-char (length ses-print-data-boundary))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1406 ;;Initialize printer and symbol lists
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1407 (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
1408 (setq ses--symbolic-formulas nil)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1409 ;;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
1410 (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
1411 (dotimes (col ses--numcols)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1412 (let* ((x (read (current-buffer)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1413 (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
1414 (or (and (looking-at "\n")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1415 (eq (car-safe x) 'ses-cell)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1416 (eq row (car rowcol))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1417 (eq col (cdr rowcol)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1418 (error "Cell-def error"))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1419 (eval x)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1420 (or (looking-at "\n\n")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1421 (error "Missing blank line between rows")))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1422 ;;Load global parameters
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1423 (let ((widths (read (current-buffer)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1424 (n1 (char-after (point)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1425 (printers (read (current-buffer)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1426 (n2 (char-after (point)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1427 (def-printer (read (current-buffer)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1428 (n3 (char-after (point)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1429 (head-row (read (current-buffer)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1430 (n4 (char-after (point))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1431 (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
1432 (= n1 ?\n)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1433 (eq (car-safe printers) 'ses-column-printers)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1434 (= n2 ?\n)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1435 (eq (car-safe def-printer) 'ses-default-printer)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1436 (= n3 ?\n)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1437 (eq (car-safe head-row) 'ses-header-row)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1438 (= n4 ?\n))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1439 (error "Invalid SES global parameters"))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1440 (1value (eval widths))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1441 (1value (eval def-printer))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1442 (1value (eval printers))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1443 (1value (eval head-row)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1444 ;;Should be back at global-params
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1445 (forward-char 1)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1446 (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
1447 ses-initial-global-parameters))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1448 (error "Problem with column-defs or global-params"))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1449 ;;Check for overall newline count in definitions area
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1450 (forward-line 3)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1451 (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
1452 (ses-goto-data 'ses--numrows)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1453 (or (= (point) start)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1454 (error "Extraneous newlines someplace?"))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1455
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1456 (defun ses-setup ()
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1457 "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
1458
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1459 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
1460 `intangible' properties. Sets up highlighting for current cell."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1461 (interactive)
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1462 (let ((end (point-min))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1463 (inhibit-read-only t)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1464 (was-modified (buffer-modified-p))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1465 pos sym)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1466 (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
1467 (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
1468 (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
1469 ;;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
1470 ;;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
1471 (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
1472 (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
1473 ;;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
1474 ;;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
1475 (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
1476 ;;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
1477 ;;came from.
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1478 (ses-dotimes-msg (row ses--numrows) "Finding cells..."
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1479 (dotimes (col ses--numcols)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1480 (setq pos end
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1481 sym (ses-cell-symbol row col))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1482 ;;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
1483 (while (and (< col (1- ses--numcols))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1484 (eq (ses-cell-value row (1+ col)) '*skip*))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1485 (setq end (+ end (ses-col-width col) 1)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1486 col (1+ col)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1487 (setq end (+ end (ses-col-width col) 1))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1488 (put-text-property pos end 'intangible sym)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1489 ;;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
1490 (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
1491 (restore-buffer-modified-p nil)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1492 (buffer-disable-undo)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1493 (buffer-enable-undo)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1494 ;;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
1495 ;;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
1496 (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
1497 (overlay-put ses--curcell-overlay 'face 'underline))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1498
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1499 (defun ses-cleanup ()
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1500 "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
1501 overlay, remove special text properties."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1502 (widen)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1503 (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
1504 (was-modified (buffer-modified-p)))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1505 ;;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
1506 (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
1507 ;;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
1508 (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
1509 (unless was-modified
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1510 (set-buffer-modified-p nil))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1511
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1512 ;;;###autoload
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1513 (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
1514 "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
1515 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
1516
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1517 Key definitions:
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1518 \\{ses-mode-map}
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1519 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
1520 \\{ses-mode-print-map}
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1521 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
1522 \\{ses-mode-edit-map}"
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1523 (interactive)
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1524 (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
1525 (eq ses--deferred-narrow 'ses-mode))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1526 (kill-all-local-variables)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1527 (mapc 'make-local-variable ses-localvars)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1528 (setq major-mode 'ses-mode
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1529 mode-name "SES"
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1530 next-line-add-newlines nil
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1531 truncate-lines t
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1532 ;;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
1533 show-trailing-whitespace nil
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1534 ;;Cell ranges do not work reasonably without this
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1535 transient-mark-mode t)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1536 (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
1537 (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
1538 (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
1539 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
1540 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
1541 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
1542 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
1543 (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
1544 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
1545 ;;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
1546 ;;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
1547 ;;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
1548 (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
1549 (window-hscroll))
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1550 (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
1551 ses--header-string)))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1552 (let ((was-empty (zerop (buffer-size)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1553 (was-modified (buffer-modified-p)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1554 (save-excursion
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1555 (if was-empty
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1556 ;;Initialize buffer to contain one cell, for now
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1557 (insert ses-initial-file-contents))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1558 (ses-load)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1559 (ses-setup))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1560 (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
1561 (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
1562 (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
1563 (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
1564 (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
1565 (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
1566 (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
1567 (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
1568 (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
1569 (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
1570 (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
1571 (restore-buffer-modified-p was-modified)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1572 (buffer-disable-undo)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1573 (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
1574 (goto-char (point-min))))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1575 (use-local-map ses-mode-map)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1576 ;;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
1577 ;;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
1578 ;;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
1579 ;;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
1580 ;;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
1581 ;;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
1582 (setq ses--deferred-narrow 'ses-mode)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1583 (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
1584 (run-with-idle-timer 0.01 nil 'ses-command-hook)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1585 (run-hooks 'ses-mode-hook)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1586
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1587 (put 'ses-mode 'mode-class 'special)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1588
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1589 (defun ses-command-hook ()
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1590 "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
1591 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
1592 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
1593 narrows the buffer now."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1594 (condition-case err
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1595 (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
1596 (when ses--deferred-recalc
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1597 ;;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
1598 ;;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
1599 (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
1600 (setq ses--deferred-recalc nil)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1601 (ses-update-cells old)))
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1602 (if ses--deferred-write
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1603 ;;We don't reset the deferred list before starting -- the most
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1604 ;;likely error is keyboard-quit, and we do want to keep trying
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1605 ;;these writes after a quit.
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1606 (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
1607 (when ses--deferred-narrow
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1608 ;;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
1609 ;;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
1610 ;;do the narrowing.
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1611 (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
1612 (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
1613 (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
1614 (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
1615 (setq ses--deferred-narrow nil))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1616 ;;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
1617 (let ((oldcell ses--curcell))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1618 (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
1619 (unless (eq ses--curcell oldcell)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1620 (cond
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1621 ((not ses--curcell)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1622 (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
1623 ((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
1624 (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
1625 (symbol-name ses--curcell))))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1626 (t
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1627 (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
1628 (symbol-name (car ses--curcell))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1629 "-"
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1630 (symbol-name (cdr ses--curcell))))))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1631 (force-mode-line-update)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1632 ;;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
1633 (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
1634 (move-overlay ses--curcell-overlay 2 2)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1635 (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
1636 (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
1637 (when (not (pos-visible-in-window-p))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1638 ;;Scrolling will happen later
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1639 (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
1640 (setq ses--curcell t)))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1641 ;;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
1642 (error
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1643 (unless executing-kbd-macro
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1644 (ding))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1645 (message (error-message-string err))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1646 nil) ;Make coverage-tester happy
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1647
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1648 (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
1649 "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
1650 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
1651 (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
1652 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
1653 ;;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
1654 (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
1655 (dotimes (col ses--numcols)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1656 (setq width (ses-col-width col)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1657 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
1658 (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
1659 ;;Scrolled so intercolumn space is leftmost
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1660 (push " " result))
58409
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
1661 (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
1662 (if (> ses--header-row 0)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1663 (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
1664 (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
1665 (setq x (buffer-substring-no-properties (point)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1666 (+ (point) width)))
58409
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
1667 ;; Strip trailing space.
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
1668 (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
1669 (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
1670 ;; 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
1671 (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
1672 (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
1673 (setq x (ses-column-letter col)))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1674 (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
1675 (push (propertize "."
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1676 'display `((space :align-to ,(1- totwidth)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1677 '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
1678 result)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1679 ;;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
1680 ;;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
1681 (push (1value (propertize " " 'display `((space :align-to ,totwidth))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1682 result)))
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1683 (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
1684 (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
1685 'display '((height (- 1))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1686 result))
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1687 (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
1688
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1689
58409
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
1690 ;;----------------------------------------------------------------------------
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
1691 ;; Redisplay and recalculation
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
1692 ;;----------------------------------------------------------------------------
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1693
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1694 (defun ses-jump (sym)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1695 "Move point to cell SYM."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1696 (interactive "SJump to cell: ")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1697 (let ((rowcol (ses-sym-rowcol sym)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1698 (or rowcol (error "Invalid cell name"))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1699 (if (eq (symbol-value sym) '*skip*)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1700 (error "Cell is covered by preceding cell"))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1701 (ses-goto-print (car rowcol) (cdr rowcol))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1702
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1703 (defun ses-jump-safe (cell)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1704 "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
1705 (condition-case nil
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1706 (ses-jump cell)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1707 (error)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1708
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1709 (defun ses-reprint-all (&optional nonarrow)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1710 "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
1711 print area if NONARROW is nil."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1712 (interactive "*P")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1713 (widen)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1714 (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
1715 (setq ses--deferred-narrow t))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1716 (let ((startcell (get-text-property (point) 'intangible))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1717 (inhibit-read-only t))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1718 (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
1719 (goto-char (point-min))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1720 (search-forward ses-print-data-boundary)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1721 (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
1722 (delete-region (point-min) (point))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1723 ;;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
1724 ;;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
1725 (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
1726 (insert-and-inherit ses--blank-line))
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1727 (ses-dotimes-msg (row ses--numrows) "Reprinting..."
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1728 (if (eq (ses-cell-value row 0) '*skip*)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1729 ;;Column deletion left a dangling skip
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1730 (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
1731 (dotimes (col ses--numcols)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1732 (ses-print-cell row col))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1733 (beginning-of-line 2))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1734 (ses-jump-safe startcell)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1735
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1736 (defun ses-recalculate-cell ()
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1737 "Recalculate and reprint the current cell or range.
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1738
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1739 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
1740 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
1741 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
1742 to are recalculated first."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1743 (interactive "*")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1744 (ses-check-curcell 'range)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1745 (ses-begin-change)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1746 (let (sig)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1747 (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
1748 (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
1749 (setq sig (ses-sym-rowcol ses--curcell)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1750 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
1751 ;;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
1752 ;;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
1753 (ses-dorange ses--curcell
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1754 (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
1755 (condition-case nil
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1756 (progn
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1757 ;;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
1758 ;;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
1759 (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
1760 (setq sig (ses-calculate-cell row col t)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1761 (wrong-type-argument
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1762 ;;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
1763 (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
1764 ;;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
1765 (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
1766 (setq ses--deferred-recalc nil)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1767 (condition-case hold
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1768 (ses-update-cells x t)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1769 (error (setq sig hold))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1770 (cond
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1771 (sig
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1772 (message (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
1773 ((consp ses--curcell)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1774 (message " "))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1775 (t
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1776 (princ (symbol-value ses--curcell))))))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1777
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1778 (defun ses-recalculate-all ()
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1779 "Recalculate and reprint all cells."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1780 (interactive "*")
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1781 (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
1782 (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
1783 (1- ses--numcols)))))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1784 (ses-recalculate-cell)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1785 (ses-jump-safe startcell)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1786
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1787 (defun ses-truncate-cell ()
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1788 "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
1789 cells."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1790 (interactive "*")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1791 (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
1792 (let* ((rowcol (ses-sym-rowcol ses--curcell))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1793 (row (car rowcol))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1794 (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
1795 (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
1796 (eq (ses-cell-value row (1+ col)) '*skip*))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1797 ;;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
1798 ;;cell has a `t' in it.
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1799 (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
1800 (ses-print-cell row col)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1801 ;;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
1802 (ses-set-cell row (1+ col) 'value nil)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1803 (1value (ses-print-cell row (1+ col))))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1804
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1805 (defun ses-reconstruct-all ()
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1806 "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
1807 (interactive "*")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1808 (ses-begin-change)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1809 ;;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
1810 (let (x yrow ycol)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1811 ;;Delete old reference lists
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1812 (ses-dotimes-msg (row ses--numrows) "Deleting references..."
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1813 (dotimes (col ses--numcols)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1814 (ses-set-cell row col 'references nil)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1815 ;;Create new reference lists
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1816 (ses-dotimes-msg (row ses--numrows) "Computing references..."
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1817 (dotimes (col ses--numcols)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1818 (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
1819 (setq x (ses-sym-rowcol ref)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1820 yrow (car x)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1821 ycol (cdr x))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1822 (ses-set-cell yrow ycol 'references
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1823 (cons (ses-cell-symbol row col)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1824 (ses-cell-references yrow ycol)))))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1825 ;;Delete everything and reconstruct basic data area
58409
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
1826 (if (ses-narrowed-p)
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1827 (setq ses--deferred-narrow t))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1828 (widen)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1829 (let ((inhibit-read-only t))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1830 (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
1831 (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
1832 (delete-region (point-min) (point))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1833 ;;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
1834 (delete-region (point-min) (point-max))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1835 (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
1836 (goto-char (point-min)))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1837 ;;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
1838 (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
1839 (insert ses--blank-line))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1840 (insert ses-print-data-boundary)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1841 ;;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
1842 (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
1843 ;;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
1844 (insert "\n\n\n\n")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1845 (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
1846 (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
1847 (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
1848 (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
1849 (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
1850 (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
1851 (ses-set-parameter 'ses--numcols ses--numcols)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1852 ;;Keep our old narrowing
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1853 (ses-setup)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1854 (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
1855 (goto-char (point-min)))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1856
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1857
58409
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
1858 ;;----------------------------------------------------------------------------
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
1859 ;; 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
1860 ;;----------------------------------------------------------------------------
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1861
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1862 (defun ses-edit-cell (row col newval)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1863 "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
1864 cell formula was unsafe and user declined confirmation."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1865 (interactive
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1866 (progn
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1867 (barf-if-buffer-read-only)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1868 (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
1869 (let* ((rowcol (ses-sym-rowcol ses--curcell))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1870 (row (car rowcol))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1871 (col (cdr rowcol))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1872 (formula (ses-cell-formula row col))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1873 initial)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1874 (if (eq (car-safe formula) 'ses-safe-formula)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1875 (setq formula (cadr formula)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1876 (if (eq (car-safe formula) 'quote)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1877 (setq initial (format "'%S" (cadr formula)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1878 (setq initial (prin1-to-string formula)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1879 (if (stringp formula)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1880 ;;Position cursor inside close-quote
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1881 (setq initial (cons initial (length initial))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1882 (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
1883 (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
1884 initial
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1885 ses-mode-edit-map
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1886 t ;Convert to Lisp object
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1887 'ses-read-cell-history)))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1888 (when (ses-warn-unsafe newval 'unsafep)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1889 (ses-begin-change)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1890 (ses-cell-set-formula row col newval)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1891 t))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1892
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1893 (defun ses-read-cell (row col newval)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1894 "Self-insert for initial character of cell function."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1895 (interactive
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1896 (let ((initial (this-command-keys))
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1897 (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
1898 (barf-if-buffer-read-only)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1899 (if (string= initial "\"")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1900 (setq initial "\"\"") ;Enter a string
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1901 (if (string= initial "(")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1902 (setq initial "()"))) ;Enter a formula list
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1903 (list (car rowcol)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1904 (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
1905 (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
1906 (cons initial 2)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1907 ses-mode-edit-map
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1908 t ;Convert to Lisp object
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1909 'ses-read-cell-history))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1910 (when (ses-edit-cell row col newval)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1911 (ses-command-hook) ;Update cell widths before movement
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1912 (dolist (x ses-after-entry-functions)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1913 (funcall x 1))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1914
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1915 (defun ses-read-symbol (row col symb)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1916 "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
1917 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
1918 (interactive
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
1919 (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
1920 newval)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1921 (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
1922 (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
1923 ses--symbolic-formulas))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1924 (list (car rowcol)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1925 (cdr rowcol)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1926 (if (string= newval "")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1927 nil ;Don't create zero-length symbols!
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1928 (list 'quote (intern newval))))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1929 (when (ses-edit-cell row col symb)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1930 (ses-command-hook) ;Update cell widths before movement
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1931 (dolist (x ses-after-entry-functions)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1932 (funcall x 1))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1933
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1934 (defun ses-clear-cell-forward (count)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1935 "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
1936 With prefix, deletes several cells."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1937 (interactive "*p")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1938 (if (< count 0)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1939 (1value (ses-clear-cell-backward (- count)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1940 (ses-check-curcell)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1941 (ses-begin-change)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1942 (dotimes (x count)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1943 (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
1944 (let ((rowcol (ses-sym-rowcol ses--curcell)))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1945 (or rowcol (signal 'end-of-buffer nil))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1946 (ses-clear-cell (car rowcol) (cdr rowcol)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1947 (forward-char 1))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1948
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1949 (defun ses-clear-cell-backward (count)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1950 "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
1951 cells."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1952 (interactive "*p")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1953 (if (< count 0)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1954 (1value (ses-clear-cell-forward (- count)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1955 (ses-check-curcell 'end)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1956 (ses-begin-change)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1957 (dotimes (x count)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1958 (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
1959 (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
1960 (let ((rowcol (ses-sym-rowcol ses--curcell)))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1961 (ses-clear-cell (car rowcol) (cdr rowcol))))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1962
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1963
58409
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
1964 ;;----------------------------------------------------------------------------
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
1965 ;; 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
1966 ;;----------------------------------------------------------------------------
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1967
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1968 (defun ses-read-printer (prompt default)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1969 "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
1970 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
1971 (barf-if-buffer-read-only)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1972 (if (eq default t)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1973 (setq default "")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1974 (setq prompt (format "%s [currently %S]: "
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1975 (substring prompt 0 -2)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1976 default)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1977 (let ((new (read-from-minibuffer prompt
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1978 nil ;Initial contents
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1979 ses-mode-edit-map
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1980 t ;Evaluate the result
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1981 'ses-read-printer-history
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1982 (prin1-to-string default))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1983 (if (equal new default)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1984 ;;User changed mind, decided not to change printer
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1985 (setq new t)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1986 (ses-printer-validate new)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1987 (or (not new)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1988 (stringp new)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1989 (stringp (car-safe new))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1990 (ses-warn-unsafe new 'unsafep-function)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1991 (setq new t)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1992 new))
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-cell-printer (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 cell or range.
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1996
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
1997 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
1998 %-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
1999 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
2000 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
2001 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
2002 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
2003 (interactive
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2004 (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
2005 x)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2006 (ses-check-curcell 'range)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2007 ;;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
2008 (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
2009 (ses-dorange ses--curcell
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2010 (setq x (ses-cell-printer row col))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2011 (if (eq (car-safe x) 'ses-safe-printer)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2012 (setq x (cadr x)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2013 (if (eq default t)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2014 (setq default x)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2015 (unless (equal default x)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2016 ;;Range contains differing printer functions
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2017 (setq default t)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2018 (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
2019 (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
2020 default))))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2021 (unless (eq newval t)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2022 (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
2023 (ses-dorange ses--curcell
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2024 (ses-set-cell row col 'printer newval)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2025 (ses-print-cell row col))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2026
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2027 (defun ses-read-column-printer (col newval)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2028 "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
2029 `ses-read-cell-printer' for input forms."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2030 (interactive
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2031 (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
2032 (ses-check-curcell)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2033 (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
2034 (ses-column-letter col))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2035 (ses-col-printer col)))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2036
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2037 (unless (eq newval t)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2038 (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
2039 (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
2040 (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
2041 (dotimes (row ses--numrows)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2042 (ses-print-cell row col)))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2043
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2044 (defun ses-read-default-printer (newval)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2045 "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
2046 `ses-read-cell-printer' for input forms."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2047 (interactive
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2048 (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
2049 (unless (eq newval t)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2050 (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
2051 (ses-set-parameter 'ses--default-printer newval)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2052 (ses-reprint-all t)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2053
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2054
58409
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
2055 ;;----------------------------------------------------------------------------
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
2056 ;; Spreadsheet size adjustments
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
2057 ;;----------------------------------------------------------------------------
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2058
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2059 (defun ses-insert-row (count)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2060 "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
2061 before current one."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2062 (interactive "*p")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2063 (ses-check-curcell 'end)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2064 (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
2065 (ses-begin-change)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2066 (let ((inhibit-quit t)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2067 (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
2068 (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
2069 newrow)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2070 ;;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
2071 (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
2072 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
2073 (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
2074 ;;Insert each row
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2075 (ses-goto-print row 0)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2076 (ses-dotimes-msg (x count) "Inserting row..."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2077 ;;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
2078 ;;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
2079 (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
2080 (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
2081 (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
2082 (setq ses--cells (ses-vector-insert ses--cells row newrow))
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2083 (push `(ses-vector-delete ses--cells ,row 1) buffer-undo-list)
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2084 (insert ses--blank-line))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2085 ;;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
2086 ;;ses-relocate-all)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2087 (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
2088 (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
2089 (ses-relocate-all row 0 count 0)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2090 ;;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
2091 ;;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
2092 (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
2093 (global (ses-call-printer ses--default-printer)))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2094 (if (or (> (length cols) 0) (> (length global) 0))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2095 (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
2096 (dotimes (col ses--numcols)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2097 ;;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
2098 (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
2099 (when (> ses--header-row row)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2100 ;;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
2101 (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
2102 (ses-reset-header-string)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2103 ;;Reconstruct text attributes
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2104 (ses-setup)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2105 ;;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
2106 (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
2107 (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
2108 (ses-goto-print (1- ses--numrows) 0)))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2109
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2110 (defun ses-delete-row (count)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2111 "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
2112 current one."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2113 (interactive "*p")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2114 (ses-check-curcell)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2115 (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
2116 (let ((inhibit-quit t)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2117 (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
2118 (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
2119 (setq count (min count (- ses--numrows row)))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2120 (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
2121 (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
2122 ;;Delete lines from print area
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2123 (ses-goto-print row 0)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2124 (ses-delete-line count)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2125 ;;Delete lines from cell data area
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2126 (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
2127 (ses-delete-line (* count (1+ ses--numcols)))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2128 ;;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
2129 (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
2130 (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
2131 (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
2132 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
2133 (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
2134 (if (<= ses--header-row (+ row count))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2135 ;;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
2136 (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
2137 (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
2138 (ses-reset-header-string)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2139 ;;Reconstruct attributes
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2140 (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
2141 (ses-jump-safe ses--curcell))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2142
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2143 (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
2144 "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
2145 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
2146 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
2147 \(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
2148 (interactive "*p")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2149 (ses-check-curcell)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2150 (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
2151 (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
2152 (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
2153 width (ses-col-width col)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2154 printer (ses-col-printer col)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2155 (ses-begin-change)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2156 (let ((inhibit-quit t)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2157 (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
2158 (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
2159 (printers ses--col-printers)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2160 has-skip)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2161 ;;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
2162 (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
2163 ses--numcols (+ ses--numcols count -1))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2164 ;;Insert each column.
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2165 (ses-dotimes-msg (x count) "Inserting column..."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2166 ;;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
2167 ;;the call to ses-relocate-all.
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2168 (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
2169 (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
2170 (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
2171 (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
2172 ;;Inserting in the middle of a spill-over
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2173 (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
2174 (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
2175 (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
2176 col (ses-make-cell)))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2177 ;;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
2178 ;;ses-relocate-all)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2179 (ses-goto-data row col)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2180 (insert ?\n))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2181 ;;Insert column width and printer
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2182 (setq widths (ses-vector-insert widths col width)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2183 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
2184 (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
2185 (ses-set-parameter 'ses--col-printers printers)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2186 (ses-reset-header-string)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2187 (ses-relocate-all 0 col 0 count)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2188 (if has-skip
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2189 (ses-reprint-all t)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2190 (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
2191 (> (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
2192 ;;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
2193 ;;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
2194 (dotimes (x ses--numrows)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2195 (dotimes (y count)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2196 ;Always nil here - this is a blank column
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2197 (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
2198 (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
2199 (ses-jump-safe ses--curcell))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2200
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2201 (defun ses-delete-column (count)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2202 "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
2203 from the current one."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2204 (interactive "*p")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2205 (ses-check-curcell)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2206 (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
2207 (let ((inhibit-quit t)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2208 (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
2209 (rowcol (ses-sym-rowcol ses--curcell))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2210 (width 0)
58409
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
2211 col origrow has-skip)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2212 (setq origrow (car rowcol)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2213 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
2214 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
2215 (if (= count ses--numcols)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2216 (error "Can't delete all columns!"))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2217 ;;Determine width of column(s) being deleted
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2218 (dotimes (x count)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2219 (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
2220 (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
2221 (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
2222 (ses-adjust-print-width col (- width))
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2223 (ses-dotimes-msg (row ses--numrows) "Deleting column..."
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2224 ;;Delete lines from cell data area
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2225 (ses-goto-data row col)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2226 (ses-delete-line count)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2227 ;;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
2228 (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
2229 (and (< col ses--numcols)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2230 (eq (ses-cell-value row (+ col count)) '*skip*)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2231 (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
2232 (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
2233 (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
2234 ;;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
2235 (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
2236 (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
2237 (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
2238 (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
2239 (ses-reset-header-string)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2240 ;;Relocate variables and formulas
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2241 (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
2242 (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
2243 ses--numcols (+ ses--numcols count -1))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2244 (if has-skip
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2245 (ses-reprint-all t)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2246 (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
2247 (if (>= col ses--numcols)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2248 (setq col (1- col)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2249 (ses-goto-print origrow col)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2250
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2251 (defun ses-forward-or-insert (&optional count)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2252 "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
2253 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
2254 (interactive "p")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2255 (ses-check-curcell 'end)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2256 (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
2257 (dotimes (x count)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2258 (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
2259 (if (not ses--curcell)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2260 (progn ;At bottom of print area
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2261 (barf-if-buffer-read-only)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2262 (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
2263 (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
2264 (when (/= 32
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2265 (char-before (next-single-property-change (point)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2266 'intangible)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2267 ;;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
2268 ;;new column.
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2269 (barf-if-buffer-read-only)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2270 (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
2271 ses--numcols
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2272 (ses-col-width col)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2273 (ses-col-printer col)))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2274 (forward-char)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2275
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2276 (defun ses-append-row-jump-first-column ()
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2277 "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
2278 (interactive "*")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2279 (ses-check-curcell)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2280 (ses-begin-change)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2281 (beginning-of-line 2)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2282 (ses-set-curcell)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2283 (ses-insert-row 1))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2284
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2285 (defun ses-set-column-width (col newwidth)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2286 "Set the width of the current column."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2287 (interactive
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2288 (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
2289 (barf-if-buffer-read-only)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2290 (list col
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2291 (if current-prefix-arg
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2292 (prefix-numeric-value current-prefix-arg)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2293 (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
2294 (ses-column-letter col)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2295 (ses-col-width col))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2296 nil ;No initial contents
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2297 nil ;No override keymap
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2298 t ;Convert to Lisp object
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2299 nil ;No history
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2300 (number-to-string
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2301 (ses-col-width col))))))) ;Default value
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2302 (if (< newwidth 1)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2303 (error "Invalid column width"))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2304 (ses-begin-change)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2305 (ses-reset-header-string)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2306 (save-excursion
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2307 (let ((inhibit-quit t))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2308 (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
2309 (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
2310 (dotimes (row ses--numrows)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2311 (ses-print-cell-new-width row col))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2312
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2313
58409
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
2314 ;;----------------------------------------------------------------------------
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
2315 ;; 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
2316 ;;----------------------------------------------------------------------------
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2317
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2318 (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
2319 activate preactivate)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2320 "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
2321 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
2322 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
2323
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2324 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
2325 hard to override how mouse-1 works."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2326 (when (> beg end)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2327 (let ((temp beg))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2328 (setq beg end
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2329 end temp)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2330 (if (not (and (eq major-mode 'ses-mode)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2331 (eq (get-text-property beg 'read-only) 'ses)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2332 (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
2333 ad-do-it ;Normal copy-region-as-kill
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2334 (kill-new (ses-copy-region beg end))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2335
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2336 (defun ses-copy-region (beg end)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2337 "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
2338 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
2339 (let* ((inhibit-point-motion-hooks t)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2340 (x (mapconcat 'ses-copy-region-helper
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2341 (extract-rectangle beg (1- end)) "\n")))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2342 (remove-text-properties 0 (length x)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2343 '(read-only t
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2344 intangible t
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2345 keymap t
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2346 front-sticky t)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2347 x)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2348 x))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2349
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2350 (defun ses-copy-region-helper (line)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2351 "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
2352 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
2353 the corresponding data cell."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2354 (or (> (length line) 1)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2355 (error "Empty range"))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2356 (let ((inhibit-read-only t)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2357 (pos 0)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2358 mycell next sym rowcol)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2359 (while pos
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2360 (setq sym (get-text-property pos 'intangible line)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2361 next (next-single-property-change pos 'intangible line)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2362 rowcol (ses-sym-rowcol sym)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2363 mycell (ses-get-cell (car rowcol) (cdr rowcol)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2364 (put-text-property pos (or next (length line))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2365 'ses
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2366 (list (ses-cell-symbol mycell)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2367 (ses-cell-formula mycell)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2368 (ses-cell-printer mycell))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2369 line)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2370 (setq pos next)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2371 line)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2372
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2373 (defun ses-kill-override (beg end)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2374 "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
2375 cells instead of deleting them."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2376 (interactive "r")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2377 (ses-check-curcell 'needrange)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2378 ;;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
2379 ;;`delete-region', so we have to use subterfuge.
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2380 (let ((buffer-read-only t))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2381 (1value (condition-case x
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2382 (noreturn (funcall (lookup-key (current-global-map)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2383 (this-command-keys))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2384 beg end))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2385 (buffer-read-only nil)))) ;The expected error
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2386 ;;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
2387 ;;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
2388 ;;check whether the buffer really is read-only.
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2389 (barf-if-buffer-read-only)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2390 (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
2391 (ses-dorange ses--curcell
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2392 (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
2393 (ses-jump (car ses--curcell)))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2394
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2395 (defadvice yank (around ses-yank activate preactivate)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2396 "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
2397
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2398 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
2399 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
2400 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
2401 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
2402
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2403 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
2404 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
2405 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
2406 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
2407 formulas refer to cells outsite the yanked text.
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2408
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2409 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
2410 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
2411 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
2412 as symbols."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2413 (if (not (and (eq major-mode 'ses-mode)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2414 (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
2415 ad-do-it ;Normal non-SES yank
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2416 (ses-check-curcell 'end)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2417 (push-mark (point))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2418 (let ((text (current-kill (cond
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2419 ((listp arg) 0)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2420 ((eq arg '-) -1)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2421 (t (1- arg))))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2422 (or (ses-yank-cells text arg)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2423 (ses-yank-tsf text arg)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2424 (ses-yank-one (ses-yank-resize 1 1)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2425 text
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2426 0
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2427 (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
2428 ;;Just one cell - delete final tab or newline
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2429 (1- (length text)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2430 arg)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2431 (if (consp arg)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2432 (exchange-point-and-mark))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2433
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2434 (defun ses-yank-pop (arg)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2435 "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
2436 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
2437 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
2438 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
2439 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
2440 previous insertion."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2441 (interactive "*p")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2442 (or (eq last-command 'yank)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2443 ;;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
2444 ;;macro definition.
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2445 (noreturn (error "Previous command was not a yank")))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2446 (undo)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2447 (ses-set-curcell)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2448 (yank (1+ (or arg 1)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2449 (setq this-command 'yank))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2450
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2451 (defun ses-yank-cells (text arg)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2452 "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
2453 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
2454 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
2455 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
2456 formulas are to be inserted without relocation."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2457 (let ((first (get-text-property 0 'ses text))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2458 (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
2459 (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
2460 (setq first (ses-sym-rowcol (car first))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2461 last (ses-sym-rowcol (car last)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2462 (let* ((needrows (- (car last) (car first) -1))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2463 (needcols (- (cdr last) (cdr first) -1))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2464 (rowcol (ses-yank-resize needrows needcols))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2465 (rowincr (- (car rowcol) (car first)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2466 (colincr (- (cdr rowcol) (cdr first)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2467 (pos 0)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2468 myrow mycol x)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2469 (ses-dotimes-msg (row needrows) "Yanking..."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2470 (setq myrow (+ row (car rowcol)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2471 (dotimes (col needcols)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2472 (setq mycol (+ col (cdr rowcol))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2473 last (get-text-property pos 'ses text)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2474 pos (next-single-property-change pos 'ses text)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2475 x (ses-sym-rowcol (car last)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2476 (if (not last)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2477 ;;Newline - all remaining cells on row are skipped
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2478 (setq x (cons (- myrow rowincr) (+ needcols colincr -1))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2479 last (list nil nil nil)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2480 pos (1- pos)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2481 (if (/= (car x) (- myrow rowincr))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2482 (error "Cell row error"))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2483 (if (< (- mycol colincr) (cdr x))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2484 ;;Some columns were skipped
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2485 (let ((oldcol mycol))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2486 (while (< (- mycol colincr) (cdr x))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2487 (ses-clear-cell myrow mycol)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2488 (setq col (1+ col)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2489 mycol (1+ mycol)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2490 (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
2491 (when (car last) ;Skip this for *skip* cells
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2492 (setq x (nth 2 last))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2493 (unless (equal x (ses-cell-printer myrow mycol))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2494 (or (not x)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2495 (stringp x)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2496 (eq (car-safe x) 'ses-safe-printer)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2497 (setq x `(ses-safe-printer ,x)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2498 (ses-set-cell myrow mycol 'printer x))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2499 (setq x (cadr last))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2500 (if (atom arg)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2501 (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
2502 (or (atom x)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2503 (eq (car-safe x) 'ses-safe-formula)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2504 (setq x `(ses-safe-formula ,x)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2505 (ses-cell-set-formula myrow mycol x)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2506 (when pos
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2507 (if (get-text-property pos 'ses text)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2508 (error "Missing newline between rows"))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2509 (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
2510 t))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2511
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2512 (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
2513 "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
2514 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
2515 (let ((val (condition-case nil
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2516 (read-from-string text from to)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2517 (error (cons nil from)))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2518 (cond
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2519 ((< (cdr val) (or to (length text)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2520 ;;Invalid sexp - leave it as a string
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2521 (setq val (substring text from to)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2522 ((and (car val) (symbolp (car val)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2523 (if (consp arg)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2524 (setq val (list 'quote (car val))) ;Keep symbol
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2525 (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
2526 (t
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2527 (setq val (car val))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2528 (let ((row (car rowcol))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2529 (col (cdr rowcol)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2530 (or (atom val)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2531 (setq val `(ses-safe-formula ,val)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2532 (ses-cell-set-formula row col val))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2533
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2534 (defun ses-yank-tsf (text arg)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2535 "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
2536 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
2537 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
2538 is a list. Ignore a final newline."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2539 (if (or (not (string-match "[\t\n]" text))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2540 (= (match-end 0) (length text)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2541 ;;Not TSF format
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2542 nil
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2543 (if (/= (aref text (1- (length text))) ?\n)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2544 (setq text (concat text "\n")))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2545 (let ((pos -1)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2546 (spots (list -1))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2547 (cols 0)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2548 (needrows 0)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2549 needcols rowcol)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2550 ;;Find all the tabs and newlines
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2551 (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
2552 (push pos spots)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2553 (setq cols (1+ cols))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2554 (when (eq (aref text pos) ?\n)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2555 (if (not needcols)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2556 (setq needcols cols)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2557 (or (= needcols cols)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2558 (error "Inconsistent row lengths")))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2559 (setq cols 0
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2560 needrows (1+ needrows))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2561 ;;Insert the formulas
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2562 (setq rowcol (ses-yank-resize needrows needcols))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2563 (dotimes (row needrows)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2564 (dotimes (col needcols)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2565 (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
2566 (+ (cdr rowcol) needcols (- col) -1))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2567 text (1+ (cadr spots)) (car spots) arg)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2568 (setq spots (cdr spots))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2569 (ses-goto-print (+ (car rowcol) needrows -1)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2570 (+ (cdr rowcol) needcols -1))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2571 t)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2572
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2573 (defun ses-yank-resize (needrows needcols)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2574 "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
2575 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
2576 spot, or error signal if user requests cancel."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2577 (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
2578 (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
2579 (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
2580 (cons ses--numrows 0)))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2581 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
2582 (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
2583 needcols (- (+ (cdr rowcol) needcols) ses--numcols)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2584 rowbool (> needrows 0)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2585 colbool (> needcols 0))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2586 (when (or rowbool colbool)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2587 ;;Need to insert. Get confirm
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2588 (or (y-or-n-p (format "Yank will insert %s%s%s. Continue "
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2589 (if rowbool (format "%d rows" needrows) "")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2590 (if (and rowbool colbool) " and " "")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2591 (if colbool (format "%d columns" needcols) "")))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2592 (error "Cancelled"))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2593 (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
2594 (let (ses--curcell)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2595 (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
2596 (ses-goto-print ses--numrows 0)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2597 (ses-insert-row needrows))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2598 (when colbool
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2599 (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
2600 ses--numcols
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2601 (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
2602 (ses-col-printer (1- ses--numcols)))))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2603 rowcol))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2604
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2605 (defun ses-export-tsv (beg end)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2606 "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
2607 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
2608 (interactive "r")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2609 (ses-export-tab nil))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2610
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2611 (defun ses-export-tsf (beg end)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2612 "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
2613 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
2614 (interactive "r")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2615 (ses-export-tab t))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2616
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2617 (defun ses-export-tab (want-formulas)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2618 "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
2619 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
2620 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
2621 (ses-check-curcell 'needrange)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2622 (let ((print-escape-newlines t)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2623 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
2624 (ses-dorange ses--curcell
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2625 (setq item (if want-formulas
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2626 (ses-cell-formula row col)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2627 (ses-cell-value row col)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2628 (if (eq (car-safe item) 'ses-safe-formula)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2629 ;;Hide our deferred safety-check marker
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2630 (setq item (cadr item)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2631 (if (or (not item) (eq item '*skip*))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2632 (setq item ""))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2633 (when (eq (car-safe item) 'quote)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2634 (push "'" result)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2635 (setq item (cadr item)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2636 (setq item (prin1-to-string item t))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2637 (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
2638 (push item result)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2639 (cond
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2640 ((< col maxcol)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2641 (push "\t" result))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2642 ((< row maxrow)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2643 (push "\n" result))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2644 (setq result (apply 'concat (nreverse result)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2645 (kill-new result)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2646
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2647
58409
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
2648 ;;----------------------------------------------------------------------------
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
2649 ;; Other user commands
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
2650 ;;----------------------------------------------------------------------------
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2651
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2652 (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
2653 "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
2654 (interactive)
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2655 (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
2656
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2657 (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
2658 "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
2659 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
2660 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
2661 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
2662 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
2663 (interactive
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2664 (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
2665 (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
2666 (if current-prefix-arg
54571
54265a0f59a7 (ses-read-number): Move to subr.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53944
diff changeset
2667 (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
2668 currow)))))
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2669 (if (or (< row 0) (> row ses--numrows))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2670 (error "Invalid header-row"))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2671 (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
2672 (ses-set-parameter 'ses--header-row row)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2673 (ses-reset-header-string))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2674
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2675 (defun ses-mark-row ()
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2676 "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
2677 (interactive)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2678 (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
2679 (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
2680 (push-mark (point))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2681 (ses-goto-print (1+ row) 0)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2682 (push-mark (point) nil t)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2683 (ses-goto-print row 0)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2684
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2685 (defun ses-mark-column ()
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2686 "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
2687 (interactive)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2688 (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
2689 (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
2690 (row 0))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2691 (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
2692 (ses-goto-print (1- ses--numrows) col)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2693 (forward-char 1)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2694 (push-mark (point) nil t)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2695 (while (eq '*skip* (ses-cell-value row col))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2696 ;;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
2697 (setq row (1+ row)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2698 (ses-goto-print row col)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2699
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2700 (defun ses-end-of-line ()
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2701 "Move point to last cell on line."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2702 (interactive)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2703 (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
2704 (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
2705 (let ((col (1- ses--numcols))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2706 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
2707 (if (symbolp ses--curcell)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2708 ;;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
2709 (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
2710 ;;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
2711 (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
2712 (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
2713 (cdr ses--curcell))))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2714 ;;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
2715 ;;in the following row
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2716 (if (<= (cdr rowcol) (1- col))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2717 (setq row (car rowcol))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2718 (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
2719 (if (= row ses--numrows)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2720 ;;Already at end - can't go anywhere
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2721 (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
2722 (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
2723 (while (eq (ses-cell-value row col) '*skip*)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2724 ;;Back to beginning of multi-column cell
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2725 (setq col (1- col)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2726 (ses-goto-print row col)))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2727
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2728 (defun ses-renarrow-buffer ()
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2729 "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
2730 (interactive)
53944
e647f66db84b Delete function ses-build-load-map and distribute its functions to
Jonathan Yavner <jyavner@member.fsf.org>
parents: 53758
diff changeset
2731 (setq ses--deferred-narrow t))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2732
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2733 (defun ses-sort-column (sorter &optional reverse)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2734 "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
2735 REVERSE order."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2736 (interactive "*sSort column: \nP")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2737 (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
2738 (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
2739 (max (ses-sym-rowcol (cdr ses--curcell))))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2740 (let ((minrow (car min))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2741 (mincol (cdr min))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2742 (maxrow (car max))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2743 (maxcol (cdr max))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2744 keys extracts end)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2745 (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
2746 (or (and sorter (>= sorter mincol) (<= sorter maxcol))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2747 (error "Invalid sort column"))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2748 ;;Get key columns and sort them
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2749 (dotimes (x (- maxrow minrow -1))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2750 (ses-goto-print (+ minrow x) sorter)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2751 (setq end (next-single-property-change (point) 'intangible))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2752 (push (cons (buffer-substring-no-properties (point) end)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2753 (+ minrow x))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2754 keys))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2755 (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
2756 ;;Extract the lines in reverse sorted order
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2757 (or reverse
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2758 (setq keys (nreverse keys)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2759 (dolist (x keys)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2760 (ses-goto-print (cdr x) (1+ maxcol))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2761 (setq end (point))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2762 (ses-goto-print (cdr x) mincol)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2763 (push (ses-copy-region (point) end) extracts))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2764 (deactivate-mark)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2765 ;;Paste the lines sequentially
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2766 (dotimes (x (- maxrow minrow -1))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2767 (ses-goto-print (+ minrow x) mincol)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2768 (ses-set-curcell)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2769 (ses-yank-cells (pop extracts) nil)))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2770
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2771 (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
2772 "Mouse version of `ses-sort-column'."
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2773 (interactive "*e\nP")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2774 (setq event (event-end event))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2775 (select-window (posn-window event))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2776 (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
2777 (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
2778 (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
2779 (setq event (- event (ses-col-width col) 1)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2780 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
2781 (if (>= col ses--numcols)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2782 (ding)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2783 (ses-sort-column (ses-column-letter col) reverse))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2784
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2785 (defun ses-insert-range ()
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2786 "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
2787 spreadsheet."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2788 (interactive "*")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2789 (let (x)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2790 (with-current-buffer (window-buffer minibuffer-scroll-window)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2791 (ses-command-hook) ;For ses-coverage
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2792 (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
2793 (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
2794 ,(cdr ses--curcell))))))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2795 (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
2796
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2797 (defun ses-insert-ses-range ()
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2798 "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
2799 highlighted range in the spreadsheet."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2800 (interactive "*")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2801 (let (x)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2802 (with-current-buffer (window-buffer minibuffer-scroll-window)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2803 (ses-command-hook) ;For ses-coverage
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2804 (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
2805 (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
2806 (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
2807 (cdr ses--curcell))))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2808 (insert x)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2809
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2810 (defun ses-insert-range-click (event)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2811 "Mouse version of `ses-insert-range'."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2812 (interactive "*e")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2813 (mouse-set-point event)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2814 (ses-insert-range))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2815
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2816 (defun ses-insert-ses-range-click (event)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2817 "Mouse version of `ses-insert-ses-range'."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2818 (interactive "*e")
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2819 (mouse-set-point event)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2820 (ses-insert-ses-range))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2821
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2822
58409
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
2823 ;;----------------------------------------------------------------------------
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
2824 ;; 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
2825 ;;----------------------------------------------------------------------------
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2826
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2827 (defun ses-safe-printer (printer)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2828 "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
2829 (if (or (stringp printer)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2830 (stringp (car-safe printer))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2831 (not printer)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2832 (ses-warn-unsafe printer 'unsafep-function))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2833 printer
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2834 'ses-unsafe))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2835
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2836 (defun ses-safe-formula (formula)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2837 "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
2838 (if (ses-warn-unsafe formula 'unsafep)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2839 formula
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2840 `(ses-unsafe ',formula)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2841
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2842 (defun ses-warn-unsafe (formula checker)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2843 "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
2844 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
2845 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
2846 `safe-functions' is t."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2847 (if (eq safe-functions t)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2848 t
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2849 (setq checker (funcall checker formula))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2850 (if (not checker)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2851 t
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2852 (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
2853 formula checker)))))
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
58409
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
2856 ;;----------------------------------------------------------------------------
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
2857 ;; Standard formulas
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
2858 ;;----------------------------------------------------------------------------
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2859
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2860 (defmacro ses-range (from to)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2861 "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
2862 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
2863 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
2864 alias for this macro!"
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2865 (let (result)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2866 (ses-dorange (cons from to)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2867 (push (ses-cell-symbol row col) result))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2868 (cons 'list result)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2869
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2870 (defun ses-delete-blanks (&rest args)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2871 "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
2872 (let (result)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2873 (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
2874 (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
2875 (push cur result)))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2876 result))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2877
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2878 (defun ses+ (&rest args)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2879 "Compute the sum of the arguments, ignoring blanks."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2880 (apply '+ (apply 'ses-delete-blanks args)))
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 (defun ses-average (list)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2883 "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
2884 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
2885 (setq list (apply 'ses-delete-blanks list))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2886 (/ (float (apply '+ list)) (length list)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2887
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2888 (defmacro ses-select (fromrange test torange)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2889 "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
2890 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
2891 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
2892 TEST is evaluated."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2893 (setq fromrange (cdr (macroexpand fromrange))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2894 torange (cdr (macroexpand torange))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2895 test (eval test))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2896 (or (= (length fromrange) (length torange))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2897 (error "ses-select: Ranges not same length"))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2898 (let (result)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2899 (dolist (x fromrange)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2900 (if (equal test (symbol-value x))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2901 (push (car torange) result))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2902 (setq torange (cdr torange)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2903 (cons 'list result)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2904
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2905 ;;All standard formulas are safe
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2906 (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
2907 (put x 'side-effect-free t))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2908
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2909
58409
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
2910 ;;----------------------------------------------------------------------------
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
2911 ;; Standard print functions
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
2912 ;;----------------------------------------------------------------------------
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2913
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2914 ;;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
2915 ;;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
2916 ;;compile-time to make the compiler happy.
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2917 (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
2918 (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
2919 (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
2920 (set x nil)))
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2921
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2922 (defun ses-center (value &optional span fill)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2923 "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
2924 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
2925 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
2926 (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
2927 (width (ses-col-width col))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2928 half)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2929 (or fill (setq fill ? ))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2930 (or span (setq span 0))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2931 (setq value (ses-call-printer printer value))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2932 (dotimes (x span)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2933 (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
2934 (setq width (- width (length value)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2935 (if (<= width 0)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2936 value ;Too large for field, anyway
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2937 (setq half (make-string (/ width 2) fill))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2938 (concat half value half
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2939 (if (> (% width 2) 0) (char-to-string fill))))))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2940
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2941 (defun ses-center-span (value &optional fill)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2942 "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
2943 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
2944 character (default = space)."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2945 (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
2946 (while (and (< end ses--numcols)
47667
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2947 (memq (ses-cell-value row end) '(nil *skip*)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2948 (setq end (1+ end)))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2949 (ses-center value (- end col 1) fill)))
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 (defun ses-dashfill (value &optional span)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2952 "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
2953 columns to include in width (default = 0)."
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2954 (ses-center value span ?-))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2955
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2956 (defun ses-dashfill-span (value)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2957 "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
2958 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
2959 (ses-center-span value ?-))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2960
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2961 (defun ses-tildefill-span (value)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2962 "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
2963 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
2964 (ses-center-span value ?~))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2965
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2966 (defun ses-unsafe (value)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2967 "Substitute for an unsafe formula or printer"
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2968 (error "Unsafe formula or printer"))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2969
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2970 ;;All standard printers are safe, including ses-unsafe!
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2971 (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
2972 (put x 'side-effect-free t))
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2973
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2974 (provide 'ses)
96b260e0ff3d New major mode "SES" for spreadsheets.
Jonathan Yavner <jyavner@member.fsf.org>
parents:
diff changeset
2975
58409
924fa48ab4bf Add coding cookie. Fix up docstrings, follow new commenting conventions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55366
diff changeset
2976 ;; 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
2977 ;;; ses.el ends here