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