1 /********************************************************************
2 This file is part of the abs 0.907 distribution. abs is a spreadsheet
3 with graphical user interface.
4
5 Copyright (C) 1998-2001 Andr� Bertin (Andre.Bertin@ping.be)
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version if in the same spirit as version 2.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20
21 Concact: abs@pi.be
22 http://home.pi.be/bertin/abs.shtml
23
24 *********************************************************************/
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51 #include "worksheet.h"
52 #include "workbook.h"
53 #include "memory.h"
54 #include "newplot.h"
55 #include "main.h"
56 #include "callback.h"
57
58 extern int setcursor (int r, int c);
59
60 #define CW worksheet_getcolw
61 #define RH worksheet_getrowh
62
63
64 Worksheet *ActiveWorksheet;
65 extern void setscrollvlimit (int vmin, int vmax);
66 extern void setscrollhlimit (int vmin, int vmax);
67 extern void setscrollv (double v);
68 extern void setscrollh (double v);
69 extern void setzoomlabel (int z);
70 extern int rebuild_thumb ();
71
72
73
74 static int nworksheet = 1;
75
76 Worksheet *
newworksheet()77 newworksheet ()
78 {
79
80 Worksheet *worksheet;
81 Worksheet *tmp = ActiveWorksheet;
82
83 if (ActiveWorkbook == NULL)
84 return NULL;
85
86 worksheet = (Worksheet *) absmalloc (sizeof (Worksheet), "newworksheet:worksheet ");
87
88 if (worksheet == NULL)
89 {
90 fprintf (stderr, "worksheet not allocated!");
91 return (Worksheet *) NULL;
92 };
93
94 ActiveWorksheet = worksheet;
95
96 worksheet->nblin = NB_LINE;
97 worksheet->nbcol = NB_COLUMN;
98
99 worksheet->lh = NULL;
100 worksheet->cw = NULL;
101 worksheet->lhdim = -1;
102 worksheet->cwdim = -1;
103
104 worksheet->ll = 1;
105 worksheet->cc = 1;
106 worksheet->nbcell = 0;
107 worksheet->nbgraph = 0;
108 worksheet->nbdrawing = 0;
109 worksheet->nbbutton = 0;
110 worksheet->zoom = 100;
111
112 worksheet->Graphs = NULL;
113 worksheet->Drawings = NULL;
114 worksheet->Buttons = NULL;
115
116 worksheet->selection = newselection ();
117
118 worksheet->defcell = newcell (-1, -1);
119 worksheet->defcell->worksheet = worksheet;
120
121 ActiveGraph = NULL;
122 ActiveDrawing = NULL;
123 ActiveButton = NULL;
124
125 worksheet->activegraph = NULL;
126 worksheet->activedrawing = NULL;
127 worksheet->activebutton = NULL;
128
129 ActiveSelection = worksheet->selection;
130
131
132 worksheet->objnum = nworksheet++;
133
134
135 worksheet->array = NULL;
136 worksheet->maxrow = -1;
137 worksheet->_maxcol = 0;
138 worksheet->maxcol = NULL;
139
140 worksheet->workbook = ActiveWorkbook;
141 worksheet->cur_r = 1;
142 worksheet->cur_c = 1;
143 ActiveCell = worksheet_getcell (worksheet, 1, 1, 1);
144 worksheet->activecell = ActiveCell;
145 worksheet_select_cell (ActiveWorksheet, ActiveCell);
146
147
148 ActiveWorksheet = tmp;
149 return worksheet;
150 }
151
152 int
freeworksheet(worksheet)153 freeworksheet (worksheet)
154 Worksheet *worksheet;
155 {
156 int i, j;
157
158 if (worksheet == NULL)
159 return 1;
160
161
162
163 if (ActiveWorksheet == worksheet)
164 {
165 for (i = 0; i < ActiveWorksheet->nbgraph; i++)
166 deletegraphpixmap (ActiveWorksheet->Graphs[i]);
167 ActiveWorksheet = NULL;
168 }
169
170
171 for (i = 0; i < worksheet->nbgraph; i++)
172 freegraph (worksheet->Graphs[i]);
173 for (i = 0; i < worksheet->nbdrawing; i++)
174 freedrawing (worksheet->Drawings[i]);
175 for (i = 0; i < worksheet->nbbutton; i++)
176 freebutton (worksheet->Buttons[i]);
177
178 freeselection (worksheet->selection);
179
180
181 for (i = 1; i <= worksheet->maxrow; i++)
182 {
183 for (j = 1; j <= worksheet->maxcol[i]; j++)
184 freecell (worksheet->array[i][j]);
185 if (worksheet->array[i] != NULL)
186 absfree (worksheet->array[i], "freeworksheet:worksheet->array[i] ");
187 }
188 if (worksheet->maxrow > 0)
189 {
190 absfree (worksheet->array, "freeworksheet:worksheet->array ");
191 absfree (worksheet->maxcol, "freeworksheet:worksheet->maxcol ");
192 }
193
194 freecell (worksheet->defcell);
195
196 if (worksheet->cw != NULL)
197 absfree (worksheet->cw, "freeworksheet:cw");
198 if (worksheet->lh != NULL)
199 absfree (worksheet->lh, "freeworksheet:lh");
200
201 absfree (worksheet, "freeworksheet:worksheet ");
202
203 return 0;
204 }
205
206 int
worksheet_write(worksheet,fp)207 worksheet_write (worksheet, fp)
208 Worksheet *worksheet;
209 FILE *fp;
210 {
211 int i, j;
212 char buf[10];
213 double v;
214 int dim;
215
216
217
218
219
220 for (i = 0; i < worksheet->nbcol - 1; i++)
221 {
222 dim = CW (worksheet, i + 1) - CW (worksheet, i);
223 if (dim != W_COL)
224 {
225 coltoalpha (buf, i);
226 v = dim / 7.;
227 fprintf (fp, "Columns(\"%s\").ColumnWidth = %f\n", buf, v);
228 }
229 }
230
231 for (i = 0; i < worksheet->nblin - 1; i++)
232 {
233 dim = RH (worksheet, i + 1) - RH (worksheet, i);
234 if (dim != H_LIN)
235 {
236 fprintf (fp, "Rows(\"%d\").RowHeight = %d\n", i, dim);
237 }
238 }
239
240
241 for (i = 1; i <= worksheet->maxrow; i++)
242 for (j = 1; j <= worksheet->maxcol[i]; j++)
243 {
244 if (worksheet->array[i][j] != NULL)
245 cell_write (worksheet->array[i][j], fp);
246 }
247
248
249
250
251
252
253
254
255
256
257
258
259 for (i = 0; i < worksheet->nbgraph; i++)
260 graph_write (worksheet->Graphs[i], fp);
261 for (i = 0; i < worksheet->nbdrawing; i++)
262 drawing_write (worksheet->Drawings[i], fp);
263 for (i = 0; i < worksheet->nbbutton; i++)
264 button_write (worksheet->Buttons[i], fp);
265
266 return 0;
267 }
268
269 int
worksheet_update(worksheet)270 worksheet_update (worksheet)
271 Worksheet *worksheet;
272 {
273 int i;
274
275
276 for (i = 0; i < worksheet->nbgraph; i++)
277 {
278 ActiveGraph = worksheet->Graphs[i];
279 plot (0);
280 }
281
282
283
284
285
286
287 return 0;
288 }
289
290
291
292
293
294
295 int
worksheet_find(worksheet,x,y)296 worksheet_find (worksheet, x, y)
297 Worksheet *worksheet;
298 int x, y;
299 {
300
301
302 return 0;
303 }
304
305 Cell *
worksheet_getcell(worksheet,r,c,new)306 worksheet_getcell (worksheet, r, c, new)
307 Worksheet *worksheet;
308 int r, c, new;
309 {
310 int i;
311 Cell *cell;
312 Cell *ret;
313
314 worksheet->defcell->r = r;
315 worksheet->defcell->c = c;
316 cell = worksheet->defcell;
317
318
319 if (worksheet == NULL)
320 return NULL;
321
322 if (r < 0 || r > NB_LINE)
323 return worksheet->defcell;
324 if (c < 0 || c > NB_COLUMN)
325 return worksheet->defcell;
326 if (r == 0 && c == 0)
327 return worksheet->defcell;
328
329 if (new < 0)
330 {
331 ret = NULL, new = 0;
332 }
333 else
334 ret = worksheet->defcell;
335
336 if (r < 0 || c < 0 || r > worksheet->nblin || c > worksheet->nbcol)
337 return ret;
338
339 if (r > worksheet->maxrow)
340 {
341 if (!new)
342 return ret;
343
344
345 worksheet->array = (Cell ***) absrealloc (worksheet->array, sizeof (Cell **) * (r + 1), "worksheet_getcell:worksheet->array ");
346 worksheet->maxcol = (int *) absrealloc (worksheet->maxcol, sizeof (int) * (r + 1), "worksheet_getcell:worksheet->maxcol ");
347
348 for (i = worksheet->maxrow + 1; i <= r; i++)
349 {
350 worksheet->maxcol[i] = 0;
351 worksheet->array[i] = NULL;
352 }
353
354
355 worksheet->array[r] =
356 (Cell **) absrealloc (worksheet->array[r], sizeof (Cell *) * (c + 1), "worksheet_getcell:worksheet->array[r] ");
357 for (i = 0; i <= c; i++)
358 worksheet->array[r][i] = NULL;
359
360
361 worksheet->maxrow = r;
362 if (c > worksheet->_maxcol)
363 worksheet->_maxcol = c;
364 worksheet->maxcol[r] = c;
365
366 worksheet->array[r][c] = newcell (r, c);
367 worksheet->array[r][c]->worksheet = worksheet;
368
369 return worksheet->array[r][c];
370 }
371 else if (c > worksheet->maxcol[r])
372 {
373 if (!new)
374 return ret;
375
376 worksheet->array[r] =
377 (Cell **) absrealloc (worksheet->array[r], sizeof (Cell *) * (c + 1), "worksheet_getcell:worksheet->array[r] ");
378 for (i = worksheet->maxcol[r] + 1; i <= c; i++)
379 worksheet->array[r][i] = NULL;
380 worksheet->maxcol[r] = c;
381 if (c > worksheet->_maxcol)
382 worksheet->_maxcol = c;
383 {
384 worksheet->array[r][c] = newcell (r, c);
385 worksheet->array[r][c]->worksheet = worksheet;
386 }
387 return worksheet->array[r][c];
388 }
389
390
391 else if (worksheet->array[r][c] == NULL)
392 {
393 if (!new)
394 return ret;
395 worksheet->array[r][c] = newcell (r, c);
396 worksheet->array[r][c]->worksheet = worksheet;
397
398 return worksheet->array[r][c];
399 }
400
401 return worksheet->array[r][c];
402
403 }
404
405 int
worksheet_delcell(worksheet,r,c)406 worksheet_delcell (worksheet, r, c)
407 Worksheet *worksheet;
408 int r, c;
409 {
410 Cell *cell = worksheet_getcell (worksheet, r, c, -1);
411 if (cell == NULL)
412 return 1;
413
414 if (cell->familly->numpar > 0)
415 cell_isnew (cell);
416
417
418 if (cell->familly->numchi > 0)
419 cell_setformula (cell, "");
420 else
421 {
422 worksheet->array[r][c] = NULL;
423 freecell (cell);
424 }
425 return 0;
426 }
427
428 Graph *
worksheet_newgraph(worksheet)429 worksheet_newgraph (worksheet)
430 Worksheet *worksheet;
431 {
432 worksheet->Graphs = (Graph **) absrealloc (worksheet->Graphs, sizeof (Graph *) * (worksheet->nbgraph + 1), "worksheet_newgraph:worksheet->Graphs ");
433 worksheet->Graphs[worksheet->nbgraph] = newgraph ();
434 worksheet->activegraph = worksheet->Graphs[worksheet->nbgraph];
435 worksheet->nbgraph++;
436 worksheet->activegraph->worksheet = worksheet;
437 if (worksheet == ActiveWorksheet)
438 {
439 creategraphpixmap (worksheet->activegraph);
440 doplot (worksheet->activegraph);
441 ActiveGraph = worksheet->activegraph;
442 }
443
444 return worksheet->Graphs[worksheet->nbgraph - 1];
445 }
446
447 Graph *
worksheet_newgraph1(Worksheet * worksheet,Graph * graph)448 worksheet_newgraph1 (Worksheet * worksheet, Graph * graph)
449 {
450 worksheet->Graphs = (Graph **) absrealloc (worksheet->Graphs, sizeof (Graph *) * (worksheet->nbgraph + 1), "worksheet_newgraph:worksheet->Graphs ");
451 worksheet->Graphs[worksheet->nbgraph] = newgraph1 (graph);
452 worksheet->activegraph = worksheet->Graphs[worksheet->nbgraph];
453 worksheet->nbgraph++;
454 worksheet->activegraph->worksheet = worksheet;
455 if (worksheet == ActiveWorksheet)
456 {
457 creategraphpixmap (worksheet->activegraph);
458 doplot (worksheet->activegraph);
459 ActiveGraph = worksheet->activegraph;
460 }
461 return worksheet->Graphs[worksheet->nbgraph - 1];
462 }
463
464 static int indelgraph = 0;
465 int
worksheet_delgraph(Worksheet * worksheet,Graph * graph)466 worksheet_delgraph (Worksheet * worksheet, Graph * graph)
467 {
468 int i, found = 0;
469 if (indelgraph)
470 return 0;
471 indelgraph = 1;
472
473 if (ActiveWorksheet == worksheet)
474 {
475 for (i = 0; i < ActiveWorksheet->nbgraph; i++)
476 {
477 if (graph == ActiveWorksheet->Graphs[i])
478 deletegraphpixmap (ActiveWorksheet->Graphs[i]);
479 }
480 }
481
482 i = 0;
483 while (i < worksheet->nbgraph && found == 0)
484 {
485 if (graph == worksheet->Graphs[i])
486 found = 1;
487 i++;
488 }
489 if (found == 0)
490 return -1;
491
492 found = i - 1;
493 for (i = found; i < worksheet->nbgraph - 1; i++)
494 {
495 worksheet->Graphs[i] = worksheet->Graphs[i + 1];
496 }
497 worksheet->nbgraph--;
498
499 if (worksheet->nbgraph > 0)
500 {
501 worksheet->Graphs = (Graph **) absrealloc (worksheet->Graphs, sizeof (Graph *) * (worksheet->nbgraph + 1), "worksheet_newgraph:worksheet->Graphs ");
502 }
503 else
504 {
505 absfree (worksheet->Graphs, "worksheet_delgraph:worksheet->Graphs ");
506 worksheet->Graphs = NULL;
507 }
508
509 freegraph (graph);
510
511 indelgraph = 0;
512 return 0;
513
514 }
515
516
517
518
519 Drawing *
worksheet_newdrawing(worksheet)520 worksheet_newdrawing (worksheet)
521 Worksheet *worksheet;
522 {
523 fprintf (stderr, "newdrawing worksheet->nbdrawing %d\n", worksheet->nbdrawing);
524 worksheet->Drawings = (Drawing **) absrealloc (worksheet->Drawings, sizeof (Drawing *) * (worksheet->nbdrawing + 1), "worksheet_newdrawing:worksheet->Drawings ");
525 worksheet->Drawings[worksheet->nbdrawing] = newdrawing ();
526 worksheet->activedrawing = worksheet->Drawings[worksheet->nbdrawing];
527 worksheet->activedrawing->worksheet = worksheet;
528 worksheet->nbdrawing++;
529 return worksheet->Drawings[worksheet->nbdrawing - 1];
530 }
531
532 Drawing *
worksheet_newdrawing1(Worksheet * worksheet,Drawing * drawing)533 worksheet_newdrawing1 (Worksheet * worksheet, Drawing * drawing)
534 {
535 fprintf (stderr, "newdrawing1 worksheet->nbdrawing %d\n", worksheet->nbdrawing);
536 worksheet->Drawings = (Drawing **) absrealloc (worksheet->Drawings, sizeof (Drawing *) * (worksheet->nbdrawing + 1), "worksheet_newdrawing:worksheet->Drawings ");
537 worksheet->Drawings[worksheet->nbdrawing] = newdrawing1 (drawing);
538 worksheet->activedrawing = worksheet->Drawings[worksheet->nbdrawing];
539 worksheet->activedrawing->worksheet = worksheet;
540 worksheet->nbdrawing++;
541 return worksheet->Drawings[worksheet->nbdrawing - 1];
542 }
543
544
545 static int indeldrawing = 0;
546
547 int
worksheet_deldrawing(Worksheet * worksheet,Drawing * drawing)548 worksheet_deldrawing (Worksheet * worksheet, Drawing * drawing)
549 {
550 int i, found = 0;
551
552 fprintf (stderr, "indeldrawing %d, worksheet->nbdrawing %d\n", indeldrawing, worksheet->nbdrawing);
553
554 if (indeldrawing)
555 return 0;
556 indeldrawing = 1;
557
558 i = 0;
559 while (i < worksheet->nbdrawing && found == 0)
560 {
561 if (drawing == worksheet->Drawings[i])
562 found = 1;
563 i++;
564 }
565 if (found == 0)
566 {
567 indeldrawing = 0;
568 fprintf (stderr, "drawing not found! \n");
569 return -1;
570 }
571
572 fprintf (stderr, "drawing found at position %d\n", i - 1);
573
574 found = i - 1;
575
576 for (i = found; i < worksheet->nbdrawing - 1; i++)
577 {
578 fprintf (stderr, "moving drawing %d to pos %d\n", i + 1, i);
579 worksheet->Drawings[i] = worksheet->Drawings[i + 1];
580 }
581 worksheet->nbdrawing--;
582
583 fprintf (stderr, "NOW worksheet->nbdrawing %d\n", worksheet->nbdrawing);
584
585 if (worksheet->nbdrawing > 0)
586 {
587 worksheet->Drawings = (Drawing **) absrealloc (worksheet->Drawings, sizeof (Drawing *) * (worksheet->nbdrawing + 1), "worksheet_deldrawing:worksheet->Drawings ");
588 }
589 else
590 {
591 absfree (worksheet->Drawings, "worksheet_deldrawing:worksheet->Drawings ");
592 worksheet->Drawings = NULL;
593 worksheet->nbdrawing = 0;
594 }
595
596 freedrawing (drawing);
597
598 indeldrawing = 0;
599
600 return 0;
601
602 }
603
604
605 Button *
worksheet_newbutton(worksheet)606 worksheet_newbutton (worksheet)
607 Worksheet *worksheet;
608 {
609 worksheet->Buttons = (Button **) absrealloc (worksheet->Buttons, sizeof (Button *) * (worksheet->nbbutton + 1), "worksheet_newbutton:worksheet->Buttons ");
610 worksheet->Buttons[worksheet->nbbutton] = newbutton ();
611 worksheet->activebutton = worksheet->Buttons[worksheet->nbbutton];
612 worksheet->nbbutton++;
613 return worksheet->Buttons[worksheet->nbbutton - 1];
614 }
615
616 extern int repaint_activesheet (char *message);
617
618 Worksheet *
ActivateWorksheet(worksheet)619 ActivateWorksheet (worksheet)
620 Worksheet *worksheet;
621 {
622 int i;
623
624 if (worksheet == NULL)
625 return NULL;
626
627 if (ActiveWorksheet != worksheet && ActiveWorksheet != NULL)
628 {
629 for (i = 0; i < ActiveWorksheet->nbgraph; i++)
630 deletegraphpixmap (ActiveWorksheet->Graphs[i]);
631 }
632
633 ActiveWorksheet = worksheet;
634 worksheet->workbook->activeworksheet = worksheet;
635
636 ActiveCell = worksheet->activecell;
637 ActiveGraph = worksheet->activegraph;
638 ActiveDrawing = worksheet->activedrawing;
639 ActiveButton = worksheet->activebutton;
640 ActiveSelection = worksheet->selection;
641
642
643
644 for (i = 0; i < worksheet->nbgraph; i++)
645 {
646 creategraphpixmap (worksheet->Graphs[i]);
647 doplot (worksheet->Graphs[i]);
648 }
649
650
651 cb_setzoom (worksheet->zoom);
652 setzoomlabel (worksheet->zoom);
653 setscrollvlimit (1, worksheet->nblin);
654 setscrollhlimit (1, worksheet->nbcol);
655 setscrollv ((double) worksheet->ll);
656 setscrollh ((double) worksheet->cc);
657
658 if (worksheet->workbook == ActiveWorkbook)
659 {
660 repaint_activesheet ("ActivateWorksheet");
661 rebuild_thumb ();
662 }
663
664 setcursor (ActiveWorksheet->cur_r, ActiveWorksheet->cur_c);
665
666 return ActiveWorksheet;
667 }
668
669 Chart *
worksheet_getchart(worksheet,n)670 worksheet_getchart (worksheet, n)
671 Worksheet *worksheet;
672 int n;
673 {
674 if (n > 0 && n < worksheet->nbgraph)
675 return worksheet->Graphs[n];
676 return NULL;
677 }
678
679 Graph *
worksheet_addchart(worksheet,args,n)680 worksheet_addchart (worksheet, args, n)
681 Worksheet *worksheet;
682 int *args;
683 int n;
684 {
685 worksheet->Graphs = (Graph **) absrealloc (worksheet->Graphs, sizeof (Graph *) * (worksheet->nbgraph + 1), "worksheet_newgraph:worksheet->Graphs ");
686 worksheet->Graphs[worksheet->nbgraph] = newgraph ();
687 worksheet->activegraph = worksheet->Graphs[worksheet->nbgraph];
688 worksheet->nbgraph++;
689 worksheet->activegraph->worksheet = worksheet;
690
691
692
693 if (n == 4)
694 {
695 worksheet->activegraph->x = args[0];
696 worksheet->activegraph->y = args[1];
697 worksheet->activegraph->w = args[2];
698 worksheet->activegraph->h = args[3];
699 }
700 else
701 {
702 worksheet->activegraph->x = 30;
703 worksheet->activegraph->y = 30;
704 worksheet->activegraph->w = 80;
705 worksheet->activegraph->h = 50;
706 }
707
708 if (worksheet == ActiveWorksheet)
709 {
710 creategraphpixmap (worksheet->activegraph);
711 doplot (worksheet->activegraph);
712 ActiveGraph = worksheet->activegraph;
713 }
714 return worksheet->activegraph;
715 }
716
717 Drawing *
worksheet_addshape(worksheet,args,n)718 worksheet_addshape (worksheet, args, n)
719 Worksheet *worksheet;
720 int *args;
721 int n;
722 {
723 if (worksheet == NULL)
724 return NULL;
725 if (n != 5 && n != 4)
726 return NULL;
727
728 worksheet->Drawings = (Drawing **) absrealloc (worksheet->Drawings, sizeof (Drawing *) * (worksheet->nbdrawing + 1)
729 ,"worksheet_addshape:worksheet->Drawings ");
730 worksheet->Drawings[worksheet->nbdrawing] = (Drawing *) newdrawing ();
731 worksheet->activedrawing = worksheet->Drawings[worksheet->nbdrawing];
732 worksheet->nbdrawing++;
733
734
735 if (n == 5)
736 {
737 worksheet->activedrawing->type = args[0];
738 worksheet->activedrawing->x1 = args[1];
739 worksheet->activedrawing->y1 = args[2];
740 worksheet->activedrawing->x2 = args[3];
741 worksheet->activedrawing->y2 = args[4];
742 }
743 if (n == 4)
744 {
745 worksheet->activedrawing->type = 0;
746 worksheet->activedrawing->x1 = args[0];
747 worksheet->activedrawing->y1 = args[1];
748 worksheet->activedrawing->x2 = args[2];
749 worksheet->activedrawing->y2 = args[3];
750 }
751
752
753 ActiveDrawing = worksheet->activedrawing;
754 return ActiveDrawing;
755 }
756
757 Button *
worksheet_addbutton(worksheet,args,n)758 worksheet_addbutton (worksheet, args, n)
759 Worksheet *worksheet;
760 int *args;
761 int n;
762 {
763 worksheet->Buttons = (Button **) absrealloc (worksheet->Buttons, sizeof (Button *) * (worksheet->nbbutton + 1), "worksheet_addbutton:worksheet->Buttons ");
764 worksheet->Buttons[worksheet->nbbutton] = (Button *) newbutton ();
765 worksheet->activebutton = worksheet->Buttons[worksheet->nbbutton];
766 worksheet->nbbutton++;
767
768 worksheet->activebutton->x1 = args[0];
769 worksheet->activebutton->y1 = args[1];
770 worksheet->activebutton->x2 = args[2] + args[0];
771 worksheet->activebutton->y2 = args[3] + args[1];
772
773 ActiveButton = worksheet->activebutton;
774 return ActiveButton;
775 }
776
777
778
779 int
worksheet_setcolw(worksheet,col,w)780 worksheet_setcolw (worksheet, col, w)
781 Worksheet *worksheet;
782 int col;
783 double w;
784 {
785 int i;
786 int dw;
787 int dim = worksheet->cwdim;
788
789 col++;
790 if (col <= 0)
791 return -1;
792
793
794 if (col > dim)
795 {
796 worksheet->cw = (int *) absrealloc (worksheet->cw, sizeof (int) * (col + 1), "worksheet_setcolw:cw");
797 if (dim == -1)
798 {
799 worksheet->cw[0] = -W_COL;
800 dim = 0;
801 }
802 for (i = dim + 1; i <= col; i++)
803 worksheet->cw[i] = worksheet->cw[i - 1] + W_COL;
804 worksheet->cwdim = col;
805 }
806
807 dw = w - (worksheet->cw[col] - worksheet->cw[col - 1]);
808 for (i = col; i <= worksheet->cwdim; i++)
809 worksheet->cw[i] += dw;
810
811 return 0;
812 }
813
814 int
worksheet_setrowh(worksheet,lin,h)815 worksheet_setrowh (worksheet, lin, h)
816 Worksheet *worksheet;
817 int lin;
818 double h;
819 {
820 int i;
821 int dh;
822 int dim = worksheet->lhdim;
823 lin++;
824 if (lin <= 0)
825 return -1;
826
827 if (lin > dim)
828 {
829 worksheet->lh = (int *) absrealloc (worksheet->lh, sizeof (int) * (lin + 1), "worksheet_setrowh:lh");
830 if (dim == -1)
831 {
832 worksheet->lh[0] = -H_LIN;
833 dim = 0;
834 }
835 for (i = dim + 1; i <= lin; i++)
836 worksheet->lh[i] = worksheet->lh[i - 1] + H_LIN;
837 worksheet->lhdim = lin;
838 }
839
840 dh = h - (worksheet->lh[lin] - worksheet->lh[lin - 1]);
841 for (i = lin; i <= worksheet->lhdim; i++)
842 worksheet->lh[i] += dh;
843 return 0;
844 }
845
846
847 double
worksheet_getcolw(worksheet,col)848 worksheet_getcolw (worksheet, col)
849 Worksheet *worksheet;
850 int col;
851 {
852 int dim;
853
854 if (col < 0)
855 return 0.0;
856
857 dim = worksheet->cwdim;
858
859 if (dim == -1)
860 {
861 return (col - 1) * W_COL;
862 }
863
864 if (col > dim)
865 {
866 return (worksheet->cw[dim] + (col - dim) * W_COL);
867 }
868 return worksheet->cw[col];
869 }
870
871 double
worksheet_getrowh(worksheet,lin)872 worksheet_getrowh (worksheet, lin)
873 Worksheet *worksheet;
874 int lin;
875 {
876 int dim;
877 dim = worksheet->lhdim;
878
879 if (lin < 0)
880 return 0.0;
881
882 if (dim == -1)
883 {
884 return (lin - 1) * H_LIN;
885 }
886
887 if (lin > dim)
888 {
889 return (worksheet->lh[dim] + (lin - dim) * H_LIN);
890 }
891
892 return worksheet->lh[lin];
893 }
894
895
896 int
worksheet_setname(Worksheet * worksheet,char * name)897 worksheet_setname (Worksheet * worksheet, char *name)
898 {
899 int len = 0;
900 int i, j, k;
901 Cell *cell;
902 char oldname[30];
903 if (name == NULL)
904 return -1;
905 len = strlen (name);
906 if (len < 1)
907 return -1;
908 if (len > 30)
909 {
910 name[29] = '\0';
911 len = 30;
912 }
913
914 strcpy (oldname, worksheet->Name);
915 strcpy (worksheet->Name, name);
916 worksheet->Name[29] = '\0';
917 rebuild_thumb ();
918
919
920
921 for (i = 1; i <= worksheet->maxrow; i++)
922 for (j = 1; j <= worksheet->maxcol[i]; j++)
923 {
924 cell = worksheet->array[i][j];
925 if (cell != NULL)
926 {
927 if (cell->familly != NULL)
928 for (k = 0; k < cell->familly->numchi; k++)
929 {
930 cell_chgwksname (cell->familly->childlist[k], oldname, name);
931 }
932 }
933 }
934 return 0;
935 }
936
937 int
worksheet_calculate(Worksheet * worksheet)938 worksheet_calculate (Worksheet * worksheet)
939 {
940 int i, j;
941 for (i = 1; i <= worksheet->maxrow; i++)
942 for (j = 1; j <= worksheet->maxcol[i]; j++)
943 {
944 if (worksheet->array[i][j] != NULL)
945 cell_calculate (worksheet->array[i][j]);
946 }
947 if (worksheet == ActiveWorksheet)
948 repaint_activesheet ("worksheet_calculate");
949 return 0;
950 }
951
952 int
worksheet_printout(Worksheet * worksheet)953 worksheet_printout (Worksheet * worksheet)
954 {
955
956 return 0;
957 }
958
959 int
worksheet_setcursor(Worksheet * worksheet,int row,int column)960 worksheet_setcursor (Worksheet * worksheet, int row, int column)
961 {
962 Cell *cell;
963 if (worksheet == NULL)
964 return -1;
965 worksheet->cur_r = row;
966 worksheet->cur_c = column;
967
968 if (worksheet->cur_r < 1)
969 worksheet->cur_r = 1;
970 else if (worksheet->cur_r > worksheet->nblin)
971 worksheet->cur_r = worksheet->nblin;
972
973 if (worksheet->cur_c < 1)
974 worksheet->cur_c = 1;
975 else if (worksheet->cur_c > worksheet->nbcol)
976 worksheet->cur_c = worksheet->nbcol;
977
978 cell = worksheet_getcell (worksheet, worksheet->cur_r, worksheet->cur_c, 0);
979 if (cell != ActiveCell)
980 cell_activate (cell);
981
982 return 0;
983 }
984
985 int
worksheet_movecursor(Worksheet * worksheet,int drow,int dcolumn)986 worksheet_movecursor (Worksheet * worksheet, int drow, int dcolumn)
987 {
988 if (worksheet == NULL)
989 return -1;
990 return worksheet_setcursor (worksheet, worksheet->cur_r + drow, worksheet->cur_c + dcolumn);
991
992 return 0;
993 }
994
995 #include "object.h"
996
997 int
worksheet_select_cell(Worksheet * w,Cell * c)998 worksheet_select_cell (Worksheet * w, Cell * c)
999 {
1000 if (w == NULL || c == NULL)
1001 return -1;
1002 worksheet_select_range (w, c->r, c->c, c->r, c->c);
1003 worksheet_setcursor (w, c->r, c->c);
1004 return 0;
1005 }
1006
1007 int
worksheet_select_range(Worksheet * w,int i1,int j1,int i2,int j2)1008 worksheet_select_range (Worksheet * w, int i1, int j1, int i2, int j2)
1009 {
1010 Range *range;
1011 obj o;
1012 selection_reset (w->selection);
1013 range = newrange2 (i1, j1, i2, j2);
1014
1015 o.rec.s = (char *) range;
1016 o.type = name2type ("RANGE");
1017 selection_addobj (w->selection, o);
1018
1019 return 0;
1020 }
1021
1022 int
worksheet_select_graph(Worksheet * w,Graph * c)1023 worksheet_select_graph (Worksheet * w, Graph * c)
1024 {
1025 obj o;
1026 if (w == NULL)
1027 return -1;
1028 selection_reset (w->selection);
1029 if (c == NULL)
1030 return 0;
1031
1032 o.rec.s = (char *) c;
1033 o.type = name2type ("CHART");
1034 selection_addobj (w->selection, o);
1035 return 0;
1036 }
1037
1038 int
worksheet_select_drawing(Worksheet * w,Drawing * d)1039 worksheet_select_drawing (Worksheet * w, Drawing * d)
1040 {
1041 obj o;
1042 if (w == NULL || d == NULL)
1043 return -1;
1044 selection_reset (w->selection);
1045 o.rec.s = (char *) d;
1046 o.type = name2type ("SHAPES");
1047 selection_addobj (w->selection, o);
1048 return 0;
1049 }
1050
1051 int
worksheet_select_button(Worksheet * w,Button * b)1052 worksheet_select_button (Worksheet * w, Button * b)
1053 {
1054 obj o;
1055 if (w == NULL || b == NULL)
1056 return -1;
1057 selection_reset (w->selection);
1058 o.rec.s = (char *) b;
1059 o.type = name2type ("BUTTON");
1060 selection_addobj (w->selection, o);
1061 return 0;
1062 }
1063
1064
1065
1066
1067
1068
1069 static int r = 0;
1070 static int c = 0;
1071 static int pl = 0;
1072 static Range *ran = NULL;
1073
1074 Cell *
worksheet_selection_cells(Worksheet * w)1075 worksheet_selection_cells (Worksheet * w)
1076 {
1077 obj o;
1078 int rangetype = name2type ("RANGE");
1079
1080 if (ran == NULL)
1081 {
1082 o.type = 0;
1083 while (o.type != rangetype)
1084 {
1085 o = selection_getobjects (w->selection);
1086 if (o.type < 0)
1087 return NULL;
1088 }
1089 selection_resetget (w->selection);
1090
1091 ran = (Range *) o.rec.s;
1092 if (ran == NULL)
1093 return NULL;
1094 if (ran->nplage == 0)
1095 return NULL;
1096 pl = 0;
1097 c = ran->plage[pl].c1 - 1;
1098 r = ran->plage[pl].r1;
1099 }
1100
1101 c++;
1102 if (c > ran->plage[pl].c2)
1103 {
1104 c = ran->plage[pl].c1;
1105 r++;
1106 if (r > ran->plage[pl].r2)
1107 {
1108 pl++;
1109 if (pl >= ran->nplage)
1110 {
1111 pl = 0;
1112 ran = NULL;
1113 return NULL;
1114 }
1115 else
1116 {
1117 c = ran->plage[pl].c1;
1118 r = ran->plage[pl].r1;
1119 }
1120 }
1121 }
1122
1123
1124 return worksheet_getcell (w, r, c, 1);
1125
1126
1127 }
1128
1129
1130
1131
1132
1133 int
worksheet_cell_coord(Worksheet * w,Cell * c,int * x1,int * y1,int * x2,int * y2)1134 worksheet_cell_coord (Worksheet * w, Cell * c, int *x1, int *y1, int *x2, int *y2)
1135 {
1136 if (c == NULL)
1137 {
1138 *x1 = 0;
1139 *x2 = 0;
1140 *y1 = 0;
1141 *y2 = 0;
1142 return -1;
1143 }
1144 return worksheet_rc_coord (w, c->r, c->c, x1, y1, x2, y2);
1145 }
1146
1147 #define CW worksheet_getcolw
1148 #define LH worksheet_getrowh
1149
1150 int
worksheet_rc_coord(Worksheet * w,int r,int c,int * x1,int * y1,int * x2,int * y2)1151 worksheet_rc_coord (Worksheet * w, int r, int c, int *x1, int *y1, int *x2, int *y2)
1152 {
1153 if (w == NULL || r < 0 || c < 0 || r > w->nblin || c > w->nbcol)
1154 {
1155 *x1 = 0;
1156 *x2 = 0;
1157 *y1 = 0;
1158 *y2 = 0;
1159 return -1;
1160 }
1161
1162 *x1 = (CW (w, c) - CW (w, w->cc)) * w->zoom / 100;
1163 *y1 = (LH (w, r) - LH (w, w->ll)) * w->zoom / 100;
1164 *x2 = (CW (w, c + 1) - CW (w, w->cc)) * w->zoom / 100;
1165 *y2 = (LH (w, r + 1) - LH (w, w->ll)) * w->zoom / 100;
1166
1167 return 0;
1168 }
1169
1170 Graph *
worksheet_getchart_at(Worksheet * w,int x,int y)1171 worksheet_getchart_at (Worksheet * w, int x, int y)
1172 {
1173 int i;
1174 int x1, x2, y1, y2;
1175 Graph *chart;
1176
1177 for (i = 0; i < w->nbgraph; i++)
1178 {
1179 chart = w->Graphs[i];
1180 x1 = chart->x * w->zoom / 100;
1181 y1 = chart->y * w->zoom / 100;
1182 x2 = (chart->x + chart->w) * w->zoom / 100;
1183 y2 = (chart->y + chart->h) * w->zoom / 100;
1184
1185 if (x1 < x && y1 < y && x2 > x && y2 > y)
1186 {
1187 return chart;
1188 }
1189 }
1190 return NULL;
1191 }
1192