annotate lisp/ses.el @ 81548:334bfc4cc092

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