GNU Octave  3.8.0
A high-level interpreted language, primarily intended for numerical computations, mostly compatible with Matlab
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
graphics.h
Go to the documentation of this file.
1 // DO NOT EDIT! Generated automatically by genprops.awk.
2 
3 /*
4 
5 Copyright (C) 2007-2013 John W. Eaton
6 
7 This file is part of Octave.
8 
9 Octave is free software; you can redistribute it and/or modify it
10 under the terms of the GNU General Public License as published by the
11 Free Software Foundation; either version 3 of the License, or (at your
12 option) any later version.
13 
14 Octave is distributed in the hope that it will be useful, but WITHOUT
15 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
16 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 for more details.
18 
19 You should have received a copy of the GNU General Public License
20 along with Octave; see the file COPYING. If not, see
21 <http://www.gnu.org/licenses/>.
22 
23 */
24 
25 #if !defined (octave_graphics_h)
26 #define octave_graphics_h 1
27 
28 #ifdef HAVE_CONFIG_H
29 #include <config.h>
30 #endif
31 
32 #include <cctype>
33 
34 #include <algorithm>
35 #include <list>
36 #include <map>
37 #include <set>
38 #include <sstream>
39 #include <string>
40 
41 #include "caseless-str.h"
42 
43 #include "gripes.h"
44 #include "oct-handle.h"
45 #include "oct-map.h"
46 #include "oct-mutex.h"
47 #include "oct-refcount.h"
48 #include "ov.h"
49 #include "txt-eng-ft.h"
50 
51 // FIXME: maybe this should be a configure option?
52 // Matlab defaults to "Helvetica", but that causes problems for many
53 // gnuplot users.
54 #if !defined (OCTAVE_DEFAULT_FONTNAME)
55 #define OCTAVE_DEFAULT_FONTNAME "*"
56 #endif
57 
59 
60 // ---------------------------------------------------------------------
61 
63 {
64 public:
65  base_scaler (void) { }
66 
67  virtual ~base_scaler (void) { }
68 
69  virtual Matrix scale (const Matrix& m) const
70  {
71  error ("invalid axis scale");
72  return m;
73  }
74 
75  virtual NDArray scale (const NDArray& m) const
76  {
77  error ("invalid axis scale");
78  return m;
79  }
80 
81  virtual double scale (double d) const
82  {
83  error ("invalid axis scale");
84  return d;
85  }
86 
87  virtual double unscale (double d) const
88  {
89  error ("invalid axis scale");
90  return d;
91  }
92 
93  virtual base_scaler* clone () const
94  { return new base_scaler (); }
95 
96  virtual bool is_linear (void) const
97  { return false; }
98 };
99 
100 class lin_scaler : public base_scaler
101 {
102 public:
103  lin_scaler (void) { }
104 
105  Matrix scale (const Matrix& m) const { return m; }
106 
107  NDArray scale (const NDArray& m) const { return m; }
108 
109  double scale (double d) const { return d; }
110 
111  double unscale (double d) const { return d; }
112 
113  base_scaler* clone (void) const { return new lin_scaler (); }
114 
115  bool is_linear (void) const { return true; }
116 };
117 
118 class log_scaler : public base_scaler
119 {
120 public:
121  log_scaler (void) { }
122 
123  Matrix scale (const Matrix& m) const
124  {
125  Matrix retval (m.rows (), m.cols ());
126 
127  do_scale (m.data (), retval.fortran_vec (), m.numel ());
128 
129  return retval;
130  }
131 
132  NDArray scale (const NDArray& m) const
133  {
134  NDArray retval (m.dims ());
135 
136  do_scale (m.data (), retval.fortran_vec (), m.numel ());
137 
138  return retval;
139  }
140 
141  double scale (double d) const
142  { return log10 (d); }
143 
144  double unscale (double d) const
145  { return pow (10.0, d); }
146 
147  base_scaler* clone (void) const
148  { return new log_scaler (); }
149 
150 private:
151  void do_scale (const double *src, double *dest, int n) const
152  {
153  for (int i = 0; i < n; i++)
154  dest[i] = log10 (src[i]);
155  }
156 };
157 
159 {
160 public:
161  neg_log_scaler (void) { }
162 
163  Matrix scale (const Matrix& m) const
164  {
165  Matrix retval (m.rows (), m.cols ());
166 
167  do_scale (m.data (), retval.fortran_vec (), m.numel ());
168 
169  return retval;
170  }
171 
172  NDArray scale (const NDArray& m) const
173  {
174  NDArray retval (m.dims ());
175 
176  do_scale (m.data (), retval.fortran_vec (), m.numel ());
177 
178  return retval;
179  }
180 
181  double scale (double d) const
182  { return -log10 (-d); }
183 
184  double unscale (double d) const
185  { return -pow (10.0, -d); }
186 
187  base_scaler* clone (void) const
188  { return new neg_log_scaler (); }
189 
190 private:
191  void do_scale (const double *src, double *dest, int n) const
192  {
193  for (int i = 0; i < n; i++)
194  dest[i] = -log10 (-src[i]);
195  }
196 };
197 
198 class scaler
199 {
200 public:
201  scaler (void) : rep (new base_scaler ()) { }
202 
203  scaler (const scaler& s) : rep (s.rep->clone ()) { }
204 
205  scaler (const std::string& s)
206  : rep (s == "log"
207  ? new log_scaler ()
208  : (s == "neglog" ? new neg_log_scaler ()
209  : (s == "linear" ? new lin_scaler () : new base_scaler ())))
210  { }
211 
212  ~scaler (void) { delete rep; }
213 
214  Matrix scale (const Matrix& m) const
215  { return rep->scale (m); }
216 
217  NDArray scale (const NDArray& m) const
218  { return rep->scale (m); }
219 
220  double scale (double d) const
221  { return rep->scale (d); }
222 
223  double unscale (double d) const
224  { return rep->unscale (d); }
225 
226  bool is_linear (void) const
227  { return rep->is_linear (); }
228 
230  {
231  if (rep)
232  {
233  delete rep;
234  rep = 0;
235  }
236 
237  rep = s.rep->clone ();
238 
239  return *this;
240  }
241 
242  scaler& operator = (const std::string& s)
243  {
244  if (rep)
245  {
246  delete rep;
247  rep = 0;
248  }
249 
250  if (s == "log")
251  rep = new log_scaler ();
252  else if (s == "neglog")
253  rep = new neg_log_scaler ();
254  else if (s == "linear")
255  rep = new lin_scaler ();
256  else
257  rep = new base_scaler ();
258 
259  return *this;
260  }
261 
262 private:
264 };
265 
266 // ---------------------------------------------------------------------
267 
268 class property;
269 
271 
273 {
274 public:
275  friend class property;
276 
277 public:
279  : id (-1), count (1), name (), parent (), hidden (), listeners ()
280  { }
281 
282  base_property (const std::string& s, const graphics_handle& h)
283  : id (-1), count (1), name (s), parent (h), hidden (false), listeners ()
284  { }
285 
287  : id (-1), count (1), name (p.name), parent (p.parent),
288  hidden (p.hidden), listeners ()
289  { }
290 
291  virtual ~base_property (void) { }
292 
293  bool ok (void) const { return parent.ok (); }
294 
295  std::string get_name (void) const { return name; }
296 
297  void set_name (const std::string& s) { name = s; }
298 
299  graphics_handle get_parent (void) const { return parent; }
300 
301  void set_parent (const graphics_handle &h) { parent = h; }
302 
303  bool is_hidden (void) const { return hidden; }
304 
305  void set_hidden (bool flag) { hidden = flag; }
306 
307  virtual bool is_radio (void) const { return false; }
308 
309  int get_id (void) const { return id; }
310 
311  void set_id (int d) { id = d; }
312 
313  // Sets property value, notifies graphics toolkit.
314  // If do_run is true, runs associated listeners.
315  OCTINTERP_API bool set (const octave_value& v, bool do_run = true,
316  bool do_notify_toolkit = true);
317 
318  virtual octave_value get (void) const
319  {
320  error ("get: invalid property \"%s\"", name.c_str ());
321  return octave_value ();
322  }
323 
324 
325  virtual std::string values_as_string (void) const
326  {
327  error ("values_as_string: invalid property \"%s\"", name.c_str ());
328  return std::string ();
329  }
330 
331  virtual Cell values_as_cell (void) const
332  {
333  error ("values_as_cell: invalid property \"%s\"", name.c_str ());
334  return Cell ();
335  }
336 
338  {
339  set (val);
340  return *this;
341  }
342 
344  {
345  octave_value_list& l = listeners[mode];
346  l.resize (l.length () + 1, v);
347  }
348 
350  listener_mode mode = POSTSET)
351  {
352  octave_value_list& l = listeners[mode];
353 
354  if (v.is_defined ())
355  {
356  bool found = false;
357  int i;
358 
359  for (i = 0; i < l.length (); i++)
360  {
361  if (v.internal_rep () == l(i).internal_rep ())
362  {
363  found = true;
364  break;
365  }
366  }
367  if (found)
368  {
369  for (int j = i; j < l.length () - 1; j++)
370  l(j) = l(j + 1);
371 
372  l.resize (l.length () - 1);
373  }
374  }
375  else
376  {
377  if (mode == PERSISTENT)
378  l.resize (0);
379  else
380  {
381  octave_value_list lnew (0);
383  for (int i = l.length () - 1; i >= 0 ; i--)
384  {
385  for (int j = 0; j < lp.length (); j++)
386  {
387  if (l(i).internal_rep () == lp(j).internal_rep ())
388  {
389  lnew.resize (lnew.length () + 1, l(i));
390  break;
391  }
392  }
393  }
394  l = lnew;
395  }
396  }
397 
398  }
399 
401 
402  virtual base_property* clone (void) const
403  { return new base_property (*this); }
404 
405 protected:
406  virtual bool do_set (const octave_value&)
407  {
408  error ("set: invalid property \"%s\"", name.c_str ());
409  return false;
410  }
411 
412 private:
413  typedef std::map<listener_mode, octave_value_list> listener_map;
414  typedef std::map<listener_mode, octave_value_list>::iterator
416  typedef std::map<listener_mode, octave_value_list>::const_iterator
418 
419 private:
420  int id;
422  std::string name;
424  bool hidden;
426 };
427 
428 // ---------------------------------------------------------------------
429 
431 {
432 public:
433  string_property (const std::string& s, const graphics_handle& h,
434  const std::string& val = "")
435  : base_property (s, h), str (val) { }
436 
438  : base_property (p), str (p.str) { }
439 
440  octave_value get (void) const
441  { return octave_value (str); }
442 
443  std::string string_value (void) const { return str; }
444 
446  {
447  set (val);
448  return *this;
449  }
450 
451  base_property* clone (void) const { return new string_property (*this); }
452 
453 protected:
454  bool do_set (const octave_value& val)
455  {
456  if (val.is_string ())
457  {
458  std::string new_str = val.string_value ();
459 
460  if (new_str != str)
461  {
462  str = new_str;
463  return true;
464  }
465  }
466  else
467  error ("set: invalid string property value for \"%s\"",
468  get_name ().c_str ());
469  return false;
470  }
471 
472 private:
473  std::string str;
474 };
475 
476 // ---------------------------------------------------------------------
477 
479 {
480 public:
482 
483  string_array_property (const std::string& s, const graphics_handle& h,
484  const std::string& val = "", const char& sep = '|',
485  const desired_enum& typ = string_t)
486  : base_property (s, h), desired_type (typ), separator (sep), str ()
487  {
488  size_t pos = 0;
489 
490  while (true)
491  {
492  size_t new_pos = val.find_first_of (separator, pos);
493 
494  if (new_pos == std::string::npos)
495  {
496  str.append (val.substr (pos));
497  break;
498  }
499  else
500  str.append (val.substr (pos, new_pos - pos));
501 
502  pos = new_pos + 1;
503  }
504  }
505 
506  string_array_property (const std::string& s, const graphics_handle& h,
507  const Cell& c, const char& sep = '|',
508  const desired_enum& typ = string_t)
509  : base_property (s, h), desired_type (typ), separator (sep), str ()
510  {
511  if (c.is_cellstr ())
512  {
513  string_vector strings (c.numel ());
514 
515  for (octave_idx_type i = 0; i < c.numel (); i++)
516  strings[i] = c(i).string_value ();
517 
518  str = strings;
519  }
520  else
521  error ("set: invalid order property value for \"%s\"",
522  get_name ().c_str ());
523  }
524 
527  separator (p.separator), str (p.str) { }
528 
529  octave_value get (void) const
530  {
531  if (desired_type == string_t)
532  return octave_value (string_value ());
533  else
534  return octave_value (cell_value ());
535  }
536 
537  std::string string_value (void) const
538  {
539  std::string s;
540 
541  for (octave_idx_type i = 0; i < str.length (); i++)
542  {
543  s += str[i];
544  if (i != str.length () - 1)
545  s += separator;
546  }
547 
548  return s;
549  }
550 
551  Cell cell_value (void) const {return Cell (str);}
552 
553  string_vector string_vector_value (void) const { return str; }
554 
556  {
557  set (val);
558  return *this;
559  }
560 
561  base_property* clone (void) const
562  { return new string_array_property (*this); }
563 
564 protected:
565  bool do_set (const octave_value& val)
566  {
567  if (val.is_string () && val.rows () == 1)
568  {
569  bool replace = false;
570  std::string new_str = val.string_value ();
571  string_vector strings;
572  size_t pos = 0;
573 
574  // Split single string on delimiter (usually '|')
575  while (pos != std::string::npos)
576  {
577  size_t new_pos = new_str.find_first_of (separator, pos);
578 
579  if (new_pos == std::string::npos)
580  {
581  strings.append (new_str.substr (pos));
582  break;
583  }
584  else
585  strings.append (new_str.substr (pos, new_pos - pos));
586 
587  pos = new_pos + 1;
588  }
589 
590  if (str.numel () == strings.numel ())
591  {
592  for (octave_idx_type i = 0; i < str.numel (); i++)
593  if (strings[i] != str[i])
594  {
595  replace = true;
596  break;
597  }
598  }
599  else
600  replace = true;
601 
603 
604  if (replace)
605  {
606  str = strings;
607  return true;
608  }
609  }
610  else if (val.is_string ()) // multi-row character matrix
611  {
612  bool replace = false;
613  charMatrix chm = val.char_matrix_value ();
614  octave_idx_type nel = chm.rows ();
615  string_vector strings (nel);
616 
617  if (nel != str.numel ())
618  replace = true;
619  for (octave_idx_type i = 0; i < nel; i++)
620  {
621  strings[i] = chm.row_as_string (i);
622  if (!replace && strings[i] != str[i])
623  replace = true;
624  }
625 
627 
628  if (replace)
629  {
630  str = strings;
631  return true;
632  }
633  }
634  else if (val.is_cellstr ())
635  {
636  bool replace = false;
637  Cell new_cell = val.cell_value ();
638 
639  string_vector strings = new_cell.cellstr_value ();
640 
641  octave_idx_type nel = strings.length ();
642 
643  if (nel != str.length ())
644  replace = true;
645  else
646  {
647  for (octave_idx_type i = 0; i < nel; i++)
648  {
649  if (strings[i] != str[i])
650  {
651  replace = true;
652  break;
653  }
654  }
655  }
656 
658 
659  if (replace)
660  {
661  str = strings;
662  return true;
663  }
664  }
665  else
666  error ("set: invalid string property value for \"%s\"",
667  get_name ().c_str ());
668  return false;
669  }
670 
671 private:
673  char separator;
675 };
676 
677 // ---------------------------------------------------------------------
678 
680 {
681 public:
682  enum type { char_t, cellstr_t };
683 
684  text_label_property (const std::string& s, const graphics_handle& h,
685  const std::string& val = "")
686  : base_property (s, h), value (val), stored_type (char_t)
687  { }
688 
689  text_label_property (const std::string& s, const graphics_handle& h,
690  const NDArray& nda)
691  : base_property (s, h), stored_type (char_t)
692  {
693  octave_idx_type nel = nda.numel ();
694 
695  value.resize (nel);
696 
697  for (octave_idx_type i = 0; i < nel; i++)
698  {
699  std::ostringstream buf;
700  buf << nda(i);
701  value[i] = buf.str ();
702  }
703  }
704 
705  text_label_property (const std::string& s, const graphics_handle& h,
706  const Cell& c)
708  {
709  octave_idx_type nel = c.numel ();
710 
711  value.resize (nel);
712 
713  for (octave_idx_type i = 0; i < nel; i++)
714  {
715  octave_value tmp = c(i);
716 
717  if (tmp.is_string ())
718  value[i] = c(i).string_value ();
719  else
720  {
721  double d = c(i).double_value ();
722 
723  if (! error_state)
724  {
725  std::ostringstream buf;
726  buf << d;
727  value[i] = buf.str ();
728  }
729  else
730  break;
731  }
732  }
733  }
734 
737  { }
738 
739  bool empty (void) const
740  {
741  octave_value tmp = get ();
742  return tmp.is_empty ();
743  }
744 
745  octave_value get (void) const
746  {
747  if (stored_type == char_t)
748  return octave_value (char_value ());
749  else
750  return octave_value (cell_value ());
751  }
752 
753  std::string string_value (void) const
754  {
755  return value.empty () ? std::string () : value[0];
756  }
757 
758  string_vector string_vector_value (void) const { return value; }
759 
760  charMatrix char_value (void) const { return charMatrix (value, ' '); }
761 
762  Cell cell_value (void) const {return Cell (value); }
763 
765  {
766  set (val);
767  return *this;
768  }
769 
770  base_property* clone (void) const { return new text_label_property (*this); }
771 
772 protected:
773 
774  bool do_set (const octave_value& val)
775  {
776  if (val.is_string ())
777  {
778  value = val.all_strings ();
779 
781  }
782  else if (val.is_cell ())
783  {
784  Cell c = val.cell_value ();
785 
786  octave_idx_type nel = c.numel ();
787 
788  value.resize (nel);
789 
790  for (octave_idx_type i = 0; i < nel; i++)
791  {
792  octave_value tmp = c(i);
793 
794  if (tmp.is_string ())
795  value[i] = c(i).string_value ();
796  else
797  {
798  double d = c(i).double_value ();
799 
800  if (! error_state)
801  {
802  std::ostringstream buf;
803  buf << d;
804  value[i] = buf.str ();
805  }
806  else
807  return false;
808  }
809  }
810 
812  }
813  else
814  {
815  NDArray nda = val.array_value ();
816 
817  if (! error_state)
818  {
819  octave_idx_type nel = nda.numel ();
820 
821  value.resize (nel);
822 
823  for (octave_idx_type i = 0; i < nel; i++)
824  {
825  std::ostringstream buf;
826  buf << nda(i);
827  value[i] = buf.str ();
828  }
829 
831  }
832  else
833  {
834  error ("set: invalid string property value for \"%s\"",
835  get_name ().c_str ());
836 
837  return false;
838  }
839  }
840 
841  return true;
842  }
843 
844 private:
847 };
848 
849 // ---------------------------------------------------------------------
850 
852 {
853 public:
854  OCTINTERP_API radio_values (const std::string& opt_string = std::string ());
855 
856  radio_values (const radio_values& a)
858 
859  radio_values& operator = (const radio_values& a)
860  {
861  if (&a != this)
862  {
865  }
866 
867  return *this;
868  }
869 
870  std::string default_value (void) const { return default_val; }
871 
872  bool validate (const std::string& val, std::string& match)
873  {
874  bool retval = true;
875 
876  if (! contains (val, match))
877  {
878  error ("invalid value = %s", val.c_str ());
879  retval = false;
880  }
881 
882  return retval;
883  }
884 
885  bool contains (const std::string& val, std::string& match)
886  {
887  size_t k = 0;
888 
889  size_t len = val.length ();
890 
891  std::string first_match;
892 
893  for (std::set<caseless_str>::const_iterator p = possible_vals.begin ();
894  p != possible_vals.end (); p++)
895  {
896  if (p->compare (val, len))
897  {
898  if (len == p->length ())
899  {
900  // We found a full match (consider the case of val ==
901  // "replace" with possible values "replace" and
902  // "replacechildren"). Any other matches are
903  // irrelevant, so set match and return now.
904 
905  match = *p;
906  return true;
907  }
908  else
909  {
910  if (k == 0)
911  first_match = *p;
912 
913  k++;
914  }
915  }
916  }
917 
918  if (k == 1)
919  {
920  match = first_match;
921  return true;
922  }
923  else
924  return false;
925  }
926 
927  std::string values_as_string (void) const;
928 
929  Cell values_as_cell (void) const;
930 
931  octave_idx_type nelem (void) const { return possible_vals.size (); }
932 
933 private:
934  // Might also want to cache
935  std::string default_val;
936  std::set<caseless_str> possible_vals;
937 };
938 
940 {
941 public:
942  radio_property (const std::string& nm, const graphics_handle& h,
943  const radio_values& v = radio_values ())
944  : base_property (nm, h),
945  vals (v), current_val (v.default_value ()) { }
946 
947  radio_property (const std::string& nm, const graphics_handle& h,
948  const std::string& v)
949  : base_property (nm, h),
950  vals (v), current_val (vals.default_value ()) { }
951 
952  radio_property (const std::string& nm, const graphics_handle& h,
953  const radio_values& v, const std::string& def)
954  : base_property (nm, h),
955  vals (v), current_val (def) { }
956 
958  : base_property (p), vals (p.vals), current_val (p.current_val) { }
959 
960  octave_value get (void) const { return octave_value (current_val); }
961 
962  const std::string& current_value (void) const { return current_val; }
963 
964  std::string values_as_string (void) const { return vals.values_as_string (); }
965 
966  Cell values_as_cell (void) const { return vals.values_as_cell (); }
967 
968  bool is (const caseless_str& v) const
969  { return v.compare (current_val); }
970 
971  bool is_radio (void) const { return true; }
972 
974  {
975  set (val);
976  return *this;
977  }
978 
979  base_property* clone (void) const { return new radio_property (*this); }
980 
981 protected:
982  bool do_set (const octave_value& newval)
983  {
984  if (newval.is_string ())
985  {
986  std::string s = newval.string_value ();
987 
988  std::string match;
989 
990  if (vals.validate (s, match))
991  {
992  if (match != current_val)
993  {
994  if (s.length () != match.length ())
995  warning_with_id ("Octave:abbreviated-property-match",
996  "%s: allowing %s to match %s value %s",
997  "set", s.c_str (), get_name ().c_str (),
998  match.c_str ());
999  current_val = match;
1000  return true;
1001  }
1002  }
1003  else
1004  error ("set: invalid value for radio property \"%s\" (value = %s)",
1005  get_name ().c_str (), s.c_str ());
1006  }
1007  else
1008  error ("set: invalid value for radio property \"%s\"",
1009  get_name ().c_str ());
1010  return false;
1011  }
1012 
1013 private:
1015  std::string current_val;
1016 };
1017 
1018 // ---------------------------------------------------------------------
1019 
1021 {
1022 public:
1023  color_values (double r = 0, double g = 0, double b = 1)
1024  : xrgb (1, 3)
1025  {
1026  xrgb(0) = r;
1027  xrgb(1) = g;
1028  xrgb(2) = b;
1029 
1030  validate ();
1031  }
1032 
1033  color_values (std::string str)
1034  : xrgb (1, 3)
1035  {
1036  if (! str2rgb (str))
1037  error ("invalid color specification: %s", str.c_str ());
1038  }
1039 
1041  : xrgb (c.xrgb)
1042  { }
1043 
1045  {
1046  if (&c != this)
1047  xrgb = c.xrgb;
1048 
1049  return *this;
1050  }
1051 
1052  bool operator == (const color_values& c) const
1053  {
1054  return (xrgb(0) == c.xrgb(0)
1055  && xrgb(1) == c.xrgb(1)
1056  && xrgb(2) == c.xrgb(2));
1057  }
1058 
1059  bool operator != (const color_values& c) const
1060  { return ! (*this == c); }
1061 
1062  Matrix rgb (void) const { return xrgb; }
1063 
1064  operator octave_value (void) const { return xrgb; }
1065 
1066  void validate (void) const
1067  {
1068  for (int i = 0; i < 3; i++)
1069  {
1070  if (xrgb(i) < 0 || xrgb(i) > 1)
1071  {
1072  error ("invalid RGB color specification");
1073  break;
1074  }
1075  }
1076  }
1077 
1078 private:
1080 
1081  OCTINTERP_API bool str2rgb (std::string str);
1082 };
1083 
1085 {
1086 public:
1088  : base_property ("", graphics_handle ()),
1090  current_val (v.default_value ())
1091  { }
1092 
1094  : base_property ("", graphics_handle ()),
1096  current_val (v.default_value ())
1097  { }
1098 
1099  color_property (const std::string& nm, const graphics_handle& h,
1100  const color_values& c = color_values (),
1101  const radio_values& v = radio_values ())
1102  : base_property (nm, h),
1104  current_val (v.default_value ())
1105  { }
1106 
1107  color_property (const std::string& nm, const graphics_handle& h,
1108  const radio_values& v)
1109  : base_property (nm, h),
1111  current_val (v.default_value ())
1112  { }
1113 
1114  color_property (const std::string& nm, const graphics_handle& h,
1115  const std::string& v)
1116  : base_property (nm, h),
1118  current_val (radio_val.default_value ())
1119  { }
1120 
1121  color_property (const std::string& nm, const graphics_handle& h,
1122  const color_property& v)
1123  : base_property (nm, h),
1126  { }
1127 
1131  current_val (p.current_val) { }
1132 
1133  octave_value get (void) const
1134  {
1135  if (current_type == color_t)
1136  return color_val.rgb ();
1137 
1138  return current_val;
1139  }
1140 
1141  bool is_rgb (void) const { return (current_type == color_t); }
1142 
1143  bool is_radio (void) const { return (current_type == radio_t); }
1144 
1145  bool is (const std::string& v) const
1146  { return (is_radio () && current_val == v); }
1147 
1148  Matrix rgb (void) const
1149  {
1150  if (current_type != color_t)
1151  error ("color has no rgb value");
1152 
1153  return color_val.rgb ();
1154  }
1155 
1156  const std::string& current_value (void) const
1157  {
1158  if (current_type != radio_t)
1159  error ("color has no radio value");
1160 
1161  return current_val;
1162  }
1163 
1165  {
1166  set (val);
1167  return *this;
1168  }
1169 
1170  operator octave_value (void) const { return get (); }
1171 
1172  base_property* clone (void) const { return new color_property (*this); }
1173 
1174  std::string values_as_string (void) const
1175  { return radio_val.values_as_string (); }
1176 
1177  Cell values_as_cell (void) const { return radio_val.values_as_cell (); }
1178 
1179 protected:
1180  OCTINTERP_API bool do_set (const octave_value& newval);
1181 
1182 private:
1186  std::string current_val;
1187 };
1188 
1189 // ---------------------------------------------------------------------
1190 
1192 {
1193 public:
1194  double_property (const std::string& nm, const graphics_handle& h,
1195  double d = 0)
1196  : base_property (nm, h),
1197  current_val (d) { }
1198 
1200  : base_property (p), current_val (p.current_val) { }
1201 
1202  octave_value get (void) const { return octave_value (current_val); }
1203 
1204  double double_value (void) const { return current_val; }
1205 
1207  {
1208  set (val);
1209  return *this;
1210  }
1211 
1212  base_property* clone (void) const { return new double_property (*this); }
1213 
1214 protected:
1215  bool do_set (const octave_value& v)
1216  {
1217  if (v.is_scalar_type () && v.is_real_type ())
1218  {
1219  double new_val = v.double_value ();
1220 
1221  if (new_val != current_val)
1222  {
1223  current_val = new_val;
1224  return true;
1225  }
1226  }
1227  else
1228  error ("set: invalid value for double property \"%s\"",
1229  get_name ().c_str ());
1230  return false;
1231  }
1232 
1233 private:
1234  double current_val;
1235 };
1236 
1237 // ---------------------------------------------------------------------
1238 
1240 {
1241 public:
1243  : base_property ("", graphics_handle ()),
1244  current_type (double_t), dval (d), radio_val (v),
1245  current_val (v.default_value ())
1246  { }
1247 
1248  double_radio_property (const std::string& nm, const graphics_handle& h,
1249  const std::string& v)
1250  : base_property (nm, h),
1251  current_type (radio_t), dval (0), radio_val (v),
1252  current_val (radio_val.default_value ())
1253  { }
1254 
1255  double_radio_property (const std::string& nm, const graphics_handle& h,
1256  const double_radio_property& v)
1257  : base_property (nm, h),
1260  { }
1261 
1264  dval (p.dval), radio_val (p.radio_val),
1265  current_val (p.current_val) { }
1266 
1267  octave_value get (void) const
1268  {
1269  if (current_type == double_t)
1270  return dval;
1271 
1272  return current_val;
1273  }
1274 
1275  bool is_double (void) const { return (current_type == double_t); }
1276 
1277  bool is_radio (void) const { return (current_type == radio_t); }
1278 
1279  bool is (const std::string& v) const
1280  { return (is_radio () && current_val == v); }
1281 
1282  double double_value (void) const
1283  {
1284  if (current_type != double_t)
1285  error ("%s: property has no double", get_name ().c_str ());
1286 
1287  return dval;
1288  }
1289 
1290  const std::string& current_value (void) const
1291  {
1292  if (current_type != radio_t)
1293  error ("%s: property has no radio value");
1294 
1295  return current_val;
1296  }
1297 
1299  {
1300  set (val);
1301  return *this;
1302  }
1303 
1304  operator octave_value (void) const { return get (); }
1305 
1306  base_property* clone (void) const
1307  { return new double_radio_property (*this); }
1308 
1309 protected:
1310  OCTINTERP_API bool do_set (const octave_value& v);
1311 
1312 private:
1314  double dval;
1316  std::string current_val;
1317 };
1318 
1319 // ---------------------------------------------------------------------
1320 
1322 {
1323 public:
1325  : base_property ("", graphics_handle ()), data (Matrix ()),
1326  xmin (), xmax (), xminp (), xmaxp (),
1328  {
1329  get_data_limits ();
1330  }
1331 
1332  array_property (const std::string& nm, const graphics_handle& h,
1333  const octave_value& m)
1334  : base_property (nm, h), data (m.is_sparse_type () ? m.full_value () : m),
1335  xmin (), xmax (), xminp (), xmaxp (),
1337  {
1338  get_data_limits ();
1339  }
1340 
1341  // This copy constructor is only intended to be used
1342  // internally to access min/max values; no need to
1343  // copy constraints.
1345  : base_property (p), data (p.data),
1346  xmin (p.xmin), xmax (p.xmax), xminp (p.xminp), xmaxp (p.xmaxp),
1348  { }
1349 
1350  octave_value get (void) const { return data; }
1351 
1352  void add_constraint (const std::string& type)
1353  { type_constraints.insert (type); }
1354 
1355  void add_constraint (const dim_vector& dims)
1356  { size_constraints.push_back (dims); }
1357 
1358  double min_val (void) const { return xmin; }
1359  double max_val (void) const { return xmax; }
1360  double min_pos (void) const { return xminp; }
1361  double max_neg (void) const { return xmaxp; }
1362 
1363  Matrix get_limits (void) const
1364  {
1365  Matrix m (1, 4);
1366 
1367  m(0) = min_val ();
1368  m(1) = max_val ();
1369  m(2) = min_pos ();
1370  m(3) = max_neg ();
1371 
1372  return m;
1373  }
1374 
1376  {
1377  set (val);
1378  return *this;
1379  }
1380 
1381  base_property* clone (void) const
1382  {
1383  array_property *p = new array_property (*this);
1384 
1387 
1388  return p;
1389  }
1390 
1391 protected:
1392  bool do_set (const octave_value& v)
1393  {
1394  octave_value tmp = v.is_sparse_type () ? v.full_value () : v;
1395 
1396  if (validate (tmp))
1397  {
1398  // FIXME: should we check for actual data change?
1399  if (! is_equal (tmp))
1400  {
1401  data = tmp;
1402 
1403  get_data_limits ();
1404 
1405  return true;
1406  }
1407  }
1408  else
1409  error ("invalid value for array property \"%s\"",
1410  get_name ().c_str ());
1411 
1412  return false;
1413  }
1414 
1415 private:
1416  OCTINTERP_API bool validate (const octave_value& v);
1417 
1418  OCTINTERP_API bool is_equal (const octave_value& v) const;
1419 
1420  OCTINTERP_API void get_data_limits (void);
1421 
1422 protected:
1424  double xmin;
1425  double xmax;
1426  double xminp;
1427  double xmaxp;
1428  std::set<std::string> type_constraints;
1429  std::list<dim_vector> size_constraints;
1430 };
1431 
1433 {
1434 public:
1435  row_vector_property (const std::string& nm, const graphics_handle& h,
1436  const octave_value& m)
1437  : array_property (nm, h, m)
1438  {
1439  add_constraint (dim_vector (-1, 1));
1440  add_constraint (dim_vector (1, -1));
1441  add_constraint (dim_vector (0, 0));
1442  }
1443 
1445  : array_property (p)
1446  {
1447  add_constraint (dim_vector (-1, 1));
1448  add_constraint (dim_vector (1, -1));
1449  add_constraint (dim_vector (0, 0));
1450  }
1451 
1452  void add_constraint (const std::string& type)
1453  {
1455  }
1456 
1457  void add_constraint (const dim_vector& dims)
1458  {
1460  }
1461 
1463  {
1464  size_constraints.remove (dim_vector (1, -1));
1465  size_constraints.remove (dim_vector (-1, 1));
1466 
1467  add_constraint (dim_vector (1, len));
1468  add_constraint (dim_vector (len, 1));
1469  }
1470 
1472  {
1473  set (val);
1474  return *this;
1475  }
1476 
1477  base_property* clone (void) const
1478  {
1479  row_vector_property *p = new row_vector_property (*this);
1480 
1483 
1484  return p;
1485  }
1486 
1487 protected:
1488  bool do_set (const octave_value& v)
1489  {
1490  bool retval = array_property::do_set (v);
1491 
1492  if (! error_state)
1493  {
1494  dim_vector dv = data.dims ();
1495 
1496  if (dv(0) > 1 && dv(1) == 1)
1497  {
1498  int tmp = dv(0);
1499  dv(0) = dv(1);
1500  dv(1) = tmp;
1501 
1502  data = data.reshape (dv);
1503  }
1504 
1505  return retval;
1506  }
1507 
1508  return false;
1509  }
1510 
1511 private:
1512  OCTINTERP_API bool validate (const octave_value& v);
1513 };
1514 
1515 // ---------------------------------------------------------------------
1516 
1518 {
1519 public:
1520  bool_property (const std::string& nm, const graphics_handle& h,
1521  bool val)
1522  : radio_property (nm, h, radio_values (val ? "{on}|off" : "on|{off}"))
1523  { }
1524 
1525  bool_property (const std::string& nm, const graphics_handle& h,
1526  const char* val)
1527  : radio_property (nm, h, radio_values ("on|off"), val)
1528  { }
1529 
1531  : radio_property (p) { }
1532 
1533  bool is_on (void) const { return is ("on"); }
1534 
1536  {
1537  set (val);
1538  return *this;
1539  }
1540 
1541  base_property* clone (void) const { return new bool_property (*this); }
1542 
1543 protected:
1544  bool do_set (const octave_value& val)
1545  {
1546  if (val.is_bool_scalar ())
1547  return radio_property::do_set (val.bool_value () ? "on" : "off");
1548  else
1549  return radio_property::do_set (val);
1550  }
1551 };
1552 
1553 // ---------------------------------------------------------------------
1554 
1556 {
1557 public:
1558  handle_property (const std::string& nm, const graphics_handle& h,
1559  const graphics_handle& val = graphics_handle ())
1560  : base_property (nm, h),
1561  current_val (val) { }
1562 
1564  : base_property (p), current_val (p.current_val) { }
1565 
1566  octave_value get (void) const { return current_val.as_octave_value (); }
1567 
1568  graphics_handle handle_value (void) const { return current_val; }
1569 
1571  {
1572  set (val);
1573  return *this;
1574  }
1575 
1577  {
1578  set (octave_value (h.value ()));
1579  return *this;
1580  }
1581 
1582  base_property* clone (void) const { return new handle_property (*this); }
1583 
1584 protected:
1585  OCTINTERP_API bool do_set (const octave_value& v);
1586 
1587 private:
1589 };
1590 
1591 // ---------------------------------------------------------------------
1592 
1594 {
1595 public:
1596  any_property (const std::string& nm, const graphics_handle& h,
1597  const octave_value& m = Matrix ())
1598  : base_property (nm, h), data (m) { }
1599 
1601  : base_property (p), data (p.data) { }
1602 
1603  octave_value get (void) const { return data; }
1604 
1606  {
1607  set (val);
1608  return *this;
1609  }
1610 
1611  base_property* clone (void) const { return new any_property (*this); }
1612 
1613 protected:
1614  bool do_set (const octave_value& v)
1615  {
1616  data = v;
1617  return true;
1618  }
1619 
1620 private:
1622 };
1623 
1624 // ---------------------------------------------------------------------
1625 
1627 {
1628 public:
1631  {
1632  do_init_children (Matrix ());
1633  }
1634 
1635  children_property (const std::string& nm, const graphics_handle& h,
1636  const Matrix &val)
1637  : base_property (nm, h), children_list ()
1638  {
1639  do_init_children (val);
1640  }
1641 
1643  : base_property (p), children_list ()
1644  {
1646  }
1647 
1649  {
1650  set (val);
1651  return *this;
1652  }
1653 
1654  base_property* clone (void) const { return new children_property (*this); }
1655 
1656  bool remove_child (const double &val)
1657  {
1658  return do_remove_child (val);
1659  }
1660 
1661  void adopt (const double &val)
1662  {
1663  do_adopt_child (val);
1664  }
1665 
1666  Matrix get_children (void) const
1667  {
1668  return do_get_children (false);
1669  }
1670 
1671  Matrix get_hidden (void) const
1672  {
1673  return do_get_children (true);
1674  }
1675 
1676  Matrix get_all (void) const
1677  {
1678  return do_get_all_children ();
1679  }
1680 
1681  octave_value get (void) const
1682  {
1683  return octave_value (get_children ());
1684  }
1685 
1686  void delete_children (bool clear = false)
1687  {
1689  }
1690 
1692  {
1693  for (children_list_iterator p = children_list.begin ();
1694  p != children_list.end (); p++)
1695  {
1696  if (*p == old_gh)
1697  {
1698  *p = new_gh.value ();
1699  return;
1700  }
1701  }
1702 
1703  error ("children_list::renumber: child not found!");
1704  }
1705 
1706 private:
1707  typedef std::list<double>::iterator children_list_iterator;
1708  typedef std::list<double>::const_iterator const_children_list_iterator;
1709  std::list<double> children_list;
1710 
1711 protected:
1712  bool do_set (const octave_value& val)
1713  {
1714  const Matrix new_kids = val.matrix_value ();
1715 
1716  octave_idx_type nel = new_kids.numel ();
1717 
1718  const Matrix new_kids_column = new_kids.reshape (dim_vector (nel, 1));
1719 
1720  bool is_ok = true;
1721 
1722  if (! error_state)
1723  {
1724  const Matrix visible_kids = do_get_children (false);
1725 
1726  if (visible_kids.numel () == new_kids.numel ())
1727  {
1728  Matrix t1 = visible_kids.sort ();
1729  Matrix t2 = new_kids_column.sort ();
1730 
1731  if (t1 != t2)
1732  is_ok = false;
1733  }
1734  else
1735  is_ok = false;
1736 
1737  if (! is_ok)
1738  error ("set: new children must be a permutation of existing children");
1739  }
1740  else
1741  {
1742  is_ok = false;
1743  error ("set: expecting children to be array of graphics handles");
1744  }
1745 
1746  if (is_ok)
1747  {
1748  Matrix tmp = new_kids_column.stack (get_hidden ());
1749 
1750  children_list.clear ();
1751 
1752  // Don't use do_init_children here, as that reverses the
1753  // order of the list, and we don't want to do that if setting
1754  // the child list directly.
1755 
1756  for (octave_idx_type i = 0; i < tmp.numel (); i++)
1757  children_list.push_back (tmp.xelem (i));
1758  }
1759 
1760  return is_ok;
1761  }
1762 
1763 private:
1764  void do_init_children (const Matrix &val)
1765  {
1766  children_list.clear ();
1767  for (octave_idx_type i = 0; i < val.numel (); i++)
1768  children_list.push_front (val.xelem (i));
1769  }
1770 
1771  void do_init_children (const std::list<double> &val)
1772  {
1773  children_list.clear ();
1774  for (const_children_list_iterator p = val.begin (); p != val.end (); p++)
1775  children_list.push_front (*p);
1776  }
1777 
1778  Matrix do_get_children (bool return_hidden) const;
1779 
1781  {
1782  Matrix retval (children_list.size (), 1);
1783  octave_idx_type i = 0;
1784 
1785  for (const_children_list_iterator p = children_list.begin ();
1786  p != children_list.end (); p++)
1787  retval(i++) = *p;
1788  return retval;
1789  }
1790 
1791  bool do_remove_child (double child)
1792  {
1793  for (children_list_iterator p = children_list.begin ();
1794  p != children_list.end (); p++)
1795  {
1796  if (*p == child)
1797  {
1798  children_list.erase (p);
1799  return true;
1800  }
1801  }
1802  return false;
1803  }
1804 
1805  void do_adopt_child (const double &val)
1806  {
1807  children_list.push_front (val);
1808  }
1809 
1810  void do_delete_children (bool clear);
1811 };
1812 
1813 
1814 
1815 // ---------------------------------------------------------------------
1816 
1818 {
1819 public:
1820  callback_property (const std::string& nm, const graphics_handle& h,
1821  const octave_value& m)
1822  : base_property (nm, h), callback (m), executing (false) { }
1823 
1825  : base_property (p), callback (p.callback), executing (false) { }
1826 
1827  octave_value get (void) const { return callback; }
1828 
1829  OCTINTERP_API void execute (const octave_value& data = octave_value ()) const;
1830 
1831  bool is_defined (void) const
1832  {
1833  return (callback.is_defined () && ! callback.is_empty ());
1834  }
1835 
1837  {
1838  set (val);
1839  return *this;
1840  }
1841 
1842  base_property* clone (void) const { return new callback_property (*this); }
1843 
1844 protected:
1845  bool do_set (const octave_value& v)
1846  {
1847  if (validate (v))
1848  {
1849  callback = v;
1850  return true;
1851  }
1852  else
1853  error ("invalid value for callback property \"%s\"",
1854  get_name ().c_str ());
1855  return false;
1856  }
1857 
1858 private:
1859  OCTINTERP_API bool validate (const octave_value& v) const;
1860 
1861 private:
1863 
1864  // If TRUE, we are executing this callback.
1865  mutable bool executing;
1866 };
1867 
1868 // ---------------------------------------------------------------------
1869 
1871 {
1872 public:
1873  property (void) : rep (new base_property ("", graphics_handle ()))
1874  { }
1875 
1876  property (base_property *bp, bool persist = false) : rep (bp)
1877  { if (persist) rep->count++; }
1878 
1879  property (const property& p) : rep (p.rep)
1880  {
1881  rep->count++;
1882  }
1883 
1884  ~property (void)
1885  {
1886  if (--rep->count == 0)
1887  delete rep;
1888  }
1889 
1890  bool ok (void) const
1891  { return rep->ok (); }
1892 
1893  std::string get_name (void) const
1894  { return rep->get_name (); }
1895 
1896  void set_name (const std::string& name)
1897  { rep->set_name (name); }
1898 
1900  { return rep->get_parent (); }
1901 
1902  void set_parent (const graphics_handle& h)
1903  { rep->set_parent (h); }
1904 
1905  bool is_hidden (void) const
1906  { return rep->is_hidden (); }
1907 
1908  void set_hidden (bool flag)
1909  { rep->set_hidden (flag); }
1910 
1911  bool is_radio (void) const
1912  { return rep->is_radio (); }
1913 
1914  int get_id (void) const
1915  { return rep->get_id (); }
1916 
1917  void set_id (int d)
1918  { rep->set_id (d); }
1919 
1920  octave_value get (void) const
1921  { return rep->get (); }
1922 
1923  bool set (const octave_value& val, bool do_run = true,
1924  bool do_notify_toolkit = true)
1925  { return rep->set (val, do_run, do_notify_toolkit); }
1926 
1927  std::string values_as_string (void) const
1928  { return rep->values_as_string (); }
1929 
1930  Cell values_as_cell (void) const
1931  { return rep->values_as_cell (); }
1932 
1933  property& operator = (const octave_value& val)
1934  {
1935  *rep = val;
1936  return *this;
1937  }
1938 
1939  property& operator = (const property& p)
1940  {
1941  if (rep && --rep->count == 0)
1942  delete rep;
1943 
1944  rep = p.rep;
1945  rep->count++;
1946 
1947  return *this;
1948  }
1949 
1951  { rep->add_listener (v, mode); }
1952 
1954  listener_mode mode = POSTSET)
1955  { rep->delete_listener (v, mode); }
1956 
1958  { rep->run_listeners (mode); }
1959 
1960  OCTINTERP_API static
1961  property create (const std::string& name, const graphics_handle& parent,
1962  const caseless_str& type,
1963  const octave_value_list& args);
1964 
1965  property clone (void) const
1966  { return property (rep->clone ()); }
1967 
1968  /*
1969  const string_property& as_string_property (void) const
1970  { return *(dynamic_cast<string_property*> (rep)); }
1971 
1972  const radio_property& as_radio_property (void) const
1973  { return *(dynamic_cast<radio_property*> (rep)); }
1974 
1975  const color_property& as_color_property (void) const
1976  { return *(dynamic_cast<color_property*> (rep)); }
1977 
1978  const double_property& as_double_property (void) const
1979  { return *(dynamic_cast<double_property*> (rep)); }
1980 
1981  const bool_property& as_bool_property (void) const
1982  { return *(dynamic_cast<bool_property*> (rep)); }
1983 
1984  const handle_property& as_handle_property (void) const
1985  { return *(dynamic_cast<handle_property*> (rep)); }
1986  */
1987 
1988 private:
1990 };
1991 
1992 // ---------------------------------------------------------------------
1993 
1995 {
1996 public:
1997  typedef std::map<std::string, octave_value> pval_map_type;
1998  typedef std::map<std::string, pval_map_type> plist_map_type;
1999 
2000  typedef pval_map_type::iterator pval_map_iterator;
2001  typedef pval_map_type::const_iterator pval_map_const_iterator;
2002 
2003  typedef plist_map_type::iterator plist_map_iterator;
2004  typedef plist_map_type::const_iterator plist_map_const_iterator;
2005 
2007  : plist_map (m) { }
2008 
2009  ~property_list (void) { }
2010 
2011  void set (const caseless_str& name, const octave_value& val);
2012 
2013  octave_value lookup (const caseless_str& name) const;
2014 
2015  plist_map_iterator begin (void) { return plist_map.begin (); }
2016  plist_map_const_iterator begin (void) const { return plist_map.begin (); }
2017 
2018  plist_map_iterator end (void) { return plist_map.end (); }
2019  plist_map_const_iterator end (void) const { return plist_map.end (); }
2020 
2021  plist_map_iterator find (const std::string& go_name)
2022  {
2023  return plist_map.find (go_name);
2024  }
2025 
2026  plist_map_const_iterator find (const std::string& go_name) const
2027  {
2028  return plist_map.find (go_name);
2029  }
2030 
2031  octave_scalar_map as_struct (const std::string& prefix_arg) const;
2032 
2033 private:
2035 };
2036 
2037 // ---------------------------------------------------------------------
2038 
2039 class graphics_toolkit;
2040 class graphics_object;
2041 
2043 {
2044 public:
2045  friend class graphics_toolkit;
2046 
2047 public:
2048  base_graphics_toolkit (const std::string& nm)
2049  : name (nm), count (0) { }
2050 
2051  virtual ~base_graphics_toolkit (void) { }
2052 
2053  std::string get_name (void) const { return name; }
2054 
2055  virtual bool is_valid (void) const { return false; }
2056 
2057  virtual void redraw_figure (const graphics_object&) const
2058  { gripe_invalid ("redraw_figure"); }
2059 
2060  virtual void print_figure (const graphics_object&, const std::string&,
2061  const std::string&, bool,
2062  const std::string& = "") const
2063  { gripe_invalid ("print_figure"); }
2064 
2065  virtual Matrix get_canvas_size (const graphics_handle&) const
2066  {
2067  gripe_invalid ("get_canvas_size");
2068  return Matrix (1, 2, 0.0);
2069  }
2070 
2071  virtual double get_screen_resolution (void) const
2072  {
2073  gripe_invalid ("get_screen_resolution");
2074  return 72.0;
2075  }
2076 
2077  virtual Matrix get_screen_size (void) const
2078  {
2079  gripe_invalid ("get_screen_size");
2080  return Matrix (1, 2, 0.0);
2081  }
2082 
2083  // Callback function executed when the given graphics object
2084  // changes. This allows the graphics toolkit to act on property
2085  // changes if needed.
2086  virtual void update (const graphics_object&, int)
2087  { gripe_invalid ("base_graphics_toolkit::update"); }
2088 
2089  void update (const graphics_handle&, int);
2090 
2091  // Callback function executed when the given graphics object is
2092  // created. This allows the graphics toolkit to do toolkit-specific
2093  // initializations for a newly created object.
2094  virtual bool initialize (const graphics_object&)
2095  { gripe_invalid ("base_graphics_toolkit::initialize"); return false; }
2096 
2097  bool initialize (const graphics_handle&);
2098 
2099  // Callback function executed just prior to deleting the given
2100  // graphics object. This allows the graphics toolkit to perform
2101  // toolkit-specific cleanup operations before an object is deleted.
2102  virtual void finalize (const graphics_object&)
2103  { gripe_invalid ("base_graphics_toolkit::finalize"); }
2104 
2105  void finalize (const graphics_handle&);
2106 
2107  // Close the graphics toolkit.
2108  virtual void close (void)
2109  { gripe_invalid ("base_graphics_toolkit::close"); }
2110 
2111 private:
2112  std::string name;
2114 
2115 private:
2116  void gripe_invalid (const std::string& fname) const
2117  {
2118  if (! is_valid ())
2119  error ("%s: invalid graphics toolkit", fname.c_str ());
2120  }
2121 };
2122 
2124 {
2125 public:
2127  : rep (new base_graphics_toolkit ("unknown"))
2128  {
2129  rep->count++;
2130  }
2131 
2133  : rep (b)
2134  {
2135  rep->count++;
2136  }
2137 
2139  : rep (b.rep)
2140  {
2141  rep->count++;
2142  }
2143 
2145  {
2146  if (--rep->count == 0)
2147  delete rep;
2148  }
2149 
2151  {
2152  if (rep != b.rep)
2153  {
2154  if (--rep->count == 0)
2155  delete rep;
2156 
2157  rep = b.rep;
2158  rep->count++;
2159  }
2160 
2161  return *this;
2162  }
2163 
2164  operator bool (void) const { return rep->is_valid (); }
2165 
2166  std::string get_name (void) const { return rep->get_name (); }
2167 
2168  void redraw_figure (const graphics_object& go) const
2169  { rep->redraw_figure (go); }
2170 
2171  void print_figure (const graphics_object& go, const std::string& term,
2172  const std::string& file, bool mono,
2173  const std::string& debug_file = "") const
2174  { rep->print_figure (go, term, file, mono, debug_file); }
2175 
2177  { return rep->get_canvas_size (fh); }
2178 
2179  double get_screen_resolution (void) const
2180  { return rep->get_screen_resolution (); }
2181 
2183  { return rep->get_screen_size (); }
2184 
2185  // Notifies graphics toolkit that object't property has changed.
2186  void update (const graphics_object& go, int id)
2187  { rep->update (go, id); }
2188 
2189  void update (const graphics_handle& h, int id)
2190  { rep->update (h, id); }
2191 
2192  // Notifies graphics toolkit that new object was created.
2193  bool initialize (const graphics_object& go)
2194  { return rep->initialize (go); }
2195 
2196  bool initialize (const graphics_handle& h)
2197  { return rep->initialize (h); }
2198 
2199  // Notifies graphics toolkit that object was destroyed.
2200  // This is called only for explicitly deleted object. Children are
2201  // deleted implicitly and graphics toolkit isn't notified.
2202  void finalize (const graphics_object& go)
2203  { rep->finalize (go); }
2204 
2205  void finalize (const graphics_handle& h)
2206  { rep->finalize (h); }
2207 
2208  // Close the graphics toolkit.
2209  void close (void) { rep->close (); }
2210 
2211 private:
2212 
2214 };
2215 
2217 {
2218 public:
2219 
2221  {
2222  return instance_ok () ? instance->do_get_toolkit () : graphics_toolkit ();
2223  }
2224 
2225  static void register_toolkit (const std::string& name)
2226  {
2227  if (instance_ok ())
2228  instance->do_register_toolkit (name);
2229  }
2230 
2231  static void unregister_toolkit (const std::string& name)
2232  {
2233  if (instance_ok ())
2235  }
2236 
2237  static void load_toolkit (const graphics_toolkit& tk)
2238  {
2239  if (instance_ok ())
2240  instance->do_load_toolkit (tk);
2241  }
2242 
2243  static void unload_toolkit (const std::string& name)
2244  {
2245  if (instance_ok ())
2246  instance->do_unload_toolkit (name);
2247  }
2248 
2249  static graphics_toolkit find_toolkit (const std::string& name)
2250  {
2251  return instance_ok ()
2252  ? instance->do_find_toolkit (name) : graphics_toolkit ();
2253  }
2254 
2256  {
2257  return instance_ok () ? instance->do_available_toolkits_list () : Cell ();
2258  }
2259 
2261  {
2262  return instance_ok () ? instance->do_loaded_toolkits_list () : Cell ();
2263  }
2264 
2265  static void unload_all_toolkits (void)
2266  {
2267  if (instance_ok ())
2269  }
2270 
2271  static std::string default_toolkit (void)
2272  {
2273  return instance_ok () ? instance->do_default_toolkit () : std::string ();
2274  }
2275 
2276 private:
2277 
2278  gtk_manager (void);
2279 
2280  ~gtk_manager (void) { }
2281 
2282  OCTINTERP_API static void create_instance (void);
2283 
2284  static bool instance_ok (void)
2285  {
2286  bool retval = true;
2287 
2288  if (! instance)
2289  create_instance ();
2290 
2291  if (! instance)
2292  {
2293  ::error ("unable to create gh_manager!");
2294 
2295  retval = false;
2296  }
2297 
2298  return retval;
2299  }
2300 
2301  static void cleanup_instance (void) { delete instance; instance = 0; }
2302 
2304 
2305  // The name of the default toolkit.
2306  std::string dtk;
2307 
2308  // The list of toolkits that we know about.
2309  std::set<std::string> available_toolkits;
2310 
2311  // The list of toolkits we have actually loaded.
2312  std::map<std::string, graphics_toolkit> loaded_toolkits;
2313 
2314  typedef std::set<std::string>::iterator available_toolkits_iterator;
2315 
2316  typedef std::set<std::string>::const_iterator
2318 
2319  typedef std::map<std::string, graphics_toolkit>::iterator
2321 
2322  typedef std::map<std::string, graphics_toolkit>::const_iterator
2324 
2325  graphics_toolkit do_get_toolkit (void) const;
2326 
2327  void do_register_toolkit (const std::string& name)
2328  {
2329  available_toolkits.insert (name);
2330  }
2331 
2332  void do_unregister_toolkit (const std::string& name)
2333  {
2334  available_toolkits.erase (name);
2335  }
2336 
2338  {
2339  loaded_toolkits[tk.get_name ()] = tk;
2340  }
2341 
2342  void do_unload_toolkit (const std::string& name)
2343  {
2344  loaded_toolkits.erase (name);
2345  }
2346 
2347  graphics_toolkit do_find_toolkit (const std::string& name) const
2348  {
2350 
2351  if (p != loaded_toolkits.end ())
2352  return p->second;
2353  else
2354  return graphics_toolkit ();
2355  }
2356 
2358  {
2359  Cell m (1 , available_toolkits.size ());
2360 
2361  octave_idx_type i = 0;
2363  p != available_toolkits.end (); p++)
2364  m(i++) = *p;
2365 
2366  return m;
2367  }
2368 
2370  {
2371  Cell m (1 , loaded_toolkits.size ());
2372 
2373  octave_idx_type i = 0;
2375  p != loaded_toolkits.end (); p++)
2376  m(i++) = p->first;
2377 
2378  return m;
2379  }
2380 
2382  {
2383  while (! loaded_toolkits.empty ())
2384  {
2386 
2387  std::string name = p->first;
2388 
2389  p->second.close ();
2390 
2391  // The toolkit may have unloaded itself. If not, we'll do
2392  // it here.
2393  if (loaded_toolkits.find (name) != loaded_toolkits.end ())
2394  unload_toolkit (name);
2395  }
2396  }
2397 
2398  std::string do_default_toolkit (void) { return dtk; }
2399 };
2400 
2401 // ---------------------------------------------------------------------
2402 
2403 class base_graphics_object;
2404 class graphics_object;
2405 
2407 {
2408 public:
2409  base_properties (const std::string& ty = "unknown",
2410  const graphics_handle& mh = graphics_handle (),
2411  const graphics_handle& p = graphics_handle ());
2412 
2413  virtual ~base_properties (void) { }
2414 
2415  virtual std::string graphics_object_name (void) const { return "unknown"; }
2416 
2417  void mark_modified (void);
2418 
2419  void override_defaults (base_graphics_object& obj);
2420 
2421  virtual void init_integerhandle (const octave_value&)
2422  {
2423  panic_impossible ();
2424  }
2425 
2426  // Look through DEFAULTS for properties with given CLASS_NAME, and
2427  // apply them to the current object with set (virtual method).
2428 
2429  void set_from_list (base_graphics_object& obj, property_list& defaults);
2430 
2431  void insert_property (const std::string& name, property p)
2432  {
2433  p.set_name (name);
2434  p.set_parent (__myhandle__);
2435  all_props[name] = p;
2436  }
2437 
2438  virtual void set (const caseless_str&, const octave_value&);
2439 
2440  virtual octave_value get (const caseless_str& pname) const;
2441 
2442  virtual octave_value get (const std::string& pname) const
2443  {
2444  return get (caseless_str (pname));
2445  }
2446 
2447  virtual octave_value get (const char *pname) const
2448  {
2449  return get (caseless_str (pname));
2450  }
2451 
2452  virtual octave_value get (bool all = false) const;
2453 
2454  virtual property get_property (const caseless_str& pname);
2455 
2456  virtual bool has_property (const caseless_str&) const
2457  {
2458  panic_impossible ();
2459  return false;
2460  }
2461 
2462  bool is_modified (void) const { return is___modified__ (); }
2463 
2464  virtual void remove_child (const graphics_handle& h)
2465  {
2466  if (children.remove_child (h.value ()))
2467  mark_modified ();
2468  }
2469 
2470  virtual void adopt (const graphics_handle& h)
2471  {
2472  children.adopt (h.value ());
2473  mark_modified ();
2474  }
2475 
2476  virtual graphics_toolkit get_toolkit (void) const;
2477 
2478  virtual Matrix
2479  get_boundingbox (bool /*internal*/ = false,
2480  const Matrix& /*parent_pix_size*/ = Matrix ()) const
2481  { return Matrix (1, 4, 0.0); }
2482 
2483  virtual void update_boundingbox (void);
2484 
2485  virtual void update_autopos (const std::string& elem_type);
2486 
2487  virtual void add_listener (const caseless_str&, const octave_value&,
2489 
2490  virtual void delete_listener (const caseless_str&, const octave_value&,
2492 
2493  void set_tag (const octave_value& val) { tag = val; }
2494 
2495  void set_parent (const octave_value& val);
2496 
2497  Matrix get_children (void) const
2498  {
2499  return children.get_children ();
2500  }
2501 
2502  Matrix get_all_children (void) const
2503  {
2504  return children.get_all ();
2505  }
2506 
2507  Matrix get_hidden_children (void) const
2508  {
2509  return children.get_hidden ();
2510  }
2511 
2512  void set_modified (const octave_value& val) { set___modified__ (val); }
2513 
2514  void set___modified__ (const octave_value& val) { __modified__ = val; }
2515 
2516  void reparent (const graphics_handle& new_parent) { parent = new_parent; }
2517 
2518  // Update data limits for AXIS_TYPE (xdata, ydata, etc.) in the parent
2519  // axes object.
2520 
2521  virtual void update_axis_limits (const std::string& axis_type) const;
2522 
2523  virtual void update_axis_limits (const std::string& axis_type,
2524  const graphics_handle& h) const;
2525 
2526  virtual void delete_children (bool clear = false)
2527  {
2528  children.delete_children (clear);
2529  }
2530 
2531  void renumber_child (graphics_handle old_gh, graphics_handle new_gh)
2532  {
2533  children.renumber (old_gh, new_gh);
2534  }
2535 
2536  void renumber_parent (graphics_handle new_gh)
2537  {
2538  parent = new_gh;
2539  }
2540 
2541  static property_list::pval_map_type factory_defaults (void);
2542 
2543  // FIXME: these functions should be generated automatically by the
2544  // genprops.awk script.
2545  //
2546  // EMIT_BASE_PROPERTIES_GET_FUNCTIONS
2547 
2548  virtual octave_value get_alim (void) const { return octave_value (); }
2549  virtual octave_value get_clim (void) const { return octave_value (); }
2550  virtual octave_value get_xlim (void) const { return octave_value (); }
2551  virtual octave_value get_ylim (void) const { return octave_value (); }
2552  virtual octave_value get_zlim (void) const { return octave_value (); }
2553 
2554  virtual bool is_aliminclude (void) const { return false; }
2555  virtual bool is_climinclude (void) const { return false; }
2556  virtual bool is_xliminclude (void) const { return false; }
2557  virtual bool is_yliminclude (void) const { return false; }
2558  virtual bool is_zliminclude (void) const { return false; }
2559 
2560  bool is_handle_visible (void) const;
2561 
2562  std::set<std::string> dynamic_property_names (void) const;
2563 
2564  bool has_dynamic_property (const std::string& pname);
2565 
2566 protected:
2567  std::set<std::string> dynamic_properties;
2568 
2569  void set_dynamic (const caseless_str& pname, const octave_value& val);
2570 
2571  octave_value get_dynamic (const caseless_str& pname) const;
2572 
2573  octave_value get_dynamic (bool all = false) const;
2574 
2575  property get_property_dynamic (const caseless_str& pname);
2576 
2577 public:
2578 
2579 
2580  static std::set<std::string> core_property_names (void);
2581 
2582  static bool has_core_property (const caseless_str& pname);
2583 
2584  std::set<std::string> all_property_names (void) const;
2585 
2586 protected:
2587 
2608 
2609 public:
2610 
2611  enum
2612  {
2613  ID_BEINGDELETED = 0,
2614  ID_BUSYACTION = 1,
2615  ID_BUTTONDOWNFCN = 2,
2616  ID_CHILDREN = 3,
2617  ID_CLIPPING = 4,
2618  ID_CREATEFCN = 5,
2619  ID_DELETEFCN = 6,
2620  ID_HANDLEVISIBILITY = 7,
2621  ID_HITTEST = 8,
2622  ID_INTERRUPTIBLE = 9,
2623  ID_PARENT = 10,
2624  ID_SELECTED = 11,
2625  ID_SELECTIONHIGHLIGHT = 12,
2626  ID_TAG = 13,
2627  ID_TYPE = 14,
2628  ID_UICONTEXTMENU = 15,
2629  ID_USERDATA = 16,
2630  ID_VISIBLE = 17,
2631  ID___MODIFIED__ = 18,
2632  ID___MYHANDLE__ = 19
2633  };
2634 
2635  bool is_beingdeleted (void) const { return beingdeleted.is_on (); }
2636  std::string get_beingdeleted (void) const { return beingdeleted.current_value (); }
2637 
2638  bool busyaction_is (const std::string& v) const { return busyaction.is (v); }
2639  std::string get_busyaction (void) const { return busyaction.current_value (); }
2640 
2641  void execute_buttondownfcn (const octave_value& data = octave_value ()) const { buttondownfcn.execute (data); }
2642  octave_value get_buttondownfcn (void) const { return buttondownfcn.get (); }
2643 
2644  bool is_clipping (void) const { return clipping.is_on (); }
2645  std::string get_clipping (void) const { return clipping.current_value (); }
2646 
2647  void execute_createfcn (const octave_value& data = octave_value ()) const { createfcn.execute (data); }
2648  octave_value get_createfcn (void) const { return createfcn.get (); }
2649 
2650  void execute_deletefcn (const octave_value& data = octave_value ()) const { deletefcn.execute (data); }
2651  octave_value get_deletefcn (void) const { return deletefcn.get (); }
2652 
2653  bool handlevisibility_is (const std::string& v) const { return handlevisibility.is (v); }
2654  std::string get_handlevisibility (void) const { return handlevisibility.current_value (); }
2655 
2656  bool is_hittest (void) const { return hittest.is_on (); }
2657  std::string get_hittest (void) const { return hittest.current_value (); }
2658 
2659  bool is_interruptible (void) const { return interruptible.is_on (); }
2660  std::string get_interruptible (void) const { return interruptible.current_value (); }
2661 
2662  graphics_handle get_parent (void) const { return parent.handle_value (); }
2663 
2664  bool is_selected (void) const { return selected.is_on (); }
2665  std::string get_selected (void) const { return selected.current_value (); }
2666 
2667  bool is_selectionhighlight (void) const { return selectionhighlight.is_on (); }
2668  std::string get_selectionhighlight (void) const { return selectionhighlight.current_value (); }
2669 
2670  std::string get_tag (void) const { return tag.string_value (); }
2671 
2672  std::string get_type (void) const { return type.string_value (); }
2673 
2674  graphics_handle get_uicontextmenu (void) const { return uicontextmenu.handle_value (); }
2675 
2676  octave_value get_userdata (void) const { return userdata.get (); }
2677 
2678  bool is_visible (void) const { return visible.is_on (); }
2679  std::string get_visible (void) const { return visible.current_value (); }
2680 
2681  bool is___modified__ (void) const { return __modified__.is_on (); }
2682  std::string get___modified__ (void) const { return __modified__.current_value (); }
2683 
2684  graphics_handle get___myhandle__ (void) const { return __myhandle__; }
2685 
2686 
2687  void set_beingdeleted (const octave_value& val)
2688  {
2689  if (! error_state)
2690  {
2691  if (beingdeleted.set (val, true))
2692  {
2693  mark_modified ();
2694  }
2695  }
2696  }
2697 
2698  void set_busyaction (const octave_value& val)
2699  {
2700  if (! error_state)
2701  {
2702  if (busyaction.set (val, true))
2703  {
2704  mark_modified ();
2705  }
2706  }
2707  }
2708 
2709  void set_buttondownfcn (const octave_value& val)
2710  {
2711  if (! error_state)
2712  {
2713  if (buttondownfcn.set (val, true))
2714  {
2715  mark_modified ();
2716  }
2717  }
2718  }
2719 
2720  void set_children (const octave_value& val)
2721  {
2722  if (! error_state)
2723  {
2724  if (children.set (val, true))
2725  {
2726  mark_modified ();
2727  }
2728  }
2729  }
2730 
2731  void set_clipping (const octave_value& val)
2732  {
2733  if (! error_state)
2734  {
2735  if (clipping.set (val, true))
2736  {
2737  mark_modified ();
2738  }
2739  }
2740  }
2741 
2742  void set_createfcn (const octave_value& val)
2743  {
2744  if (! error_state)
2745  {
2746  if (createfcn.set (val, true))
2747  {
2748  mark_modified ();
2749  }
2750  }
2751  }
2752 
2753  void set_deletefcn (const octave_value& val)
2754  {
2755  if (! error_state)
2756  {
2757  if (deletefcn.set (val, true))
2758  {
2759  mark_modified ();
2760  }
2761  }
2762  }
2763 
2764  void set_handlevisibility (const octave_value& val)
2765  {
2766  if (! error_state)
2767  {
2768  if (handlevisibility.set (val, true))
2769  {
2770  mark_modified ();
2771  }
2772  }
2773  }
2774 
2775  void set_hittest (const octave_value& val)
2776  {
2777  if (! error_state)
2778  {
2779  if (hittest.set (val, true))
2780  {
2781  mark_modified ();
2782  }
2783  }
2784  }
2785 
2786  void set_interruptible (const octave_value& val)
2787  {
2788  if (! error_state)
2789  {
2790  if (interruptible.set (val, true))
2791  {
2792  mark_modified ();
2793  }
2794  }
2795  }
2796 
2797  void set_selected (const octave_value& val)
2798  {
2799  if (! error_state)
2800  {
2801  if (selected.set (val, true))
2802  {
2803  mark_modified ();
2804  }
2805  }
2806  }
2807 
2808  void set_selectionhighlight (const octave_value& val)
2809  {
2810  if (! error_state)
2811  {
2812  if (selectionhighlight.set (val, true))
2813  {
2814  mark_modified ();
2815  }
2816  }
2817  }
2818 
2819  void set_uicontextmenu (const octave_value& val)
2820  {
2821  if (! error_state)
2822  {
2823  if (uicontextmenu.set (val, true))
2824  {
2825  mark_modified ();
2826  }
2827  }
2828  }
2829 
2830  void set_userdata (const octave_value& val)
2831  {
2832  if (! error_state)
2833  {
2834  if (userdata.set (val, true))
2835  {
2836  mark_modified ();
2837  }
2838  }
2839  }
2840 
2841  void set_visible (const octave_value& val)
2842  {
2843  if (! error_state)
2844  {
2845  if (visible.set (val, true))
2846  {
2847  mark_modified ();
2848  }
2849  }
2850  }
2851 
2852 
2853 protected:
2855  {
2856  bool operator () (const caseless_str &a, const caseless_str &b) const
2857  {
2858  std::string a1 = a;
2859  std::transform (a1.begin (), a1.end (), a1.begin (), tolower);
2860  std::string b1 = b;
2861  std::transform (b1.begin (), b1.end (), b1.begin (), tolower);
2862 
2863  return a1 < b1;
2864  }
2865  };
2866 
2867  std::map<caseless_str, property, cmp_caseless_str> all_props;
2868 
2869 protected:
2870  void insert_static_property (const std::string& name, base_property& p)
2871  { insert_property (name, property (&p, true)); }
2872 
2873  virtual void init (void) { }
2874 };
2875 
2877 {
2878 public:
2879  friend class graphics_object;
2880 
2881  base_graphics_object (void) : count (1), toolkit_flag (false) { }
2882 
2883  virtual ~base_graphics_object (void) { }
2884 
2885  virtual void mark_modified (void)
2886  {
2887  if (valid_object ())
2889  else
2890  error ("base_graphics_object::mark_modified: invalid graphics object");
2891  }
2892 
2894  {
2895  if (valid_object ())
2897  else
2898  error ("base_graphics_object::override_defaults: invalid graphics object");
2899  }
2900 
2901  virtual void set_from_list (property_list& plist)
2902  {
2903  if (valid_object ())
2904  get_properties ().set_from_list (*this, plist);
2905  else
2906  error ("base_graphics_object::set_from_list: invalid graphics object");
2907  }
2908 
2909  virtual void set (const caseless_str& pname, const octave_value& pval)
2910  {
2911  if (valid_object ())
2912  get_properties ().set (pname, pval);
2913  else
2914  error ("base_graphics_object::set: invalid graphics object");
2915  }
2916 
2917  virtual void set_defaults (const std::string&)
2918  {
2919  error ("base_graphics_object::set_defaults: invalid graphics object");
2920  }
2921 
2922  virtual octave_value get (bool all = false) const
2923  {
2924  if (valid_object ())
2925  return get_properties ().get (all);
2926  else
2927  {
2928  error ("base_graphics_object::get: invalid graphics object");
2929  return octave_value ();
2930  }
2931  }
2932 
2933  virtual octave_value get (const caseless_str& pname) const
2934  {
2935  if (valid_object ())
2936  return get_properties ().get (pname);
2937  else
2938  {
2939  error ("base_graphics_object::get: invalid graphics object");
2940  return octave_value ();
2941  }
2942  }
2943 
2944  virtual octave_value get_default (const caseless_str&) const;
2945 
2946  virtual octave_value get_factory_default (const caseless_str&) const;
2947 
2948  virtual octave_value get_defaults (void) const
2949  {
2950  error ("base_graphics_object::get_defaults: invalid graphics object");
2951  return octave_value ();
2952  }
2953 
2954  virtual octave_value get_factory_defaults (void) const
2955  {
2956  error ("base_graphics_object::get_factory_defaults: invalid graphics object");
2957  return octave_value ();
2958  }
2959 
2960  virtual std::string values_as_string (void);
2961 
2962  virtual octave_scalar_map values_as_struct (void);
2963 
2964  virtual graphics_handle get_parent (void) const
2965  {
2966  if (valid_object ())
2967  return get_properties ().get_parent ();
2968  else
2969  {
2970  error ("base_graphics_object::get_parent: invalid graphics object");
2971  return graphics_handle ();
2972  }
2973  }
2974 
2976  {
2977  if (valid_object ())
2978  return get_properties ().get___myhandle__ ();
2979  else
2980  {
2981  error ("base_graphics_object::get_handle: invalid graphics object");
2982  return graphics_handle ();
2983  }
2984  }
2985 
2986  virtual void remove_child (const graphics_handle& h)
2987  {
2988  if (valid_object ())
2990  else
2991  error ("base_graphics_object::remove_child: invalid graphics object");
2992  }
2993 
2994  virtual void adopt (const graphics_handle& h)
2995  {
2996  if (valid_object ())
2997  get_properties ().adopt (h);
2998  else
2999  error ("base_graphics_object::adopt: invalid graphics object");
3000  }
3001 
3002  virtual void reparent (const graphics_handle& np)
3003  {
3004  if (valid_object ())
3005  get_properties ().reparent (np);
3006  else
3007  error ("base_graphics_object::reparent: invalid graphics object");
3008  }
3009 
3010  virtual void defaults (void) const
3011  {
3012  if (valid_object ())
3013  {
3014  std::string msg = (type () + "::defaults");
3015  gripe_not_implemented (msg.c_str ());
3016  }
3017  else
3018  error ("base_graphics_object::default: invalid graphics object");
3019  }
3020 
3022  {
3023  static base_properties properties;
3024  error ("base_graphics_object::get_properties: invalid graphics object");
3025  return properties;
3026  }
3027 
3028  virtual const base_properties& get_properties (void) const
3029  {
3030  static base_properties properties;
3031  error ("base_graphics_object::get_properties: invalid graphics object");
3032  return properties;
3033  }
3034 
3035  virtual void update_axis_limits (const std::string& axis_type);
3036 
3037  virtual void update_axis_limits (const std::string& axis_type,
3038  const graphics_handle& h);
3039 
3040  virtual bool valid_object (void) const { return false; }
3041 
3042  bool valid_toolkit_object (void) const { return toolkit_flag; }
3043 
3044  virtual std::string type (void) const
3045  {
3046  return (valid_object () ? get_properties ().graphics_object_name ()
3047  : "unknown");
3048  }
3049 
3050  bool isa (const std::string& go_name) const
3051  {
3052  return type () == go_name;
3053  }
3054 
3055  virtual graphics_toolkit get_toolkit (void) const
3056  {
3057  if (valid_object ())
3058  return get_properties ().get_toolkit ();
3059  else
3060  {
3061  error ("base_graphics_object::get_toolkit: invalid graphics object");
3062  return graphics_toolkit ();
3063  }
3064  }
3065 
3066  virtual void add_property_listener (const std::string& nm,
3067  const octave_value& v,
3068  listener_mode mode = POSTSET)
3069  {
3070  if (valid_object ())
3071  get_properties ().add_listener (nm, v, mode);
3072  }
3073 
3074  virtual void delete_property_listener (const std::string& nm,
3075  const octave_value& v,
3076  listener_mode mode = POSTSET)
3077  {
3078  if (valid_object ())
3079  get_properties ().delete_listener (nm, v, mode);
3080  }
3081 
3082  virtual void remove_all_listeners (void);
3083 
3084  virtual void reset_default_properties (void)
3085  {
3086  if (valid_object ())
3087  {
3088  std::string msg = (type () + "::reset_default_properties");
3089  gripe_not_implemented (msg.c_str ());
3090  }
3091  else
3092  error ("base_graphics_object::default: invalid graphics object");
3093  }
3094 
3095 protected:
3096  virtual void initialize (const graphics_object& go)
3097  {
3098  if (! toolkit_flag)
3099  toolkit_flag = get_toolkit ().initialize (go);
3100  }
3101 
3102  virtual void finalize (const graphics_object& go)
3103  {
3104  if (toolkit_flag)
3105  {
3106  get_toolkit ().finalize (go);
3107  toolkit_flag = false;
3108  }
3109  }
3110 
3111  virtual void update (const graphics_object& go, int id)
3112  {
3113  if (toolkit_flag)
3114  get_toolkit ().update (go, id);
3115  }
3116 
3117 protected:
3118  // A reference count.
3120 
3121  // A flag telling whether this object is a valid object
3122  // in the backend context.
3124 
3125  // No copying!
3126 
3128 
3130  {
3131  return *this;
3132  }
3133 };
3134 
3136 {
3137 public:
3138  graphics_object (void) : rep (new base_graphics_object ()) { }
3139 
3141  : rep (new_rep) { }
3142 
3143  graphics_object (const graphics_object& obj) : rep (obj.rep)
3144  {
3145  rep->count++;
3146  }
3147 
3148  graphics_object& operator = (const graphics_object& obj)
3149  {
3150  if (rep != obj.rep)
3151  {
3152  if (--rep->count == 0)
3153  delete rep;
3154 
3155  rep = obj.rep;
3156  rep->count++;
3157  }
3158 
3159  return *this;
3160  }
3161 
3163  {
3164  if (--rep->count == 0)
3165  delete rep;
3166  }
3167 
3168  void mark_modified (void) { rep->mark_modified (); }
3169 
3170  void override_defaults (base_graphics_object& obj)
3171  {
3172  rep->override_defaults (obj);
3173  }
3174 
3175  void set_from_list (property_list& plist) { rep->set_from_list (plist); }
3176 
3177  void set (const caseless_str& name, const octave_value& val)
3178  {
3179  rep->set (name, val);
3180  }
3181 
3182  void set (const octave_value_list& args);
3183 
3184  void set (const Array<std::string>& names, const Cell& values,
3185  octave_idx_type row);
3186 
3187  void set (const octave_map& m);
3188 
3189  void set_value_or_default (const caseless_str& name,
3190  const octave_value& val);
3191 
3192  void set_defaults (const std::string& mode) { rep->set_defaults (mode); }
3193 
3194  octave_value get (bool all = false) const { return rep->get (all); }
3195 
3196  octave_value get (const caseless_str& name) const
3197  {
3198  return name.compare ("default")
3199  ? get_defaults ()
3200  : (name.compare ("factory")
3201  ? get_factory_defaults () : rep->get (name));
3202  }
3203 
3204  octave_value get (const std::string& name) const
3205  {
3206  return get (caseless_str (name));
3207  }
3208 
3209  octave_value get (const char *name) const
3210  {
3211  return get (caseless_str (name));
3212  }
3213 
3214  octave_value get_default (const caseless_str& name) const
3215  {
3216  return rep->get_default (name);
3217  }
3218 
3219  octave_value get_factory_default (const caseless_str& name) const
3220  {
3221  return rep->get_factory_default (name);
3222  }
3223 
3224  octave_value get_defaults (void) const { return rep->get_defaults (); }
3225 
3226  octave_value get_factory_defaults (void) const
3227  {
3228  return rep->get_factory_defaults ();
3229  }
3230 
3231  std::string values_as_string (void) { return rep->values_as_string (); }
3232 
3233  octave_map values_as_struct (void) { return rep->values_as_struct (); }
3234 
3235  graphics_handle get_parent (void) const { return rep->get_parent (); }
3236 
3237  graphics_handle get_handle (void) const { return rep->get_handle (); }
3238 
3239  graphics_object get_ancestor (const std::string& type) const;
3240 
3241  void remove_child (const graphics_handle& h) { rep->remove_child (h); }
3242 
3243  void adopt (const graphics_handle& h) { rep->adopt (h); }
3244 
3245  void reparent (const graphics_handle& h) { rep->reparent (h); }
3246 
3247  void defaults (void) const { rep->defaults (); }
3248 
3249  bool isa (const std::string& go_name) const { return rep->isa (go_name); }
3250 
3251  base_properties& get_properties (void) { return rep->get_properties (); }
3252 
3253  const base_properties& get_properties (void) const
3254  {
3255  return rep->get_properties ();
3256  }
3257 
3258  void update_axis_limits (const std::string& axis_type)
3259  {
3260  rep->update_axis_limits (axis_type);
3261  }
3262 
3263  void update_axis_limits (const std::string& axis_type,
3264  const graphics_handle& h)
3265  {
3266  rep->update_axis_limits (axis_type, h);
3267  }
3268 
3269  bool valid_object (void) const { return rep->valid_object (); }
3270 
3271  std::string type (void) const { return rep->type (); }
3272 
3273  operator bool (void) const { return rep->valid_object (); }
3274 
3275  // FIXME: these functions should be generated automatically by the
3276  // genprops.awk script.
3277  //
3278  // EMIT_GRAPHICS_OBJECT_GET_FUNCTIONS
3279 
3280  octave_value get_alim (void) const
3281  { return get_properties ().get_alim (); }
3282 
3283  octave_value get_clim (void) const
3284  { return get_properties ().get_clim (); }
3285 
3286  octave_value get_xlim (void) const
3287  { return get_properties ().get_xlim (); }
3288 
3289  octave_value get_ylim (void) const
3290  { return get_properties ().get_ylim (); }
3291 
3292  octave_value get_zlim (void) const
3293  { return get_properties ().get_zlim (); }
3294 
3295  bool is_aliminclude (void) const
3296  { return get_properties ().is_aliminclude (); }
3297 
3298  bool is_climinclude (void) const
3299  { return get_properties ().is_climinclude (); }
3300 
3301  bool is_xliminclude (void) const
3302  { return get_properties ().is_xliminclude (); }
3303 
3304  bool is_yliminclude (void) const
3305  { return get_properties ().is_yliminclude (); }
3306 
3307  bool is_zliminclude (void) const
3308  { return get_properties ().is_zliminclude (); }
3309 
3310  bool is_handle_visible (void) const
3311  { return get_properties ().is_handle_visible (); }
3312 
3313  graphics_toolkit get_toolkit (void) const { return rep->get_toolkit (); }
3314 
3315  void add_property_listener (const std::string& nm, const octave_value& v,
3316  listener_mode mode = POSTSET)
3317  { rep->add_property_listener (nm, v, mode); }
3318 
3319  void delete_property_listener (const std::string& nm, const octave_value& v,
3320  listener_mode mode = POSTSET)
3321  { rep->delete_property_listener (nm, v, mode); }
3322 
3323  void initialize (void) { rep->initialize (*this); }
3324 
3325  void finalize (void) { rep->finalize (*this); }
3326 
3327  void update (int id) { rep->update (*this, id); }
3328 
3330  { rep->reset_default_properties (); }
3331 
3332 private:
3334 };
3335 
3336 // ---------------------------------------------------------------------
3337 
3339 {
3340 public:
3342  {
3343  public:
3344  void remove_child (const graphics_handle& h);
3345 
3346  Matrix get_boundingbox (bool internal = false,
3347  const Matrix& parent_pix_size = Matrix ()) const;
3348 
3349  // See the genprops.awk script for an explanation of the
3350  // properties declarations.
3351 
3352  // FIXME: it seems strange to me that the diary, diaryfile,
3353  // echo, errormessage, format, formatspacing, language, and
3354  // recursionlimit properties are here.
3355  // WTF do they have to do with graphics?
3356  // Also note that these properties (and the monitorpositions,
3357  // pointerlocation, and pointerwindow properties) are not yet used
3358  // by Octave, so setting them will have no effect, and changes
3359  // made elswhere (say, the diary or format functions) will not
3360  // cause these properties to be updated.
3361  // ANSWER: Matlab defines these properties and uses them in
3362  // the same way that Octave uses an internal static variable to
3363  // keep track of state. set (0, "echo", "on") is equivalent
3364  // to Octave's echo ("on"). Maybe someday we can connect callbacks
3365  // that actually call Octave's own functions for this.
3366 
3367  // Programming note: Keep property list sorted if new ones are added.
3368 
3369 public:
3370  properties (const graphics_handle& mh, const graphics_handle& p);
3371 
3372  ~properties (void) { }
3373 
3374  void set (const caseless_str& pname, const octave_value& val);
3375 
3376  octave_value get (bool all = false) const;
3377 
3378  octave_value get (const caseless_str& pname) const;
3379 
3380  octave_value get (const std::string& pname) const
3381  {
3382  return get (caseless_str (pname));
3383  }
3384 
3385  octave_value get (const char *pname) const
3386  {
3387  return get (caseless_str (pname));
3388  }
3389 
3390  property get_property (const caseless_str& pname);
3391 
3392  std::string graphics_object_name (void) const { return go_name; }
3393 
3394  static property_list::pval_map_type factory_defaults (void);
3395 
3396 private:
3397  static std::string go_name;
3398 
3399 public:
3400 
3401 
3402  static std::set<std::string> core_property_names (void);
3403 
3404  static bool has_core_property (const caseless_str& pname);
3405 
3406  std::set<std::string> all_property_names (void) const;
3407 
3408  bool has_property (const caseless_str& pname) const;
3409 
3410 private:
3411 
3432 
3433 public:
3434 
3435  enum
3436  {
3437  ID_CALLBACKOBJECT = 1000,
3438  ID_COMMANDWINDOWSIZE = 1001,
3439  ID_CURRENTFIGURE = 1002,
3440  ID_DIARY = 1003,
3441  ID_DIARYFILE = 1004,
3442  ID_ECHO = 1005,
3443  ID_ERRORMESSAGE = 1006,
3444  ID_FIXEDWIDTHFONTNAME = 1007,
3445  ID_FORMAT = 1008,
3446  ID_FORMATSPACING = 1009,
3447  ID_LANGUAGE = 1010,
3448  ID_MONITORPOSITIONS = 1011,
3449  ID_POINTERLOCATION = 1012,
3450  ID_POINTERWINDOW = 1013,
3451  ID_RECURSIONLIMIT = 1014,
3452  ID_SCREENDEPTH = 1015,
3453  ID_SCREENPIXELSPERINCH = 1016,
3454  ID_SCREENSIZE = 1017,
3455  ID_SHOWHIDDENHANDLES = 1018,
3456  ID_UNITS = 1019
3457  };
3458 
3459  graphics_handle get_callbackobject (void) const { return callbackobject.handle_value (); }
3460 
3461  octave_value get_commandwindowsize (void) const { return commandwindowsize.get (); }
3462 
3463  graphics_handle get_currentfigure (void) const { return currentfigure.handle_value (); }
3464 
3465  bool is_diary (void) const { return diary.is_on (); }
3466  std::string get_diary (void) const { return diary.current_value (); }
3467 
3468  std::string get_diaryfile (void) const { return diaryfile.string_value (); }
3469 
3470  bool is_echo (void) const { return echo.is_on (); }
3471  std::string get_echo (void) const { return echo.current_value (); }
3472 
3473  std::string get_errormessage (void) const { return errormessage.string_value (); }
3474 
3475  std::string get_fixedwidthfontname (void) const { return fixedwidthfontname.string_value (); }
3476 
3477  bool format_is (const std::string& v) const { return format.is (v); }
3478  std::string get_format (void) const { return format.current_value (); }
3479 
3480  bool formatspacing_is (const std::string& v) const { return formatspacing.is (v); }
3481  std::string get_formatspacing (void) const { return formatspacing.current_value (); }
3482 
3483  std::string get_language (void) const { return language.string_value (); }
3484 
3485  octave_value get_monitorpositions (void) const { return monitorpositions.get (); }
3486 
3487  octave_value get_pointerlocation (void) const { return pointerlocation.get (); }
3488 
3489  double get_pointerwindow (void) const { return pointerwindow.double_value (); }
3490 
3491  double get_recursionlimit (void) const { return recursionlimit.double_value (); }
3492 
3493  double get_screendepth (void) const { return screendepth.double_value (); }
3494 
3495  double get_screenpixelsperinch (void) const { return screenpixelsperinch.double_value (); }
3496 
3497  octave_value get_screensize (void) const { return screensize.get (); }
3498 
3499  bool is_showhiddenhandles (void) const { return showhiddenhandles.is_on (); }
3500  std::string get_showhiddenhandles (void) const { return showhiddenhandles.current_value (); }
3501 
3502  bool units_is (const std::string& v) const { return units.is (v); }
3503  std::string get_units (void) const { return units.current_value (); }
3504 
3505 
3506  void set_callbackobject (const octave_value& val);
3507 
3508  void set_commandwindowsize (const octave_value& val)
3509  {
3510  if (! error_state)
3511  {
3512  if (commandwindowsize.set (val, true))
3513  {
3514  mark_modified ();
3515  }
3516  }
3517  }
3518 
3519  void set_currentfigure (const octave_value& val);
3520 
3521  void set_diary (const octave_value& val)
3522  {
3523  if (! error_state)
3524  {
3525  if (diary.set (val, true))
3526  {
3527  mark_modified ();
3528  }
3529  }
3530  }
3531 
3532  void set_diaryfile (const octave_value& val)
3533  {
3534  if (! error_state)
3535  {
3536  if (diaryfile.set (val, true))
3537  {
3538  mark_modified ();
3539  }
3540  }
3541  }
3542 
3543  void set_echo (const octave_value& val)
3544  {
3545  if (! error_state)
3546  {
3547  if (echo.set (val, true))
3548  {
3549  mark_modified ();
3550  }
3551  }
3552  }
3553 
3554  void set_errormessage (const octave_value& val)
3555  {
3556  if (! error_state)
3557  {
3558  if (errormessage.set (val, true))
3559  {
3560  mark_modified ();
3561  }
3562  }
3563  }
3564 
3565  void set_fixedwidthfontname (const octave_value& val)
3566  {
3567  if (! error_state)
3568  {
3569  if (fixedwidthfontname.set (val, true))
3570  {
3571  mark_modified ();
3572  }
3573  }
3574  }
3575 
3576  void set_format (const octave_value& val)
3577  {
3578  if (! error_state)
3579  {
3580  if (format.set (val, true))
3581  {
3582  mark_modified ();
3583  }
3584  }
3585  }
3586 
3587  void set_formatspacing (const octave_value& val)
3588  {
3589  if (! error_state)
3590  {
3591  if (formatspacing.set (val, true))
3592  {
3593  mark_modified ();
3594  }
3595  }
3596  }
3597 
3598  void set_language (const octave_value& val)
3599  {
3600  if (! error_state)
3601  {
3602  if (language.set (val, true))
3603  {
3604  mark_modified ();
3605  }
3606  }
3607  }
3608 
3609  void set_monitorpositions (const octave_value& val)
3610  {
3611  if (! error_state)
3612  {
3613  if (monitorpositions.set (val, true))
3614  {
3615  mark_modified ();
3616  }
3617  }
3618  }
3619 
3620  void set_pointerlocation (const octave_value& val)
3621  {
3622  if (! error_state)
3623  {
3624  if (pointerlocation.set (val, true))
3625  {
3626  mark_modified ();
3627  }
3628  }
3629  }
3630 
3631  void set_pointerwindow (const octave_value& val)
3632  {
3633  if (! error_state)
3634  {
3635  if (pointerwindow.set (val, true))
3636  {
3637  mark_modified ();
3638  }
3639  }
3640  }
3641 
3642  void set_recursionlimit (const octave_value& val)
3643  {
3644  if (! error_state)
3645  {
3646  if (recursionlimit.set (val, true))
3647  {
3648  mark_modified ();
3649  }
3650  }
3651  }
3652 
3653  void set_screendepth (const octave_value& val)
3654  {
3655  if (! error_state)
3656  {
3657  if (screendepth.set (val, true))
3658  {
3659  mark_modified ();
3660  }
3661  }
3662  }
3663 
3664  void set_screenpixelsperinch (const octave_value& val)
3665  {
3666  if (! error_state)
3667  {
3668  if (screenpixelsperinch.set (val, true))
3669  {
3670  mark_modified ();
3671  }
3672  }
3673  }
3674 
3675  void set_screensize (const octave_value& val)
3676  {
3677  if (! error_state)
3678  {
3679  if (screensize.set (val, true))
3680  {
3681  mark_modified ();
3682  }
3683  }
3684  }
3685 
3686  void set_showhiddenhandles (const octave_value& val)
3687  {
3688  if (! error_state)
3689  {
3690  if (showhiddenhandles.set (val, true))
3691  {
3692  mark_modified ();
3693  }
3694  }
3695  }
3696 
3697  void set_units (const octave_value& val)
3698  {
3699  if (! error_state)
3700  {
3701  if (units.set (val, true))
3702  {
3703  update_units ();
3704  mark_modified ();
3705  }
3706  }
3707  }
3708 
3709  void update_units (void);
3710 
3711 
3712  private:
3713  std::list<graphics_handle> cbo_stack;
3714  };
3715 
3716 private:
3718 
3719 public:
3720 
3722  : xproperties (0, graphics_handle ()), default_properties () { }
3723 
3724  ~root_figure (void) { }
3725 
3726  void mark_modified (void) { }
3727 
3729  {
3730  // Now override with our defaults. If the default_properties
3731  // list includes the properties for all defaults (line,
3732  // surface, etc.) then we don't have to know the type of OBJ
3733  // here, we just call its set function and let it decide which
3734  // properties from the list to use.
3735  obj.set_from_list (default_properties);
3736  }
3737 
3738  void set (const caseless_str& name, const octave_value& value)
3739  {
3740  if (name.compare ("default", 7))
3741  // strip "default", pass rest to function that will
3742  // parse the remainder and add the element to the
3743  // default_properties map.
3744  default_properties.set (name.substr (7), value);
3745  else
3746  xproperties.set (name, value);
3747  }
3748 
3749  octave_value get (const caseless_str& name) const
3750  {
3751  octave_value retval;
3752 
3753  if (name.compare ("default", 7))
3754  return get_default (name.substr (7));
3755  else if (name.compare ("factory", 7))
3756  return get_factory_default (name.substr (7));
3757  else
3758  retval = xproperties.get (name);
3759 
3760  return retval;
3761  }
3762 
3763  octave_value get_default (const caseless_str& name) const
3764  {
3765  octave_value retval = default_properties.lookup (name);
3766 
3767  if (retval.is_undefined ())
3768  {
3769  // no default property found, use factory default
3770  retval = factory_properties.lookup (name);
3771 
3772  if (retval.is_undefined ())
3773  error ("get: invalid default property '%s'", name.c_str ());
3774  }
3775 
3776  return retval;
3777  }
3778 
3779  octave_value get_factory_default (const caseless_str& name) const
3780  {
3781  octave_value retval = factory_properties.lookup (name);
3782 
3783  if (retval.is_undefined ())
3784  error ("get: invalid factory default property '%s'", name.c_str ());
3785 
3786  return retval;
3787  }
3788 
3789  octave_value get_defaults (void) const
3790  {
3791  return default_properties.as_struct ("default");
3792  }
3793 
3794  octave_value get_factory_defaults (void) const
3795  {
3796  return factory_properties.as_struct ("factory");
3797  }
3798 
3799  base_properties& get_properties (void) { return xproperties; }
3800 
3801  const base_properties& get_properties (void) const { return xproperties; }
3802 
3803  bool valid_object (void) const { return true; }
3804 
3805  void reset_default_properties (void);
3806 
3807 private:
3809 
3811 
3812  static property_list::plist_map_type init_factory_properties (void);
3813 };
3814 
3815 // ---------------------------------------------------------------------
3816 
3818 {
3819 public:
3821  {
3822  public:
3823  void init_integerhandle (const octave_value& val)
3824  {
3825  integerhandle = val;
3826  }
3827 
3828  void remove_child (const graphics_handle& h);
3829 
3830  void set_visible (const octave_value& val);
3831 
3832  graphics_toolkit get_toolkit (void) const
3833  {
3834  if (! toolkit)
3835  toolkit = gtk_manager::get_toolkit ();
3836 
3837  return toolkit;
3838  }
3839 
3840  void set_toolkit (const graphics_toolkit& b);
3841 
3842  void set___graphics_toolkit__ (const octave_value& val)
3843  {
3844  if (! error_state)
3845  {
3846  if (val.is_string ())
3847  {
3848  std::string nm = val.string_value ();
3850  if (b.get_name () != nm)
3851  {
3852  error ("set___graphics_toolkit__: invalid graphics toolkit");
3853  }
3854  else
3855  {
3856  set_toolkit (b);
3857  mark_modified ();
3858  }
3859  }
3860  else
3861  error ("set___graphics_toolkit__ must be a string");
3862  }
3863  }
3864 
3865  void set_position (const octave_value& val,
3866  bool do_notify_toolkit = true);
3867 
3868  void set_outerposition (const octave_value& val,
3869  bool do_notify_toolkit = true);
3870 
3871  Matrix get_boundingbox (bool internal = false,
3872  const Matrix& parent_pix_size = Matrix ()) const;
3873 
3874  void set_boundingbox (const Matrix& bb, bool internal = false,
3875  bool do_notify_toolkit = true);
3876 
3877  Matrix map_from_boundingbox (double x, double y) const;
3878 
3879  Matrix map_to_boundingbox (double x, double y) const;
3880 
3881  void update_units (const caseless_str& old_units);
3882 
3883  void update_paperunits (const caseless_str& old_paperunits);
3884 
3885  std::string get_title (void) const;
3886 
3887  // See the genprops.awk script for an explanation of the
3888  // properties declarations.
3889  // Programming note: Keep property list sorted if new ones are added.
3890 
3891 public:
3892  properties (const graphics_handle& mh, const graphics_handle& p);
3893 
3894  ~properties (void) { }
3895 
3896  void set (const caseless_str& pname, const octave_value& val);
3897 
3898  octave_value get (bool all = false) const;
3899 
3900  octave_value get (const caseless_str& pname) const;
3901 
3902  octave_value get (const std::string& pname) const
3903  {
3904  return get (caseless_str (pname));
3905  }
3906 
3907  octave_value get (const char *pname) const
3908  {
3909  return get (caseless_str (pname));
3910  }
3911 
3912  property get_property (const caseless_str& pname);
3913 
3914  std::string graphics_object_name (void) const { return go_name; }
3915 
3916  static property_list::pval_map_type factory_defaults (void);
3917 
3918 private:
3919  static std::string go_name;
3920 
3921 public:
3922 
3923 
3924  static std::set<std::string> core_property_names (void);
3925 
3926  static bool has_core_property (const caseless_str& pname);
3927 
3928  std::set<std::string> all_property_names (void) const;
3929 
3930  bool has_property (const caseless_str& pname) const;
3931 
3932 private:
3933 
3989 
3990 public:
3991 
3992  enum
3993  {
3994  ID_ALPHAMAP = 2000,
3995  ID_BUTTONDOWNFCN = 2001,
3996  ID_CLOSEREQUESTFCN = 2002,
3997  ID_COLOR = 2003,
3998  ID_COLORMAP = 2004,
3999  ID_CURRENTAXES = 2005,
4000  ID_CURRENTCHARACTER = 2006,
4001  ID_CURRENTOBJECT = 2007,
4002  ID_CURRENTPOINT = 2008,
4003  ID_DOCKCONTROLS = 2009,
4004  ID_DOUBLEBUFFER = 2010,
4005  ID_FILENAME = 2011,
4006  ID_INTEGERHANDLE = 2012,
4007  ID_INVERTHARDCOPY = 2013,
4008  ID_KEYPRESSFCN = 2014,
4009  ID_KEYRELEASEFCN = 2015,
4010  ID_MENUBAR = 2016,
4011  ID_MINCOLORMAP = 2017,
4012  ID_NAME = 2018,
4013  ID_NEXTPLOT = 2019,
4014  ID_NUMBERTITLE = 2020,
4015  ID_OUTERPOSITION = 2021,
4016  ID_PAPERORIENTATION = 2022,
4017  ID_PAPERPOSITION = 2023,
4018  ID_PAPERPOSITIONMODE = 2024,
4019  ID_PAPERSIZE = 2025,
4020  ID_PAPERTYPE = 2026,
4021  ID_PAPERUNITS = 2027,
4022  ID_POINTER = 2028,
4023  ID_POINTERSHAPECDATA = 2029,
4024  ID_POINTERSHAPEHOTSPOT = 2030,
4025  ID_POSITION = 2031,
4026  ID_RENDERER = 2032,
4027  ID_RENDERERMODE = 2033,
4028  ID_RESIZE = 2034,
4029  ID_RESIZEFCN = 2035,
4030  ID_SELECTIONTYPE = 2036,
4031  ID_TOOLBAR = 2037,
4032  ID_UNITS = 2038,
4033  ID_WINDOWBUTTONDOWNFCN = 2039,
4034  ID_WINDOWBUTTONMOTIONFCN = 2040,
4035  ID_WINDOWBUTTONUPFCN = 2041,
4036  ID_WINDOWKEYPRESSFCN = 2042,
4037  ID_WINDOWKEYRELEASEFCN = 2043,
4038  ID_WINDOWSCROLLWHEELFCN = 2044,
4039  ID_WINDOWSTYLE = 2045,
4040  ID_WVISUAL = 2046,
4041  ID_WVISUALMODE = 2047,
4042  ID_XDISPLAY = 2048,
4043  ID_XVISUAL = 2049,
4044  ID_XVISUALMODE = 2050,
4045  ID___ENHANCED__ = 2051,
4046  ID___GRAPHICS_TOOLKIT__ = 2052,
4047  ID___GUIDATA__ = 2053,
4048  ID___PLOT_STREAM__ = 2054
4049  };
4050 
4051  octave_value get_alphamap (void) const { return alphamap.get (); }
4052 
4053  void execute_buttondownfcn (const octave_value& data = octave_value ()) const { buttondownfcn.execute (data); }
4054  octave_value get_buttondownfcn (void) const { return buttondownfcn.get (); }
4055 
4056  void execute_closerequestfcn (const octave_value& data = octave_value ()) const { closerequestfcn.execute (data); }
4057  octave_value get_closerequestfcn (void) const { return closerequestfcn.get (); }
4058 
4059  bool color_is_rgb (void) const { return color.is_rgb (); }
4060  bool color_is (const std::string& v) const { return color.is (v); }
4061  Matrix get_color_rgb (void) const { return (color.is_rgb () ? color.rgb () : Matrix ()); }
4062  octave_value get_color (void) const { return color.get (); }
4063 
4064  octave_value get_colormap (void) const { return colormap.get (); }
4065 
4066  graphics_handle get_currentaxes (void) const { return currentaxes.handle_value (); }
4067 
4068  std::string get_currentcharacter (void) const { return currentcharacter.string_value (); }
4069 
4070  graphics_handle get_currentobject (void) const { return currentobject.handle_value (); }
4071 
4072  octave_value get_currentpoint (void) const { return currentpoint.get (); }
4073 
4074  bool is_dockcontrols (void) const { return dockcontrols.is_on (); }
4075  std::string get_dockcontrols (void) const { return dockcontrols.current_value (); }
4076 
4077  bool is_doublebuffer (void) const { return doublebuffer.is_on (); }
4078  std::string get_doublebuffer (void) const { return doublebuffer.current_value (); }
4079 
4080  std::string get_filename (void) const { return filename.string_value (); }
4081 
4082  bool is_integerhandle (void) const { return integerhandle.is_on (); }
4083  std::string get_integerhandle (void) const { return integerhandle.current_value (); }
4084 
4085  bool is_inverthardcopy (void) const { return inverthardcopy.is_on (); }
4086  std::string get_inverthardcopy (void) const { return inverthardcopy.current_value (); }
4087 
4088  void execute_keypressfcn (const octave_value& data = octave_value ()) const { keypressfcn.execute (data); }
4089  octave_value get_keypressfcn (void) const { return keypressfcn.get (); }
4090 
4091  void execute_keyreleasefcn (const octave_value& data = octave_value ()) const { keyreleasefcn.execute (data); }
4092  octave_value get_keyreleasefcn (void) const { return keyreleasefcn.get (); }
4093 
4094  bool menubar_is (const std::string& v) const { return menubar.is (v); }
4095  std::string get_menubar (void) const { return menubar.current_value (); }
4096 
4097  double get_mincolormap (void) const { return mincolormap.double_value (); }
4098 
4099  std::string get_name (void) const { return name.string_value (); }
4100 
4101  bool nextplot_is (const std::string& v) const { return nextplot.is (v); }
4102  std::string get_nextplot (void) const { return nextplot.current_value (); }
4103 
4104  bool is_numbertitle (void) const { return numbertitle.is_on (); }
4105  std::string get_numbertitle (void) const { return numbertitle.current_value (); }
4106 
4107  octave_value get_outerposition (void) const { return outerposition.get (); }
4108 
4109  bool paperorientation_is (const std::string& v) const { return paperorientation.is (v); }
4110  std::string get_paperorientation (void) const { return paperorientation.current_value (); }
4111 
4112  octave_value get_paperposition (void) const { return paperposition.get (); }
4113 
4114  bool paperpositionmode_is (const std::string& v) const { return paperpositionmode.is (v); }
4115  std::string get_paperpositionmode (void) const { return paperpositionmode.current_value (); }
4116 
4117  octave_value get_papersize (void) const { return papersize.get (); }
4118 
4119  bool papertype_is (const std::string& v) const { return papertype.is (v); }
4120  std::string get_papertype (void) const { return papertype.current_value (); }
4121 
4122  bool paperunits_is (const std::string& v) const { return paperunits.is (v); }
4123  std::string get_paperunits (void) const { return paperunits.current_value (); }
4124 
4125  bool pointer_is (const std::string& v) const { return pointer.is (v); }
4126  std::string get_pointer (void) const { return pointer.current_value (); }
4127 
4128  octave_value get_pointershapecdata (void) const { return pointershapecdata.get (); }
4129 
4130  octave_value get_pointershapehotspot (void) const { return pointershapehotspot.get (); }
4131 
4132  octave_value get_position (void) const { return position.get (); }
4133 
4134  bool renderer_is (const std::string& v) const { return renderer.is (v); }
4135  std::string get_renderer (void) const { return renderer.current_value (); }
4136 
4137  bool renderermode_is (const std::string& v) const { return renderermode.is (v); }
4138  std::string get_renderermode (void) const { return renderermode.current_value (); }
4139 
4140  bool is_resize (void) const { return resize.is_on (); }
4141  std::string get_resize (void) const { return resize.current_value (); }
4142 
4143  void execute_resizefcn (const octave_value& data = octave_value ()) const { resizefcn.execute (data); }
4144  octave_value get_resizefcn (void) const { return resizefcn.get (); }
4145 
4146  bool selectiontype_is (const std::string& v) const { return selectiontype.is (v); }
4147  std::string get_selectiontype (void) const { return selectiontype.current_value (); }
4148 
4149  bool toolbar_is (const std::string& v) const { return toolbar.is (v); }
4150  std::string get_toolbar (void) const { return toolbar.current_value (); }
4151 
4152  bool units_is (const std::string& v) const { return units.is (v); }
4153  std::string get_units (void) const { return units.current_value (); }
4154 
4155  void execute_windowbuttondownfcn (const octave_value& data = octave_value ()) const { windowbuttondownfcn.execute (data); }
4156  octave_value get_windowbuttondownfcn (void) const { return windowbuttondownfcn.get (); }
4157 
4158  void execute_windowbuttonmotionfcn (const octave_value& data = octave_value ()) const { windowbuttonmotionfcn.execute (data); }
4159  octave_value get_windowbuttonmotionfcn (void) const { return windowbuttonmotionfcn.get (); }
4160 
4161  void execute_windowbuttonupfcn (const octave_value& data = octave_value ()) const { windowbuttonupfcn.execute (data); }
4162  octave_value get_windowbuttonupfcn (void) const { return windowbuttonupfcn.get (); }
4163 
4164  void execute_windowkeypressfcn (const octave_value& data = octave_value ()) const { windowkeypressfcn.execute (data); }
4165  octave_value get_windowkeypressfcn (void) const { return windowkeypressfcn.get (); }
4166 
4167  void execute_windowkeyreleasefcn (const octave_value& data = octave_value ()) const { windowkeyreleasefcn.execute (data); }
4168  octave_value get_windowkeyreleasefcn (void) const { return windowkeyreleasefcn.get (); }
4169 
4170  void execute_windowscrollwheelfcn (const octave_value& data = octave_value ()) const { windowscrollwheelfcn.execute (data); }
4171  octave_value get_windowscrollwheelfcn (void) const { return windowscrollwheelfcn.get (); }
4172 
4173  bool windowstyle_is (const std::string& v) const { return windowstyle.is (v); }
4174  std::string get_windowstyle (void) const { return windowstyle.current_value (); }
4175 
4176  std::string get_wvisual (void) const { return wvisual.string_value (); }
4177 
4178  bool wvisualmode_is (const std::string& v) const { return wvisualmode.is (v); }
4179  std::string get_wvisualmode (void) const { return wvisualmode.current_value (); }
4180 
4181  std::string get_xdisplay (void) const { return xdisplay.string_value (); }
4182 
4183  std::string get_xvisual (void) const { return xvisual.string_value (); }
4184 
4185  bool xvisualmode_is (const std::string& v) const { return xvisualmode.is (v); }
4186  std::string get_xvisualmode (void) const { return xvisualmode.current_value (); }
4187 
4188  bool is___enhanced__ (void) const { return __enhanced__.is_on (); }
4189  std::string get___enhanced__ (void) const { return __enhanced__.current_value (); }
4190 
4191  std::string get___graphics_toolkit__ (void) const { return __graphics_toolkit__.string_value (); }
4192 
4193  octave_value get___guidata__ (void) const { return __guidata__.get (); }
4194 
4195  octave_value get___plot_stream__ (void) const { return __plot_stream__.get (); }
4196 
4197 
4198  void set_alphamap (const octave_value& val)
4199  {
4200  if (! error_state)
4201  {
4202  if (alphamap.set (val, true))
4203  {
4204  mark_modified ();
4205  }
4206  }
4207  }
4208 
4209  void set_buttondownfcn (const octave_value& val)
4210  {
4211  if (! error_state)
4212  {
4213  if (buttondownfcn.set (val, true))
4214  {
4215  mark_modified ();
4216  }
4217  }
4218  }
4219 
4220  void set_closerequestfcn (const octave_value& val)
4221  {
4222  if (! error_state)
4223  {
4224  if (closerequestfcn.set (val, true))
4225  {
4226  mark_modified ();
4227  }
4228  }
4229  }
4230 
4231  void set_color (const octave_value& val)
4232  {
4233  if (! error_state)
4234  {
4235  if (color.set (val, true))
4236  {
4237  mark_modified ();
4238  }
4239  }
4240  }
4241 
4242  void set_colormap (const octave_value& val)
4243  {
4244  if (! error_state)
4245  {
4246  if (colormap.set (val, true))
4247  {
4248  mark_modified ();
4249  }
4250  }
4251  }
4252 
4253  void set_currentaxes (const octave_value& val);
4254 
4255  void set_currentcharacter (const octave_value& val)
4256  {
4257  if (! error_state)
4258  {
4259  if (currentcharacter.set (val, true))
4260  {
4261  mark_modified ();
4262  }
4263  }
4264  }
4265 
4266  void set_currentobject (const octave_value& val)
4267  {
4268  if (! error_state)
4269  {
4270  if (currentobject.set (val, true))
4271  {
4272  mark_modified ();
4273  }
4274  }
4275  }
4276 
4277  void set_currentpoint (const octave_value& val)
4278  {
4279  if (! error_state)
4280  {
4281  if (currentpoint.set (val, true))
4282  {
4283  mark_modified ();
4284  }
4285  }
4286  }
4287 
4288  void set_dockcontrols (const octave_value& val)
4289  {
4290  if (! error_state)
4291  {
4292  if (dockcontrols.set (val, true))
4293  {
4294  mark_modified ();
4295  }
4296  }
4297  }
4298 
4299  void set_doublebuffer (const octave_value& val)
4300  {
4301  if (! error_state)
4302  {
4303  if (doublebuffer.set (val, true))
4304  {
4305  mark_modified ();
4306  }
4307  }
4308  }
4309 
4310  void set_filename (const octave_value& val)
4311  {
4312  if (! error_state)
4313  {
4314  if (filename.set (val, true))
4315  {
4316  mark_modified ();
4317  }
4318  }
4319  }
4320 
4321  void set_integerhandle (const octave_value& val);
4322 
4323  void set_inverthardcopy (const octave_value& val)
4324  {
4325  if (! error_state)
4326  {
4327  if (inverthardcopy.set (val, true))
4328  {
4329  mark_modified ();
4330  }
4331  }
4332  }
4333 
4334  void set_keypressfcn (const octave_value& val)
4335  {
4336  if (! error_state)
4337  {
4338  if (keypressfcn.set (val, true))
4339  {
4340  mark_modified ();
4341  }
4342  }
4343  }
4344 
4345  void set_keyreleasefcn (const octave_value& val)
4346  {
4347  if (! error_state)
4348  {
4349  if (keyreleasefcn.set (val, true))
4350  {
4351  mark_modified ();
4352  }
4353  }
4354  }
4355 
4356  void set_menubar (const octave_value& val)
4357  {
4358  if (! error_state)
4359  {
4360  if (menubar.set (val, true))
4361  {
4362  mark_modified ();
4363  }
4364  }
4365  }
4366 
4367  void set_mincolormap (const octave_value& val)
4368  {
4369  if (! error_state)
4370  {
4371  if (mincolormap.set (val, true))
4372  {
4373  mark_modified ();
4374  }
4375  }
4376  }
4377 
4378  void set_name (const octave_value& val)
4379  {
4380  if (! error_state)
4381  {
4382  if (name.set (val, true))
4383  {
4384  mark_modified ();
4385  }
4386  }
4387  }
4388 
4389  void set_nextplot (const octave_value& val)
4390  {
4391  if (! error_state)
4392  {
4393  if (nextplot.set (val, true))
4394  {
4395  mark_modified ();
4396  }
4397  }
4398  }
4399 
4400  void set_numbertitle (const octave_value& val)
4401  {
4402  if (! error_state)
4403  {
4404  if (numbertitle.set (val, true))
4405  {
4406  mark_modified ();
4407  }
4408  }
4409  }
4410 
4411  void set_paperorientation (const octave_value& val)
4412  {
4413  if (! error_state)
4414  {
4415  if (paperorientation.set (val, true))
4416  {
4417  update_paperorientation ();
4418  mark_modified ();
4419  }
4420  }
4421  }
4422 
4423  void update_paperorientation (void);
4424 
4425  void set_paperposition (const octave_value& val)
4426  {
4427  if (! error_state)
4428  {
4429  if (paperposition.set (val, true))
4430  {
4431  mark_modified ();
4432  }
4433  }
4434  }
4435 
4436  void set_paperpositionmode (const octave_value& val)
4437  {
4438  if (! error_state)
4439  {
4440  if (paperpositionmode.set (val, true))
4441  {
4442  mark_modified ();
4443  }
4444  }
4445  }
4446 
4447  void set_papersize (const octave_value& val)
4448  {
4449  if (! error_state)
4450  {
4451  if (papersize.set (val, true))
4452  {
4453  update_papersize ();
4454  mark_modified ();
4455  }
4456  }
4457  }
4458 
4459  void update_papersize (void);
4460 
4461  void set_papertype (const octave_value& val);
4462 
4463  void update_papertype (void);
4464 
4465  void set_paperunits (const octave_value& val);
4466 
4467  void set_pointer (const octave_value& val)
4468  {
4469  if (! error_state)
4470  {
4471  if (pointer.set (val, true))
4472  {
4473  mark_modified ();
4474  }
4475  }
4476  }
4477 
4478  void set_pointershapecdata (const octave_value& val)
4479  {
4480  if (! error_state)
4481  {
4482  if (pointershapecdata.set (val, true))
4483  {
4484  mark_modified ();
4485  }
4486  }
4487  }
4488 
4489  void set_pointershapehotspot (const octave_value& val)
4490  {
4491  if (! error_state)
4492  {
4493  if (pointershapehotspot.set (val, true))
4494  {
4495  mark_modified ();
4496  }
4497  }
4498  }
4499 
4500  void set_renderer (const octave_value& val)
4501  {
4502  if (! error_state)
4503  {
4504  if (renderer.set (val, true))
4505  {
4506  mark_modified ();
4507  }
4508  }
4509  }
4510 
4511  void set_renderermode (const octave_value& val)
4512  {
4513  if (! error_state)
4514  {
4515  if (renderermode.set (val, true))
4516  {
4517  mark_modified ();
4518  }
4519  }
4520  }
4521 
4522  void set_resize (const octave_value& val)
4523  {
4524  if (! error_state)
4525  {
4526  if (resize.set (val, true))
4527  {
4528  mark_modified ();
4529  }
4530  }
4531  }
4532 
4533  void set_resizefcn (const octave_value& val)
4534  {
4535  if (! error_state)
4536  {
4537  if (resizefcn.set (val, true))
4538  {
4539  mark_modified ();
4540  }
4541  }
4542  }
4543 
4544  void set_selectiontype (const octave_value& val)
4545  {
4546  if (! error_state)
4547  {
4548  if (selectiontype.set (val, true))
4549  {
4550  mark_modified ();
4551  }
4552  }
4553  }
4554 
4555  void set_toolbar (const octave_value& val)
4556  {
4557  if (! error_state)
4558  {
4559  if (toolbar.set (val, true))
4560  {
4561  mark_modified ();
4562  }
4563  }
4564  }
4565 
4566  void set_units (const octave_value& val);
4567 
4568  void set_windowbuttondownfcn (const octave_value& val)
4569  {
4570  if (! error_state)
4571  {
4572  if (windowbuttondownfcn.set (val, true))
4573  {
4574  mark_modified ();
4575  }
4576  }
4577  }
4578 
4579  void set_windowbuttonmotionfcn (const octave_value& val)
4580  {
4581  if (! error_state)
4582  {
4583  if (windowbuttonmotionfcn.set (val, true))
4584  {
4585  mark_modified ();
4586  }
4587  }
4588  }
4589 
4590  void set_windowbuttonupfcn (const octave_value& val)
4591  {
4592  if (! error_state)
4593  {
4594  if (windowbuttonupfcn.set (val, true))
4595  {
4596  mark_modified ();
4597  }
4598  }
4599  }
4600 
4601  void set_windowkeypressfcn (const octave_value& val)
4602  {
4603  if (! error_state)
4604  {
4605  if (windowkeypressfcn.set (val, true))
4606  {
4607  mark_modified ();
4608  }
4609  }
4610  }
4611 
4612  void set_windowkeyreleasefcn (const octave_value& val)
4613  {
4614  if (! error_state)
4615  {
4616  if (windowkeyreleasefcn.set (val, true))
4617  {
4618  mark_modified ();
4619  }
4620  }
4621  }
4622 
4623  void set_windowscrollwheelfcn (const octave_value& val)
4624  {
4625  if (! error_state)
4626  {
4627  if (windowscrollwheelfcn.set (val, true))
4628  {
4629  mark_modified ();
4630  }
4631  }
4632  }
4633 
4634  void set_windowstyle (const octave_value& val)
4635  {
4636  if (! error_state)
4637  {
4638  if (windowstyle.set (val, true))
4639  {
4640  mark_modified ();
4641  }
4642  }
4643  }
4644 
4645  void set_wvisual (const octave_value& val)
4646  {
4647  if (! error_state)
4648  {
4649  if (wvisual.set (val, true))
4650  {
4651  mark_modified ();
4652  }
4653  }
4654  }
4655 
4656  void set_wvisualmode (const octave_value& val)
4657  {
4658  if (! error_state)
4659  {
4660  if (wvisualmode.set (val, true))
4661  {
4662  mark_modified ();
4663  }
4664  }
4665  }
4666 
4667  void set_xdisplay (const octave_value& val)
4668  {
4669  if (! error_state)
4670  {
4671  if (xdisplay.set (val, true))
4672  {
4673  mark_modified ();
4674  }
4675  }
4676  }
4677 
4678  void set_xvisual (const octave_value& val)
4679  {
4680  if (! error_state)
4681  {
4682  if (xvisual.set (val, true))
4683  {
4684  mark_modified ();
4685  }
4686  }
4687  }
4688 
4689  void set_xvisualmode (const octave_value& val)
4690  {
4691  if (! error_state)
4692  {
4693  if (xvisualmode.set (val, true))
4694  {
4695  mark_modified ();
4696  }
4697  }
4698  }
4699 
4700  void set___enhanced__ (const octave_value& val)
4701  {
4702  if (! error_state)
4703  {
4704  if (__enhanced__.set (val, true))
4705  {
4706  mark_modified ();
4707  }
4708  }
4709  }
4710 
4711  void set___guidata__ (const octave_value& val)
4712  {
4713  if (! error_state)
4714  {
4715  if (__guidata__.set (val, true))
4716  {
4717  mark_modified ();
4718  }
4719  }
4720  }
4721 
4722  void set___plot_stream__ (const octave_value& val)
4723  {
4724  if (! error_state)
4725  {
4726  if (__plot_stream__.set (val, true))
4727  {
4728  mark_modified ();
4729  }
4730  }
4731  }
4732 
4733 
4734  protected:
4735  void init (void)
4736  {
4737  alphamap.add_constraint (dim_vector (-1, 1));
4738  colormap.add_constraint (dim_vector (-1, 3));
4739  outerposition.add_constraint (dim_vector (1, 4));
4740  paperposition.add_constraint (dim_vector (1, 4));
4741  papersize.add_constraint (dim_vector (1, 2));
4742  pointershapecdata.add_constraint (dim_vector (16, 16));
4743  pointershapehotspot.add_constraint (dim_vector (1, 2));
4744  position.add_constraint (dim_vector (1, 4));
4745  }
4746 
4747  private:
4749  };
4750 
4751 private:
4753 
4754 public:
4756  : base_graphics_object (), xproperties (mh, p), default_properties ()
4757  {
4758  xproperties.override_defaults (*this);
4759  }
4760 
4761  ~figure (void) { }
4762 
4764  {
4765  // Allow parent (root figure) to override first (properties knows how
4766  // to find the parent object).
4767  xproperties.override_defaults (obj);
4768 
4769  // Now override with our defaults. If the default_properties
4770  // list includes the properties for all defaults (line,
4771  // surface, etc.) then we don't have to know the type of OBJ
4772  // here, we just call its set function and let it decide which
4773  // properties from the list to use.
4774  obj.set_from_list (default_properties);
4775  }
4776 
4777  void set (const caseless_str& name, const octave_value& value)
4778  {
4779  if (name.compare ("default", 7))
4780  // strip "default", pass rest to function that will
4781  // parse the remainder and add the element to the
4782  // default_properties map.
4783  default_properties.set (name.substr (7), value);
4784  else
4785  xproperties.set (name, value);
4786  }
4787 
4788  octave_value get (const caseless_str& name) const
4789  {
4790  octave_value retval;
4791 
4792  if (name.compare ("default", 7))
4793  retval = get_default (name.substr (7));
4794  else
4795  retval = xproperties.get (name);
4796 
4797  return retval;
4798  }
4799 
4800  octave_value get_default (const caseless_str& name) const;
4801 
4802  octave_value get_defaults (void) const
4803  {
4804  return default_properties.as_struct ("default");
4805  }
4806 
4807  base_properties& get_properties (void) { return xproperties; }
4808 
4809  const base_properties& get_properties (void) const { return xproperties; }
4810 
4811  bool valid_object (void) const { return true; }
4812 
4813  void reset_default_properties (void);
4814 
4815 private:
4817 };
4818 
4819 // ---------------------------------------------------------------------
4820 
4822 {
4823 public:
4825  : xform (xform_eye ()), xform_inv (xform_eye ()),
4826  sx ("linear"), sy ("linear"), sz ("linear"), zlim (1, 2, 0.0)
4827  {
4828  zlim(1) = 1.0;
4829  }
4830 
4831  graphics_xform (const Matrix& xm, const Matrix& xim,
4832  const scaler& x, const scaler& y, const scaler& z,
4833  const Matrix& zl)
4834  : xform (xm), xform_inv (xim), sx (x), sy (y), sz (z), zlim (zl) { }
4835 
4837  : xform (g.xform), xform_inv (g.xform_inv), sx (g.sx),
4838  sy (g.sy), sz (g.sz), zlim (g.zlim) { }
4839 
4840  ~graphics_xform (void) { }
4841 
4842  graphics_xform& operator = (const graphics_xform& g)
4843  {
4844  xform = g.xform;
4845  xform_inv = g.xform_inv;
4846  sx = g.sx;
4847  sy = g.sy;
4848  sz = g.sz;
4849  zlim = g.zlim;
4850 
4851  return *this;
4852  }
4853 
4854  static ColumnVector xform_vector (double x, double y, double z);
4855 
4856  static Matrix xform_eye (void);
4857 
4858  ColumnVector transform (double x, double y, double z,
4859  bool use_scale = true) const;
4860 
4861  ColumnVector untransform (double x, double y, double z,
4862  bool use_scale = true) const;
4863 
4864  ColumnVector untransform (double x, double y, bool use_scale = true) const
4865  { return untransform (x, y, (zlim(0)+zlim(1))/2, use_scale); }
4866 
4867  Matrix xscale (const Matrix& m) const { return sx.scale (m); }
4868  Matrix yscale (const Matrix& m) const { return sy.scale (m); }
4869  Matrix zscale (const Matrix& m) const { return sz.scale (m); }
4870 
4871  Matrix scale (const Matrix& m) const
4872  {
4873  bool has_z = (m.columns () > 2);
4874 
4875  if (sx.is_linear () && sy.is_linear ()
4876  && (! has_z || sz.is_linear ()))
4877  return m;
4878 
4879  Matrix retval (m.dims ());
4880 
4881  int r = m.rows ();
4882 
4883  for (int i = 0; i < r; i++)
4884  {
4885  retval(i,0) = sx.scale (m(i,0));
4886  retval(i,1) = sy.scale (m(i,1));
4887  if (has_z)
4888  retval(i,2) = sz.scale (m(i,2));
4889  }
4890 
4891  return retval;
4892  }
4893 
4894 private:
4897  scaler sx, sy, sz;
4899 };
4900 
4901 enum
4902 {
4907 };
4908 
4910 {
4911 public:
4913  {
4914  public:
4915  void set_defaults (base_graphics_object& obj, const std::string& mode);
4916 
4917  void remove_child (const graphics_handle& h);
4918 
4919  const scaler& get_x_scaler (void) const { return sx; }
4920  const scaler& get_y_scaler (void) const { return sy; }
4921  const scaler& get_z_scaler (void) const { return sz; }
4922 
4923  Matrix get_boundingbox (bool internal = false,
4924  const Matrix& parent_pix_size = Matrix ()) const;
4925  Matrix get_extent (bool with_text = false,
4926  bool only_text_height=false) const;
4927 
4928  double get_fontsize_points (double box_pix_height = 0) const;
4929 
4930  void update_boundingbox (void)
4931  {
4932  if (units_is ("normalized"))
4933  {
4934  sync_positions ();
4936  }
4937  }
4938 
4939  void update_camera (void);
4940  void update_axes_layout (void);
4941  void update_aspectratios (void);
4942  void update_transform (void)
4943  {
4944  update_aspectratios ();
4945  update_camera ();
4946  update_axes_layout ();
4947  }
4948 
4949  void sync_positions (void);
4950 
4951  void update_autopos (const std::string& elem_type);
4952  void update_xlabel_position (void);
4953  void update_ylabel_position (void);
4954  void update_zlabel_position (void);
4955  void update_title_position (void);
4956 
4957  graphics_xform get_transform (void) const
4958  { return graphics_xform (x_render, x_render_inv, sx, sy, sz, x_zlim); }
4959 
4960  Matrix get_transform_matrix (void) const { return x_render; }
4961  Matrix get_inverse_transform_matrix (void) const { return x_render_inv; }
4962  Matrix get_opengl_matrix_1 (void) const { return x_gl_mat1; }
4963  Matrix get_opengl_matrix_2 (void) const { return x_gl_mat2; }
4964  Matrix get_transform_zlim (void) const { return x_zlim; }
4965 
4966  int get_xstate (void) const { return xstate; }
4967  int get_ystate (void) const { return ystate; }
4968  int get_zstate (void) const { return zstate; }
4969  double get_xPlane (void) const { return xPlane; }
4970  double get_xPlaneN (void) const { return xPlaneN; }
4971  double get_yPlane (void) const { return yPlane; }
4972  double get_yPlaneN (void) const { return yPlaneN; }
4973  double get_zPlane (void) const { return zPlane; }
4974  double get_zPlaneN (void) const { return zPlaneN; }
4975  double get_xpTick (void) const { return xpTick; }
4976  double get_xpTickN (void) const { return xpTickN; }
4977  double get_ypTick (void) const { return ypTick; }
4978  double get_ypTickN (void) const { return ypTickN; }
4979  double get_zpTick (void) const { return zpTick; }
4980  double get_zpTickN (void) const { return zpTickN; }
4981  double get_x_min (void) const { return std::min (xPlane, xPlaneN); }
4982  double get_x_max (void) const { return std::max (xPlane, xPlaneN); }
4983  double get_y_min (void) const { return std::min (yPlane, yPlaneN); }
4984  double get_y_max (void) const { return std::max (yPlane, yPlaneN); }
4985  double get_z_min (void) const { return std::min (zPlane, zPlaneN); }
4986  double get_z_max (void) const { return std::max (zPlane, zPlaneN); }
4987  double get_fx (void) const { return fx; }
4988  double get_fy (void) const { return fy; }
4989  double get_fz (void) const { return fz; }
4990  double get_xticklen (void) const { return xticklen; }
4991  double get_yticklen (void) const { return yticklen; }
4992  double get_zticklen (void) const { return zticklen; }
4993  double get_xtickoffset (void) const { return xtickoffset; }
4994  double get_ytickoffset (void) const { return ytickoffset; }
4995  double get_ztickoffset (void) const { return ztickoffset; }
4996  bool get_x2Dtop (void) const { return x2Dtop; }
4997  bool get_y2Dright (void) const { return y2Dright; }
4998  bool get_layer2Dtop (void) const { return layer2Dtop; }
4999  bool get_xySym (void) const { return xySym; }
5000  bool get_xyzSym (void) const { return xyzSym; }
5001  bool get_zSign (void) const { return zSign; }
5002  bool get_nearhoriz (void) const { return nearhoriz; }
5003 
5004  ColumnVector pixel2coord (double px, double py) const
5005  { return get_transform ().untransform (px, py, (x_zlim(0)+x_zlim(1))/2); }
5006 
5007  ColumnVector coord2pixel (double x, double y, double z) const
5008  { return get_transform ().transform (x, y, z); }
5009 
5010  void zoom_about_point (double x, double y, double factor,
5011  bool push_to_zoom_stack = true);
5012  void zoom (const Matrix& xl, const Matrix& yl,
5013  bool push_to_zoom_stack = true);
5014  void translate_view (double x0, double x1, double y0, double y1);
5015  void rotate_view (double delta_az, double delta_el);
5016  void unzoom (void);
5017  void clear_zoom_stack (void);
5018 
5019  void update_units (const caseless_str& old_units);
5020 
5021  void update_fontunits (const caseless_str& old_fontunits);
5022 
5023  private:
5024  scaler sx, sy, sz;
5026  Matrix x_gl_mat1, x_gl_mat2;
5028  std::list<octave_value> zoom_stack;
5029 
5030  // Axes layout data
5031  int xstate, ystate, zstate;
5032  double xPlane, xPlaneN, yPlane, yPlaneN, zPlane, zPlaneN;
5033  double xpTick, xpTickN, ypTick, ypTickN, zpTick, zpTickN;
5034  double fx, fy, fz;
5035  double xticklen, yticklen, zticklen;
5036  double xtickoffset, ytickoffset, ztickoffset;
5037  bool x2Dtop, y2Dright, layer2Dtop;
5038  bool xySym, xyzSym, zSign, nearhoriz;
5039 
5040 #if HAVE_FREETYPE
5041  // freetype renderer, used for calculation of text (tick labels) size
5043 #endif
5044 
5045  void set_text_child (handle_property& h, const std::string& who,
5046  const octave_value& v);
5047 
5048  void delete_text_child (handle_property& h);
5049 
5050  // See the genprops.awk script for an explanation of the
5051  // properties declarations.
5052  // Programming note: Keep property list sorted if new ones are added.
5053 
5054 public:
5055  properties (const graphics_handle& mh, const graphics_handle& p);
5056 
5057  ~properties (void) { }
5058 
5059  void set (const caseless_str& pname, const octave_value& val);
5060 
5061  octave_value get (bool all = false) const;
5062 
5063  octave_value get (const caseless_str& pname) const;
5064 
5065  octave_value get (const std::string& pname) const
5066  {
5067  return get (caseless_str (pname));
5068  }
5069 
5070  octave_value get (const char *pname) const
5071  {
5072  return get (caseless_str (pname));
5073  }
5074 
5075  property get_property (const caseless_str& pname);
5076 
5077  std::string graphics_object_name (void) const { return go_name; }
5078 
5079  static property_list::pval_map_type factory_defaults (void);
5080 
5081 private:
5082  static std::string go_name;
5083 
5084 public:
5085 
5086 
5087  static std::set<std::string> core_property_names (void);
5088 
5089  static bool has_core_property (const caseless_str& pname);
5090 
5091  std::set<std::string> all_property_names (void) const;
5092 
5093  bool has_property (const caseless_str& pname) const;
5094 
5095 private:
5096 
5194 
5195 public:
5196 
5197  enum
5198  {
5199  ID_ACTIVEPOSITIONPROPERTY = 3000,
5200  ID_ALIM = 3001,
5201  ID_ALIMMODE = 3002,
5202  ID_AMBIENTLIGHTCOLOR = 3003,
5203  ID_BOX = 3004,
5204  ID_CAMERAPOSITION = 3005,
5205  ID_CAMERAPOSITIONMODE = 3006,
5206  ID_CAMERATARGET = 3007,
5207  ID_CAMERATARGETMODE = 3008,
5208  ID_CAMERAUPVECTOR = 3009,
5209  ID_CAMERAUPVECTORMODE = 3010,
5210  ID_CAMERAVIEWANGLE = 3011,
5211  ID_CAMERAVIEWANGLEMODE = 3012,
5212  ID_CLIM = 3013,
5213  ID_CLIMMODE = 3014,
5214  ID_COLOR = 3015,
5215  ID_COLORORDER = 3016,
5216  ID_CURRENTPOINT = 3017,
5217  ID_DATAASPECTRATIO = 3018,
5218  ID_DATAASPECTRATIOMODE = 3019,
5219  ID_DRAWMODE = 3020,
5220  ID_FONTANGLE = 3021,
5221  ID_FONTNAME = 3022,
5222  ID_FONTSIZE = 3023,
5223  ID_FONTUNITS = 3024,
5224  ID_FONTWEIGHT = 3025,
5225  ID_GRIDLINESTYLE = 3026,
5226  ID_INTERPRETER = 3027,
5227  ID_LAYER = 3028,
5228  ID_LINESTYLEORDER = 3029,
5229  ID_LINEWIDTH = 3030,
5230  ID_MINORGRIDLINESTYLE = 3031,
5231  ID_NEXTPLOT = 3032,
5232  ID_OUTERPOSITION = 3033,
5233  ID_PLOTBOXASPECTRATIO = 3034,
5234  ID_PLOTBOXASPECTRATIOMODE = 3035,
5235  ID_POSITION = 3036,
5236  ID_PROJECTION = 3037,
5237  ID_TICKDIR = 3038,
5238  ID_TICKDIRMODE = 3039,
5239  ID_TICKLENGTH = 3040,
5240  ID_TIGHTINSET = 3041,
5241  ID_TITLE = 3042,
5242  ID_UNITS = 3043,
5243  ID_VIEW = 3044,
5244  ID_XAXISLOCATION = 3045,
5245  ID_XCOLOR = 3046,
5246  ID_XDIR = 3047,
5247  ID_XGRID = 3048,
5248  ID_XLABEL = 3049,
5249  ID_XLIM = 3050,
5250  ID_XLIMMODE = 3051,
5251  ID_XMINORGRID = 3052,
5252  ID_XMINORTICK = 3053,
5253  ID_XSCALE = 3054,
5254  ID_XTICK = 3055,
5255  ID_XTICKLABEL = 3056,
5256  ID_XTICKLABELMODE = 3057,
5257  ID_XTICKMODE = 3058,
5258  ID_YAXISLOCATION = 3059,
5259  ID_YCOLOR = 3060,
5260  ID_YDIR = 3061,
5261  ID_YGRID = 3062,
5262  ID_YLABEL = 3063,
5263  ID_YLIM = 3064,
5264  ID_YLIMMODE = 3065,
5265  ID_YMINORGRID = 3066,
5266  ID_YMINORTICK = 3067,
5267  ID_YSCALE = 3068,
5268  ID_YTICK = 3069,
5269  ID_YTICKLABEL = 3070,
5270  ID_YTICKLABELMODE = 3071,
5271  ID_YTICKMODE = 3072,
5272  ID_ZCOLOR = 3073,
5273  ID_ZDIR = 3074,
5274  ID_ZGRID = 3075,
5275  ID_ZLABEL = 3076,
5276  ID_ZLIM = 3077,
5277  ID_ZLIMMODE = 3078,
5278  ID_ZMINORGRID = 3079,
5279  ID_ZMINORTICK = 3080,
5280  ID_ZSCALE = 3081,
5281  ID_ZTICK = 3082,
5282  ID_ZTICKLABEL = 3083,
5283  ID_ZTICKLABELMODE = 3084,
5284  ID_ZTICKMODE = 3085,
5285  ID___HOLD_ALL__ = 3086,
5286  ID_AUTOPOS_TAG = 3087,
5287  ID_LOOSEINSET = 3088,
5288  ID_X_VIEWTRANSFORM = 3089,
5289  ID_X_PROJECTIONTRANSFORM = 3090,
5290  ID_X_VIEWPORTTRANSFORM = 3091,
5291  ID_X_NORMRENDERTRANSFORM = 3092,
5292  ID_X_RENDERTRANSFORM = 3093,
5293  ID_XMTICK = 3094,
5294  ID_YMTICK = 3095,
5295  ID_ZMTICK = 3096
5296  };
5297 
5298  bool activepositionproperty_is (const std::string& v) const { return activepositionproperty.is (v); }
5299  std::string get_activepositionproperty (void) const { return activepositionproperty.current_value (); }
5300 
5301  octave_value get_alim (void) const { return alim.get (); }
5302 
5303  bool alimmode_is (const std::string& v) const { return alimmode.is (v); }
5304  std::string get_alimmode (void) const { return alimmode.current_value (); }
5305 
5306  bool ambientlightcolor_is_rgb (void) const { return ambientlightcolor.is_rgb (); }
5307  bool ambientlightcolor_is (const std::string& v) const { return ambientlightcolor.is (v); }
5308  Matrix get_ambientlightcolor_rgb (void) const { return (ambientlightcolor.is_rgb () ? ambientlightcolor.rgb () : Matrix ()); }
5309  octave_value get_ambientlightcolor (void) const { return ambientlightcolor.get (); }
5310 
5311  bool is_box (void) const { return box.is_on (); }
5312  std::string get_box (void) const { return box.current_value (); }
5313 
5314  octave_value get_cameraposition (void) const { return cameraposition.get (); }
5315 
5316  bool camerapositionmode_is (const std::string& v) const { return camerapositionmode.is (v); }
5317  std::string get_camerapositionmode (void) const { return camerapositionmode.current_value (); }
5318 
5319  octave_value get_cameratarget (void) const { return cameratarget.get (); }
5320 
5321  bool cameratargetmode_is (const std::string& v) const { return cameratargetmode.is (v); }
5322  std::string get_cameratargetmode (void) const { return cameratargetmode.current_value (); }
5323 
5324  octave_value get_cameraupvector (void) const { return cameraupvector.get (); }
5325 
5326  bool cameraupvectormode_is (const std::string& v) const { return cameraupvectormode.is (v); }
5327  std::string get_cameraupvectormode (void) const { return cameraupvectormode.current_value (); }
5328 
5329  double get_cameraviewangle (void) const { return cameraviewangle.double_value (); }
5330 
5331  bool cameraviewanglemode_is (const std::string& v) const { return cameraviewanglemode.is (v); }
5332  std::string get_cameraviewanglemode (void) const { return cameraviewanglemode.current_value (); }
5333 
5334  octave_value get_clim (void) const { return clim.get (); }
5335 
5336  bool climmode_is (const std::string& v) const { return climmode.is (v); }
5337  std::string get_climmode (void) const { return climmode.current_value (); }
5338 
5339  bool color_is_rgb (void) const { return color.is_rgb (); }
5340  bool color_is (const std::string& v) const { return color.is (v); }
5341  Matrix get_color_rgb (void) const { return (color.is_rgb () ? color.rgb () : Matrix ()); }
5342  octave_value get_color (void) const { return color.get (); }
5343 
5344  octave_value get_colororder (void) const { return colororder.get (); }
5345 
5346  octave_value get_currentpoint (void) const { return currentpoint.get (); }
5347 
5348  octave_value get_dataaspectratio (void) const { return dataaspectratio.get (); }
5349 
5350  bool dataaspectratiomode_is (const std::string& v) const { return dataaspectratiomode.is (v); }
5351  std::string get_dataaspectratiomode (void) const { return dataaspectratiomode.current_value (); }
5352 
5353  bool drawmode_is (const std::string& v) const { return drawmode.is (v); }
5354  std::string get_drawmode (void) const { return drawmode.current_value (); }
5355 
5356  bool fontangle_is (const std::string& v) const { return fontangle.is (v); }
5357  std::string get_fontangle (void) const { return fontangle.current_value (); }
5358 
5359  std::string get_fontname (void) const { return fontname.string_value (); }
5360 
5361  double get_fontsize (void) const { return fontsize.double_value (); }
5362 
5363  bool fontunits_is (const std::string& v) const { return fontunits.is (v); }
5364  std::string get_fontunits (void) const { return fontunits.current_value (); }
5365 
5366  bool fontweight_is (const std::string& v) const { return fontweight.is (v); }
5367  std::string get_fontweight (void) const { return fontweight.current_value (); }
5368 
5369  bool gridlinestyle_is (const std::string& v) const { return gridlinestyle.is (v); }
5370  std::string get_gridlinestyle (void) const { return gridlinestyle.current_value (); }
5371 
5372  bool interpreter_is (const std::string& v) const { return interpreter.is (v); }
5373  std::string get_interpreter (void) const { return interpreter.current_value (); }
5374 
5375  bool layer_is (const std::string& v) const { return layer.is (v); }
5376  std::string get_layer (void) const { return layer.current_value (); }
5377 
5378  octave_value get_linestyleorder (void) const { return linestyleorder.get (); }
5379 
5380  double get_linewidth (void) const { return linewidth.double_value (); }
5381 
5382  bool minorgridlinestyle_is (const std::string& v) const { return minorgridlinestyle.is (v); }
5383  std::string get_minorgridlinestyle (void) const { return minorgridlinestyle.current_value (); }
5384 
5385  bool nextplot_is (const std::string& v) const { return nextplot.is (v); }
5386  std::string get_nextplot (void) const { return nextplot.current_value (); }
5387 
5388  octave_value get_outerposition (void) const { return outerposition.get (); }
5389 
5390  octave_value get_plotboxaspectratio (void) const { return plotboxaspectratio.get (); }
5391 
5392  bool plotboxaspectratiomode_is (const std::string& v) const { return plotboxaspectratiomode.is (v); }
5393  std::string get_plotboxaspectratiomode (void) const { return plotboxaspectratiomode.current_value (); }
5394 
5395  octave_value get_position (void) const { return position.get (); }
5396 
5397  bool projection_is (const std::string& v) const { return projection.is (v); }
5398  std::string get_projection (void) const { return projection.current_value (); }
5399 
5400  bool tickdir_is (const std::string& v) const { return tickdir.is (v); }
5401  std::string get_tickdir (void) const { return tickdir.current_value (); }
5402 
5403  bool tickdirmode_is (const std::string& v) const { return tickdirmode.is (v); }
5404  std::string get_tickdirmode (void) const { return tickdirmode.current_value (); }
5405 
5406  octave_value get_ticklength (void) const { return ticklength.get (); }
5407 
5408  octave_value get_tightinset (void) const { return tightinset.get (); }
5409 
5410  graphics_handle get_title (void) const { return title.handle_value (); }
5411 
5412  bool units_is (const std::string& v) const { return units.is (v); }
5413  std::string get_units (void) const { return units.current_value (); }
5414 
5415  octave_value get_view (void) const { return view.get (); }
5416 
5417  bool xaxislocation_is (const std::string& v) const { return xaxislocation.is (v); }
5418  std::string get_xaxislocation (void) const { return xaxislocation.current_value (); }
5419 
5420  bool xcolor_is_rgb (void) const { return xcolor.is_rgb (); }
5421  bool xcolor_is (const std::string& v) const { return xcolor.is (v); }
5422  Matrix get_xcolor_rgb (void) const { return (xcolor.is_rgb () ? xcolor.rgb () : Matrix ()); }
5423  octave_value get_xcolor (void) const { return xcolor.get (); }
5424 
5425  bool xdir_is (const std::string& v) const { return xdir.is (v); }
5426  std::string get_xdir (void) const { return xdir.current_value (); }
5427 
5428  bool is_xgrid (void) const { return xgrid.is_on (); }
5429  std::string get_xgrid (void) const { return xgrid.current_value (); }
5430 
5431  graphics_handle get_xlabel (void) const { return xlabel.handle_value (); }
5432 
5433  octave_value get_xlim (void) const { return xlim.get (); }
5434 
5435  bool xlimmode_is (const std::string& v) const { return xlimmode.is (v); }
5436  std::string get_xlimmode (void) const { return xlimmode.current_value (); }
5437 
5438  bool is_xminorgrid (void) const { return xminorgrid.is_on (); }
5439  std::string get_xminorgrid (void) const { return xminorgrid.current_value (); }
5440 
5441  bool is_xminortick (void) const { return xminortick.is_on (); }
5442  std::string get_xminortick (void) const { return xminortick.current_value (); }
5443 
5444  bool xscale_is (const std::string& v) const { return xscale.is (v); }
5445  std::string get_xscale (void) const { return xscale.current_value (); }
5446 
5447  octave_value get_xtick (void) const { return xtick.get (); }
5448 
5449  octave_value get_xticklabel (void) const { return xticklabel.get (); }
5450 
5451  bool xticklabelmode_is (const std::string& v) const { return xticklabelmode.is (v); }
5452  std::string get_xticklabelmode (void) const { return xticklabelmode.current_value (); }
5453 
5454  bool xtickmode_is (const std::string& v) const { return xtickmode.is (v); }
5455  std::string get_xtickmode (void) const { return xtickmode.current_value (); }
5456 
5457  bool yaxislocation_is (const std::string& v) const { return yaxislocation.is (v); }
5458  std::string get_yaxislocation (void) const { return yaxislocation.current_value (); }
5459 
5460  bool ycolor_is_rgb (void) const { return ycolor.is_rgb (); }
5461  bool ycolor_is (const std::string& v) const { return ycolor.is (v); }
5462  Matrix get_ycolor_rgb (void) const { return (ycolor.is_rgb () ? ycolor.rgb () : Matrix ()); }
5463  octave_value get_ycolor (void) const { return ycolor.get (); }
5464 
5465  bool ydir_is (const std::string& v) const { return ydir.is (v); }
5466  std::string get_ydir (void) const { return ydir.current_value (); }
5467 
5468  bool is_ygrid (void) const { return ygrid.is_on (); }
5469  std::string get_ygrid (void) const { return ygrid.current_value (); }
5470 
5471  graphics_handle get_ylabel (void) const { return ylabel.handle_value (); }
5472 
5473  octave_value get_ylim (void) const { return ylim.get (); }
5474 
5475  bool ylimmode_is (const std::string& v) const { return ylimmode.is (v); }
5476  std::string get_ylimmode (void) const { return ylimmode.current_value (); }
5477 
5478  bool is_yminorgrid (void) const { return yminorgrid.is_on (); }
5479  std::string get_yminorgrid (void) const { return yminorgrid.current_value (); }
5480 
5481  bool is_yminortick (void) const { return yminortick.is_on (); }
5482  std::string get_yminortick (void) const { return yminortick.current_value (); }
5483 
5484  bool yscale_is (const std::string& v) const { return yscale.is (v); }
5485  std::string get_yscale (void) const { return yscale.current_value (); }
5486 
5487  octave_value get_ytick (void) const { return ytick.get (); }
5488 
5489  octave_value get_yticklabel (void) const { return yticklabel.get (); }
5490 
5491  bool yticklabelmode_is (const std::string& v) const { return yticklabelmode.is (v); }
5492  std::string get_yticklabelmode (void) const { return yticklabelmode.current_value (); }
5493 
5494  bool ytickmode_is (const std::string& v) const { return ytickmode.is (v); }
5495  std::string get_ytickmode (void) const { return ytickmode.current_value (); }
5496 
5497  bool zcolor_is_rgb (void) const { return zcolor.is_rgb (); }
5498  bool zcolor_is (const std::string& v) const { return zcolor.is (v); }
5499  Matrix get_zcolor_rgb (void) const { return (zcolor.is_rgb () ? zcolor.rgb () : Matrix ()); }
5500  octave_value get_zcolor (void) const { return zcolor.get (); }
5501 
5502  bool zdir_is (const std::string& v) const { return zdir.is (v); }
5503  std::string get_zdir (void) const { return zdir.current_value (); }
5504 
5505  bool is_zgrid (void) const { return zgrid.is_on (); }
5506  std::string get_zgrid (void) const { return zgrid.current_value (); }
5507 
5508  graphics_handle get_zlabel (void) const { return zlabel.handle_value (); }
5509 
5510  octave_value get_zlim (void) const { return zlim.get (); }
5511 
5512  bool zlimmode_is (const std::string& v) const { return zlimmode.is (v); }
5513  std::string get_zlimmode (void) const { return zlimmode.current_value (); }
5514 
5515  bool is_zminorgrid (void) const { return zminorgrid.is_on (); }
5516  std::string get_zminorgrid (void) const { return zminorgrid.current_value (); }
5517 
5518  bool is_zminortick (void) const { return zminortick.is_on (); }
5519  std::string get_zminortick (void) const { return zminortick.current_value (); }
5520 
5521  bool zscale_is (const std::string& v) const { return zscale.is (v); }
5522  std::string get_zscale (void) const { return zscale.current_value (); }
5523 
5524  octave_value get_ztick (void) const { return ztick.get (); }
5525 
5526  octave_value get_zticklabel (void) const { return zticklabel.get (); }
5527 
5528  bool zticklabelmode_is (const std::string& v) const { return zticklabelmode.is (v); }
5529  std::string get_zticklabelmode (void) const { return zticklabelmode.current_value (); }
5530 
5531  bool ztickmode_is (const std::string& v) const { return ztickmode.is (v); }
5532  std::string get_ztickmode (void) const { return ztickmode.current_value (); }
5533 
5534  bool is___hold_all__ (void) const { return __hold_all__.is_on (); }
5535  std::string get___hold_all__ (void) const { return __hold_all__.current_value (); }
5536 
5537  bool autopos_tag_is (const std::string& v) const { return autopos_tag.is (v); }
5538  std::string get_autopos_tag (void) const { return autopos_tag.current_value (); }
5539 
5540  octave_value get_looseinset (void) const { return looseinset.get (); }
5541 
5542  octave_value get_x_viewtransform (void) const { return x_viewtransform.get (); }
5543 
5544  octave_value get_x_projectiontransform (void) const { return x_projectiontransform.get (); }
5545 
5546  octave_value get_x_viewporttransform (void) const { return x_viewporttransform.get (); }
5547 
5548  octave_value get_x_normrendertransform (void) const { return x_normrendertransform.get (); }
5549 
5550  octave_value get_x_rendertransform (void) const { return x_rendertransform.get (); }
5551 
5552  octave_value get_xmtick (void) const { return xmtick.get (); }
5553 
5554  octave_value get_ymtick (void) const { return ymtick.get (); }
5555 
5556  octave_value get_zmtick (void) const { return zmtick.get (); }
5557 
5558 
5559  void set_activepositionproperty (const octave_value& val)
5560  {
5561  if (! error_state)
5562  {
5563  if (activepositionproperty.set (val, true))
5564  {
5565  mark_modified ();
5566  }
5567  }
5568  }
5569 
5570  void set_alim (const octave_value& val)
5571  {
5572  if (! error_state)
5573  {
5574  if (alim.set (val, false))
5575  {
5576  set_alimmode ("manual");
5577  alim.run_listeners (POSTSET);
5578  mark_modified ();
5579  }
5580  else
5581  set_alimmode ("manual");
5582  }
5583  }
5584 
5585  void set_alimmode (const octave_value& val)
5586  {
5587  if (! error_state)
5588  {
5589  if (alimmode.set (val, true))
5590  {
5591  mark_modified ();
5592  }
5593  }
5594  }
5595 
5596  void set_ambientlightcolor (const octave_value& val)
5597  {
5598  if (! error_state)
5599  {
5600  if (ambientlightcolor.set (val, true))
5601  {
5602  mark_modified ();
5603  }
5604  }
5605  }
5606 
5607  void set_box (const octave_value& val)
5608  {
5609  if (! error_state)
5610  {
5611  if (box.set (val, true))
5612  {
5613  mark_modified ();
5614  }
5615  }
5616  }
5617 
5618  void set_cameraposition (const octave_value& val)
5619  {
5620  if (! error_state)
5621  {
5622  if (cameraposition.set (val, false))
5623  {
5624  set_camerapositionmode ("manual");
5625  cameraposition.run_listeners (POSTSET);
5626  mark_modified ();
5627  }
5628  else
5629  set_camerapositionmode ("manual");
5630  }
5631  }
5632 
5633  void set_camerapositionmode (const octave_value& val)
5634  {
5635  if (! error_state)
5636  {
5637  if (camerapositionmode.set (val, true))
5638  {
5639  mark_modified ();
5640  }
5641  }
5642  }
5643 
5644  void set_cameratarget (const octave_value& val)
5645  {
5646  if (! error_state)
5647  {
5648  if (cameratarget.set (val, false))
5649  {
5650  set_cameratargetmode ("manual");
5651  cameratarget.run_listeners (POSTSET);
5652  mark_modified ();
5653  }
5654  else
5655  set_cameratargetmode ("manual");
5656  }
5657  }
5658 
5659  void set_cameratargetmode (const octave_value& val)
5660  {
5661  if (! error_state)
5662  {
5663  if (cameratargetmode.set (val, true))
5664  {
5665  mark_modified ();
5666  }
5667  }
5668  }
5669 
5670  void set_cameraupvector (const octave_value& val)
5671  {
5672  if (! error_state)
5673  {
5674  if (cameraupvector.set (val, false))
5675  {
5676  set_cameraupvectormode ("manual");
5677  cameraupvector.run_listeners (POSTSET);
5678  mark_modified ();
5679  }
5680  else
5681  set_cameraupvectormode ("manual");
5682  }
5683  }
5684 
5685  void set_cameraupvectormode (const octave_value& val)
5686  {
5687  if (! error_state)
5688  {
5689  if (cameraupvectormode.set (val, true))
5690  {
5691  mark_modified ();
5692  }
5693  }
5694  }
5695 
5696  void set_cameraviewangle (const octave_value& val)
5697  {
5698  if (! error_state)
5699  {
5700  if (cameraviewangle.set (val, false))
5701  {
5702  set_cameraviewanglemode ("manual");
5703  cameraviewangle.run_listeners (POSTSET);
5704  mark_modified ();
5705  }
5706  else
5707  set_cameraviewanglemode ("manual");
5708  }
5709  }
5710 
5711  void set_cameraviewanglemode (const octave_value& val)
5712  {
5713  if (! error_state)
5714  {
5715  if (cameraviewanglemode.set (val, true))
5716  {
5717  mark_modified ();
5718  }
5719  }
5720  }
5721 
5722  void set_clim (const octave_value& val)
5723  {
5724  if (! error_state)
5725  {
5726  if (clim.set (val, false))
5727  {
5728  set_climmode ("manual");
5729  clim.run_listeners (POSTSET);
5730  mark_modified ();
5731  }
5732  else
5733  set_climmode ("manual");
5734  }
5735  }
5736 
5737  void set_climmode (const octave_value& val)
5738  {
5739  if (! error_state)
5740  {
5741  if (climmode.set (val, false))
5742  {
5743  update_axis_limits ("climmode");
5744  climmode.run_listeners (POSTSET);
5745  mark_modified ();
5746  }
5747  }
5748  }
5749 
5750  void set_color (const octave_value& val)
5751  {
5752  if (! error_state)
5753  {
5754  if (color.set (val, true))
5755  {
5756  mark_modified ();
5757  }
5758  }
5759  }
5760 
5761  void set_colororder (const octave_value& val)
5762  {
5763  if (! error_state)
5764  {
5765  if (colororder.set (val, true))
5766  {
5767  mark_modified ();
5768  }
5769  }
5770  }
5771 
5772  void set_currentpoint (const octave_value& val)
5773  {
5774  if (! error_state)
5775  {
5776  if (currentpoint.set (val, true))
5777  {
5778  mark_modified ();
5779  }
5780  }
5781  }
5782 
5783  void set_dataaspectratio (const octave_value& val)
5784  {
5785  if (! error_state)
5786  {
5787  if (dataaspectratio.set (val, false))
5788  {
5789  set_dataaspectratiomode ("manual");
5790  update_dataaspectratio ();
5791  dataaspectratio.run_listeners (POSTSET);
5792  mark_modified ();
5793  }
5794  else
5795  set_dataaspectratiomode ("manual");
5796  }
5797  }
5798 
5799  void set_dataaspectratiomode (const octave_value& val)
5800  {
5801  if (! error_state)
5802  {
5803  if (dataaspectratiomode.set (val, true))
5804  {
5805  update_dataaspectratiomode ();
5806  mark_modified ();
5807  }
5808  }
5809  }
5810 
5811  void set_drawmode (const octave_value& val)
5812  {
5813  if (! error_state)
5814  {
5815  if (drawmode.set (val, true))
5816  {
5817  mark_modified ();
5818  }
5819  }
5820  }
5821 
5822  void set_fontangle (const octave_value& val)
5823  {
5824  if (! error_state)
5825  {
5826  if (fontangle.set (val, true))
5827  {
5828  update_fontangle ();
5829  mark_modified ();
5830  }
5831  }
5832  }
5833 
5834  void set_fontname (const octave_value& val)
5835  {
5836  if (! error_state)
5837  {
5838  if (fontname.set (val, true))
5839  {
5840  update_fontname ();
5841  mark_modified ();
5842  }
5843  }
5844  }
5845 
5846  void set_fontsize (const octave_value& val)
5847  {
5848  if (! error_state)
5849  {
5850  if (fontsize.set (val, true))
5851  {
5852  update_fontsize ();
5853  mark_modified ();
5854  }
5855  }
5856  }
5857 
5858  void set_fontunits (const octave_value& val);
5859 
5860  void update_fontunits (void);
5861 
5862  void set_fontweight (const octave_value& val)
5863  {
5864  if (! error_state)
5865  {
5866  if (fontweight.set (val, true))
5867  {
5868  update_fontweight ();
5869  mark_modified ();
5870  }
5871  }
5872  }
5873 
5874  void set_gridlinestyle (const octave_value& val)
5875  {
5876  if (! error_state)
5877  {
5878  if (gridlinestyle.set (val, true))
5879  {
5880  mark_modified ();
5881  }
5882  }
5883  }
5884 
5885  void set_interpreter (const octave_value& val)
5886  {
5887  if (! error_state)
5888  {
5889  if (interpreter.set (val, true))
5890  {
5891  mark_modified ();
5892  }
5893  }
5894  }
5895 
5896  void set_layer (const octave_value& val)
5897  {
5898  if (! error_state)
5899  {
5900  if (layer.set (val, true))
5901  {
5902  update_layer ();
5903  mark_modified ();
5904  }
5905  }
5906  }
5907 
5908  void set_linestyleorder (const octave_value& val);
5909 
5910  void set_linewidth (const octave_value& val)
5911  {
5912  if (! error_state)
5913  {
5914  if (linewidth.set (val, true))
5915  {
5916  mark_modified ();
5917  }
5918  }
5919  }
5920 
5921  void set_minorgridlinestyle (const octave_value& val)
5922  {
5923  if (! error_state)
5924  {
5925  if (minorgridlinestyle.set (val, true))
5926  {
5927  mark_modified ();
5928  }
5929  }
5930  }
5931 
5932  void set_nextplot (const octave_value& val)
5933  {
5934  if (! error_state)
5935  {
5936  if (nextplot.set (val, true))
5937  {
5938  mark_modified ();
5939  }
5940  }
5941  }
5942 
5943  void set_outerposition (const octave_value& val)
5944  {
5945  if (! error_state)
5946  {
5947  if (outerposition.set (val, true))
5948  {
5949  update_outerposition ();
5950  mark_modified ();
5951  }
5952  }
5953  }
5954 
5955  void set_plotboxaspectratio (const octave_value& val)
5956  {
5957  if (! error_state)
5958  {
5959  if (plotboxaspectratio.set (val, false))
5960  {
5961  set_plotboxaspectratiomode ("manual");
5962  update_plotboxaspectratio ();
5963  plotboxaspectratio.run_listeners (POSTSET);
5964  mark_modified ();
5965  }
5966  else
5967  set_plotboxaspectratiomode ("manual");
5968  }
5969  }
5970 
5971  void set_plotboxaspectratiomode (const octave_value& val)
5972  {
5973  if (! error_state)
5974  {
5975  if (plotboxaspectratiomode.set (val, true))
5976  {
5977  update_plotboxaspectratiomode ();
5978  mark_modified ();
5979  }
5980  }
5981  }
5982 
5983  void set_position (const octave_value& val)
5984  {
5985  if (! error_state)
5986  {
5987  if (position.set (val, true))
5988  {
5989  update_position ();
5990  mark_modified ();
5991  }
5992  }
5993  }
5994 
5995  void set_projection (const octave_value& val)
5996  {
5997  if (! error_state)
5998  {
5999  if (projection.set (val, true))
6000  {
6001  mark_modified ();
6002  }
6003  }
6004  }
6005 
6006  void set_tickdir (const octave_value& val)
6007  {
6008  if (! error_state)
6009  {
6010  if (tickdir.set (val, false))
6011  {
6012  set_tickdirmode ("manual");
6013  update_tickdir ();
6014  tickdir.run_listeners (POSTSET);
6015  mark_modified ();
6016  }
6017  else
6018  set_tickdirmode ("manual");
6019  }
6020  }
6021 
6022  void set_tickdirmode (const octave_value& val)
6023  {
6024  if (! error_state)
6025  {
6026  if (tickdirmode.set (val, true))
6027  {
6028  update_tickdirmode ();
6029  mark_modified ();
6030  }
6031  }
6032  }
6033 
6034  void set_ticklength (const octave_value& val)
6035  {
6036  if (! error_state)
6037  {
6038  if (ticklength.set (val, true))
6039  {
6040  update_ticklength ();
6041  mark_modified ();
6042  }
6043  }
6044  }
6045 
6046  void set_tightinset (const octave_value& val)
6047  {
6048  if (! error_state)
6049  {
6050  if (tightinset.set (val, true))
6051  {
6052  mark_modified ();
6053  }
6054  }
6055  }
6056 
6057  void set_title (const octave_value& val);
6058 
6059  void set_units (const octave_value& val);
6060 
6061  void update_units (void);
6062 
6063  void set_view (const octave_value& val)
6064  {
6065  if (! error_state)
6066  {
6067  if (view.set (val, true))
6068  {
6069  update_view ();
6070  mark_modified ();
6071  }
6072  }
6073  }
6074 
6075  void set_xaxislocation (const octave_value& val)
6076  {
6077  if (! error_state)
6078  {
6079  if (xaxislocation.set (val, true))
6080  {
6081  update_xaxislocation ();
6082  mark_modified ();
6083  }
6084  }
6085  }
6086 
6087  void set_xcolor (const octave_value& val)
6088  {
6089  if (! error_state)
6090  {
6091  if (xcolor.set (val, true))
6092  {
6093  mark_modified ();
6094  }
6095  }
6096  }
6097 
6098  void set_xdir (const octave_value& val)
6099  {
6100  if (! error_state)
6101  {
6102  if (xdir.set (val, true))
6103  {
6104  update_xdir ();
6105  mark_modified ();
6106  }
6107  }
6108  }
6109 
6110  void set_xgrid (const octave_value& val)
6111  {
6112  if (! error_state)
6113  {
6114  if (xgrid.set (val, true))
6115  {
6116  mark_modified ();
6117  }
6118  }
6119  }
6120 
6121  void set_xlabel (const octave_value& val);
6122 
6123  void set_xlim (const octave_value& val)
6124  {
6125  if (! error_state)
6126  {
6127  if (xlim.set (val, false))
6128  {
6129  set_xlimmode ("manual");
6130  update_xlim ();
6131  xlim.run_listeners (POSTSET);
6132  mark_modified ();
6133  }
6134  else
6135  set_xlimmode ("manual");
6136  }
6137  }
6138 
6139  void set_xlimmode (const octave_value& val)
6140  {
6141  if (! error_state)
6142  {
6143  if (xlimmode.set (val, false))
6144  {
6145  update_axis_limits ("xlimmode");
6146  xlimmode.run_listeners (POSTSET);
6147  mark_modified ();
6148  }
6149  }
6150  }
6151 
6152  void set_xminorgrid (const octave_value& val)
6153  {
6154  if (! error_state)
6155  {
6156  if (xminorgrid.set (val, true))
6157  {
6158  mark_modified ();
6159  }
6160  }
6161  }
6162 
6163  void set_xminortick (const octave_value& val)
6164  {
6165  if (! error_state)
6166  {
6167  if (xminortick.set (val, true))
6168  {
6169  mark_modified ();
6170  }
6171  }
6172  }
6173 
6174  void set_xscale (const octave_value& val)
6175  {
6176  if (! error_state)
6177  {
6178  if (xscale.set (val, false))
6179  {
6180  update_xscale ();
6181  update_axis_limits ("xscale");
6182  xscale.run_listeners (POSTSET);
6183  mark_modified ();
6184  }
6185  }
6186  }
6187 
6188  void set_xtick (const octave_value& val)
6189  {
6190  if (! error_state)
6191  {
6192  if (xtick.set (val, false))
6193  {
6194  set_xtickmode ("manual");
6195  update_xtick ();
6196  xtick.run_listeners (POSTSET);
6197  mark_modified ();
6198  }
6199  else
6200  set_xtickmode ("manual");
6201  }
6202  }
6203 
6204  void set_xticklabel (const octave_value& val);
6205 
6206  void set_xticklabelmode (const octave_value& val)
6207  {
6208  if (! error_state)
6209  {
6210  if (xticklabelmode.set (val, true))
6211  {
6212  update_xticklabelmode ();
6213  mark_modified ();
6214  }
6215  }
6216  }
6217 
6218  void set_xtickmode (const octave_value& val)
6219  {
6220  if (! error_state)
6221  {
6222  if (xtickmode.set (val, true))
6223  {
6224  update_xtickmode ();
6225  mark_modified ();
6226  }
6227  }
6228  }
6229 
6230  void set_yaxislocation (const octave_value& val)
6231  {
6232  if (! error_state)
6233  {
6234  if (yaxislocation.set (val, true))
6235  {
6236  update_yaxislocation ();
6237  mark_modified ();
6238  }
6239  }
6240  }
6241 
6242  void set_ycolor (const octave_value& val)
6243  {
6244  if (! error_state)
6245  {
6246  if (ycolor.set (val, true))
6247  {
6248  mark_modified ();
6249  }
6250  }
6251  }
6252 
6253  void set_ydir (const octave_value& val)
6254  {
6255  if (! error_state)
6256  {
6257  if (ydir.set (val, true))
6258  {
6259  update_ydir ();
6260  mark_modified ();
6261  }
6262  }
6263  }
6264 
6265  void set_ygrid (const octave_value& val)
6266  {
6267  if (! error_state)
6268  {
6269  if (ygrid.set (val, true))
6270  {
6271  mark_modified ();
6272  }
6273  }
6274  }
6275 
6276  void set_ylabel (const octave_value& val);
6277 
6278  void set_ylim (const octave_value& val)
6279  {
6280  if (! error_state)
6281  {
6282  if (ylim.set (val, false))
6283  {
6284  set_ylimmode ("manual");
6285  update_ylim ();
6286  ylim.run_listeners (POSTSET);
6287  mark_modified ();
6288  }
6289  else
6290  set_ylimmode ("manual");
6291  }
6292  }
6293 
6294  void set_ylimmode (const octave_value& val)
6295  {
6296  if (! error_state)
6297  {
6298  if (ylimmode.set (val, false))
6299  {
6300  update_axis_limits ("ylimmode");
6301  ylimmode.run_listeners (POSTSET);
6302  mark_modified ();
6303  }
6304  }
6305  }
6306 
6307  void set_yminorgrid (const octave_value& val)
6308  {
6309  if (! error_state)
6310  {
6311  if (yminorgrid.set (val, true))
6312  {
6313  mark_modified ();
6314  }
6315  }
6316  }
6317 
6318  void set_yminortick (const octave_value& val)
6319  {
6320  if (! error_state)
6321  {
6322  if (yminortick.set (val, true))
6323  {
6324  mark_modified ();
6325  }
6326  }
6327  }
6328 
6329  void set_yscale (const octave_value& val)
6330  {
6331  if (! error_state)
6332  {
6333  if (yscale.set (val, false))
6334  {
6335  update_yscale ();
6336  update_axis_limits ("yscale");
6337  yscale.run_listeners (POSTSET);
6338  mark_modified ();
6339  }
6340  }
6341  }
6342 
6343  void set_ytick (const octave_value& val)
6344  {
6345  if (! error_state)
6346  {
6347  if (ytick.set (val, false))
6348  {
6349  set_ytickmode ("manual");
6350  update_ytick ();
6351  ytick.run_listeners (POSTSET);
6352  mark_modified ();
6353  }
6354  else
6355  set_ytickmode ("manual");
6356  }
6357  }
6358 
6359  void set_yticklabel (const octave_value& val);
6360 
6361  void set_yticklabelmode (const octave_value& val)
6362  {
6363  if (! error_state)
6364  {
6365  if (yticklabelmode.set (val, true))
6366  {
6367  update_yticklabelmode ();
6368  mark_modified ();
6369  }
6370  }
6371  }
6372 
6373  void set_ytickmode (const octave_value& val)
6374  {
6375  if (! error_state)
6376  {
6377  if (ytickmode.set (val, true))
6378  {
6379  update_ytickmode ();
6380  mark_modified ();
6381  }
6382  }
6383  }
6384 
6385  void set_zcolor (const octave_value& val)
6386  {
6387  if (! error_state)
6388  {
6389  if (zcolor.set (val, true))
6390  {
6391  mark_modified ();
6392  }
6393  }
6394  }
6395 
6396  void set_zdir (const octave_value& val)
6397  {
6398  if (! error_state)
6399  {
6400  if (zdir.set (val, true))
6401  {
6402  update_zdir ();
6403  mark_modified ();
6404  }
6405  }
6406  }
6407 
6408  void set_zgrid (const octave_value& val)
6409  {
6410  if (! error_state)
6411  {
6412  if (zgrid.set (val, true))
6413  {
6414  mark_modified ();
6415  }
6416  }
6417  }
6418 
6419  void set_zlabel (const octave_value& val);
6420 
6421  void set_zlim (const octave_value& val)
6422  {
6423  if (! error_state)
6424  {
6425  if (zlim.set (val, false))
6426  {
6427  set_zlimmode ("manual");
6428  update_zlim ();
6429  zlim.run_listeners (POSTSET);
6430  mark_modified ();
6431  }
6432  else
6433  set_zlimmode ("manual");
6434  }
6435  }
6436 
6437  void set_zlimmode (const octave_value& val)
6438  {
6439  if (! error_state)
6440  {
6441  if (zlimmode.set (val, false))
6442  {
6443  update_axis_limits ("zlimmode");
6444  zlimmode.run_listeners (POSTSET);
6445  mark_modified ();
6446  }
6447  }
6448  }
6449 
6450  void set_zminorgrid (const octave_value& val)
6451  {
6452  if (! error_state)
6453  {
6454  if (zminorgrid.set (val, true))
6455  {
6456  mark_modified ();
6457  }
6458  }
6459  }
6460 
6461  void set_zminortick (const octave_value& val)
6462  {
6463  if (! error_state)
6464  {
6465  if (zminortick.set (val, true))
6466  {
6467  mark_modified ();
6468  }
6469  }
6470  }
6471 
6472  void set_zscale (const octave_value& val)
6473  {
6474  if (! error_state)
6475  {
6476  if (zscale.set (val, false))
6477  {
6478  update_zscale ();
6479  update_axis_limits ("zscale");
6480  zscale.run_listeners (POSTSET);
6481  mark_modified ();
6482  }
6483  }
6484  }
6485 
6486  void set_ztick (const octave_value& val)
6487  {
6488  if (! error_state)
6489  {
6490  if (ztick.set (val, false))
6491  {
6492  set_ztickmode ("manual");
6493  update_ztick ();
6494  ztick.run_listeners (POSTSET);
6495  mark_modified ();
6496  }
6497  else
6498  set_ztickmode ("manual");
6499  }
6500  }
6501 
6502  void set_zticklabel (const octave_value& val);
6503 
6504  void set_zticklabelmode (const octave_value& val)
6505  {
6506  if (! error_state)
6507  {
6508  if (zticklabelmode.set (val, true))
6509  {
6510  update_zticklabelmode ();
6511  mark_modified ();
6512  }
6513  }
6514  }
6515 
6516  void set_ztickmode (const octave_value& val)
6517  {
6518  if (! error_state)
6519  {
6520  if (ztickmode.set (val, true))
6521  {
6522  update_ztickmode ();
6523  mark_modified ();
6524  }
6525  }
6526  }
6527 
6528  void set___hold_all__ (const octave_value& val)
6529  {
6530  if (! error_state)
6531  {
6532  if (__hold_all__.set (val, true))
6533  {
6534  mark_modified ();
6535  }
6536  }
6537  }
6538 
6539  void set_autopos_tag (const octave_value& val)
6540  {
6541  if (! error_state)
6542  {
6543  if (autopos_tag.set (val, true))
6544  {
6545  mark_modified ();
6546  }
6547  }
6548  }
6549 
6550  void set_looseinset (const octave_value& val)
6551  {
6552  if (! error_state)
6553  {
6554  if (looseinset.set (val, true))
6555  {
6556  update_looseinset ();
6557  mark_modified ();
6558  }
6559  }
6560  }
6561 
6562  void set_x_viewtransform (const octave_value& val)
6563  {
6564  if (! error_state)
6565  {
6566  if (x_viewtransform.set (val, true))
6567  {
6568  mark_modified ();
6569  }
6570  }
6571  }
6572 
6573  void set_x_projectiontransform (const octave_value& val)
6574  {
6575  if (! error_state)
6576  {
6577  if (x_projectiontransform.set (val, true))
6578  {
6579  mark_modified ();
6580  }
6581  }
6582  }
6583 
6584  void set_x_viewporttransform (const octave_value& val)
6585  {
6586  if (! error_state)
6587  {
6588  if (x_viewporttransform.set (val, true))
6589  {
6590  mark_modified ();
6591  }
6592  }
6593  }
6594 
6595  void set_x_normrendertransform (const octave_value& val)
6596  {
6597  if (! error_state)
6598  {
6599  if (x_normrendertransform.set (val, true))
6600  {
6601  mark_modified ();
6602  }
6603  }
6604  }
6605 
6606  void set_x_rendertransform (const octave_value& val)
6607  {
6608  if (! error_state)
6609  {
6610  if (x_rendertransform.set (val, true))
6611  {
6612  mark_modified ();
6613  }
6614  }
6615  }
6616 
6617  void set_xmtick (const octave_value& val)
6618  {
6619  if (! error_state)
6620  {
6621  if (xmtick.set (val, true))
6622  {
6623  mark_modified ();
6624  }
6625  }
6626  }
6627 
6628  void set_ymtick (const octave_value& val)
6629  {
6630  if (! error_state)
6631  {
6632  if (ymtick.set (val, true))
6633  {
6634  mark_modified ();
6635  }
6636  }
6637  }
6638 
6639  void set_zmtick (const octave_value& val)
6640  {
6641  if (! error_state)
6642  {
6643  if (zmtick.set (val, true))
6644  {
6645  mark_modified ();
6646  }
6647  }
6648  }
6649 
6650 
6651  protected:
6652  void init (void);
6653 
6654  private:
6655 
6656  std::string
6657  get_scale (const std::string& scale, const Matrix& lims)
6658  {
6659  std::string retval = scale;
6660 
6661  if (scale == "log" && lims.numel () > 1 && lims(0) < 0 && lims(1) < 0)
6662  retval = "neglog";
6663 
6664  return retval;
6665  }
6666 
6667  void update_xscale (void)
6668  {
6669  sx = get_scale (get_xscale (), xlim.get ().matrix_value ());
6670  }
6671 
6672  void update_yscale (void)
6673  {
6674  sy = get_scale (get_yscale (), ylim.get ().matrix_value ());
6675  }
6676 
6677  void update_zscale (void)
6678  {
6679  sz = get_scale (get_zscale (), zlim.get ().matrix_value ());
6680  }
6681 
6682  void update_view (void) { sync_positions (); }
6683  void update_dataaspectratio (void) { sync_positions (); }
6684  void update_dataaspectratiomode (void) { sync_positions (); }
6685  void update_plotboxaspectratio (void) { sync_positions (); }
6686  void update_plotboxaspectratiomode (void) { sync_positions (); }
6687 
6688  void update_layer (void) { update_axes_layout (); }
6689  void update_yaxislocation (void)
6690  {
6691  update_axes_layout ();
6692  update_ylabel_position ();
6693  }
6694  void update_xaxislocation (void)
6695  {
6696  update_axes_layout ();
6697  update_xlabel_position ();
6698  }
6699 
6700  void update_xdir (void) { update_camera (); update_axes_layout (); }
6701  void update_ydir (void) { update_camera (); update_axes_layout (); }
6702  void update_zdir (void) { update_camera (); update_axes_layout (); }
6703 
6704  void update_ticklength (void);
6705  void update_tickdir (void) { update_ticklength (); }
6706  void update_tickdirmode (void) { update_ticklength (); }
6707 
6708  void update_xtick (void)
6709  {
6710  if (xticklabelmode.is ("auto"))
6711  calc_ticklabels (xtick, xticklabel, xscale.is ("log"));
6712  }
6713  void update_ytick (void)
6714  {
6715  if (yticklabelmode.is ("auto"))
6716  calc_ticklabels (ytick, yticklabel, yscale.is ("log"));
6717  }
6718  void update_ztick (void)
6719  {
6720  if (zticklabelmode.is ("auto"))
6721  calc_ticklabels (ztick, zticklabel, zscale.is ("log"));
6722  }
6723 
6724  void update_xtickmode (void)
6725  {
6726  if (xtickmode.is ("auto"))
6727  {
6728  calc_ticks_and_lims (xlim, xtick, xmtick, xlimmode.is ("auto"),
6729  xscale.is ("log"));
6730  update_xtick ();
6731  }
6732  }
6733  void update_ytickmode (void)
6734  {
6735  if (ytickmode.is ("auto"))
6736  {
6737  calc_ticks_and_lims (ylim, ytick, ymtick, ylimmode.is ("auto"),
6738  yscale.is ("log"));
6739  update_ytick ();
6740  }
6741  }
6742  void update_ztickmode (void)
6743  {
6744  if (ztickmode.is ("auto"))
6745  {
6746  calc_ticks_and_lims (zlim, ztick, zmtick, zlimmode.is ("auto"),
6747  zscale.is ("log"));
6748  update_ztick ();
6749  }
6750  }
6751 
6752  void update_xticklabelmode (void)
6753  {
6754  if (xticklabelmode.is ("auto"))
6755  calc_ticklabels (xtick, xticklabel, xscale.is ("log"));
6756  }
6757  void update_yticklabelmode (void)
6758  {
6759  if (yticklabelmode.is ("auto"))
6760  calc_ticklabels (ytick, yticklabel, yscale.is ("log"));
6761  }
6762  void update_zticklabelmode (void)
6763  {
6764  if (zticklabelmode.is ("auto"))
6765  calc_ticklabels (ztick, zticklabel, zscale.is ("log"));
6766  }
6767 
6768  void update_font (void);
6769  void update_fontname (void) { update_font (); }
6770  void update_fontsize (void) { update_font (); }
6771  void update_fontangle (void) { update_font (); }
6772  void update_fontweight (void) { update_font (); }
6773 
6774  void update_outerposition (void)
6775  {
6776  set_activepositionproperty ("outerposition");
6777  caseless_str old_units = get_units ();
6778  set_units ("normalized");
6779  Matrix outerbox = outerposition.get ().matrix_value ();
6780  Matrix innerbox = position.get ().matrix_value ();
6781  Matrix linset = looseinset.get ().matrix_value ();
6782  Matrix tinset = tightinset.get ().matrix_value ();
6783  outerbox(2) = outerbox(2) + outerbox(0);
6784  outerbox(3) = outerbox(3) + outerbox(1);
6785  innerbox(0) = outerbox(0) + std::max (linset(0), tinset(0));
6786  innerbox(1) = outerbox(1) + std::max (linset(1), tinset(1));
6787  innerbox(2) = outerbox(2) - std::max (linset(2), tinset(2));
6788  innerbox(3) = outerbox(3) - std::max (linset(3), tinset(3));
6789  innerbox(2) = innerbox(2) - innerbox(0);
6790  innerbox(3) = innerbox(3) - innerbox(1);
6791  position = innerbox;
6792  set_units (old_units);
6793  update_transform ();
6794  }
6795 
6796  void update_position (void)
6797  {
6798  set_activepositionproperty ("position");
6799  caseless_str old_units = get_units ();
6800  set_units ("normalized");
6801  Matrix outerbox = outerposition.get ().matrix_value ();
6802  Matrix innerbox = position.get ().matrix_value ();
6803  Matrix linset = looseinset.get ().matrix_value ();
6804  Matrix tinset = tightinset.get ().matrix_value ();
6805  innerbox(2) = innerbox(2) + innerbox(0);
6806  innerbox(3) = innerbox(3) + innerbox(1);
6807  outerbox(0) = innerbox(0) - std::max (linset(0), tinset(0));
6808  outerbox(1) = innerbox(1) - std::max (linset(1), tinset(1));
6809  outerbox(2) = innerbox(2) + std::max (linset(2), tinset(2));
6810  outerbox(3) = innerbox(3) + std::max (linset(3), tinset(3));
6811  outerbox(2) = outerbox(2) - outerbox(0);
6812  outerbox(3) = outerbox(3) - outerbox(1);
6813  outerposition = outerbox;
6814  set_units (old_units);
6815  update_transform ();
6816  }
6817 
6818  void update_looseinset (void)
6819  {
6820  caseless_str old_units = get_units ();
6821  set_units ("normalized");
6822  Matrix innerbox = position.get ().matrix_value ();
6823  innerbox(2) = innerbox(2) + innerbox(0);
6824  innerbox(3) = innerbox(3) + innerbox(1);
6825  Matrix outerbox = outerposition.get ().matrix_value ();
6826  outerbox(2) = outerbox(2) + outerbox(0);
6827  outerbox(3) = outerbox(3) + outerbox(1);
6828  Matrix linset = looseinset.get ().matrix_value ();
6829  Matrix tinset = tightinset.get ().matrix_value ();
6830  if (activepositionproperty.is ("position"))
6831  {
6832  outerbox(0) = innerbox(0) - std::max (linset(0), tinset(0));
6833  outerbox(1) = innerbox(1) - std::max (linset(1), tinset(1));
6834  outerbox(2) = innerbox(2) + std::max (linset(2), tinset(2));
6835  outerbox(3) = innerbox(3) + std::max (linset(3), tinset(3));
6836  outerbox(2) = outerbox(2) - outerbox(0);
6837  outerbox(3) = outerbox(3) - outerbox(1);
6838  outerposition = outerbox;
6839  }
6840  else
6841  {
6842  innerbox(0) = outerbox(0) + std::max (linset(0), tinset(0));
6843  innerbox(1) = outerbox(1) + std::max (linset(1), tinset(1));
6844  innerbox(2) = outerbox(2) - std::max (linset(2), tinset(2));
6845  innerbox(3) = outerbox(3) - std::max (linset(3), tinset(3));
6846  innerbox(2) = innerbox(2) - innerbox(0);
6847  innerbox(3) = innerbox(3) - innerbox(1);
6848  position = innerbox;
6849  }
6850  set_units (old_units);
6851  update_transform ();
6852  }
6853 
6854  double calc_tick_sep (double minval, double maxval);
6855  void calc_ticks_and_lims (array_property& lims, array_property& ticks,
6856  array_property& mticks,
6857  bool limmode_is_auto, bool is_logscale);
6858  void calc_ticklabels (const array_property& ticks, any_property& labels,
6859  bool is_logscale);
6860  Matrix get_ticklabel_extents (const Matrix& ticks,
6861  const string_vector& ticklabels,
6862  const Matrix& limits);
6863 
6864  void fix_limits (array_property& lims)
6865  {
6866  if (lims.get ().is_empty ())
6867  return;
6868 
6869  Matrix l = lims.get ().matrix_value ();
6870  if (l(0) > l(1))
6871  {
6872  l(0) = 0;
6873  l(1) = 1;
6874  lims = l;
6875  }
6876  else if (l(0) == l(1))
6877  {
6878  l(0) -= 0.5;
6879  l(1) += 0.5;
6880  lims = l;
6881  }
6882  }
6883 
6884  Matrix calc_tightbox (const Matrix& init_pos);
6885 
6886  public:
6887  Matrix get_axis_limits (double xmin, double xmax,
6888  double min_pos, double max_neg,
6889  bool logscale);
6890 
6891  void update_xlim (bool do_clr_zoom = true)
6892  {
6893  if (xtickmode.is ("auto"))
6894  calc_ticks_and_lims (xlim, xtick, xmtick, xlimmode.is ("auto"),
6895  xscale.is ("log"));
6896  if (xticklabelmode.is ("auto"))
6897  calc_ticklabels (xtick, xticklabel, xscale.is ("log"));
6898 
6899  fix_limits (xlim);
6900 
6901  update_xscale ();
6902 
6903  if (do_clr_zoom)
6904  zoom_stack.clear ();
6905 
6906  update_axes_layout ();
6907  }
6908 
6909  void update_ylim (bool do_clr_zoom = true)
6910  {
6911  if (ytickmode.is ("auto"))
6912  calc_ticks_and_lims (ylim, ytick, ymtick, ylimmode.is ("auto"),
6913  yscale.is ("log"));
6914  if (yticklabelmode.is ("auto"))
6915  calc_ticklabels (ytick, yticklabel, yscale.is ("log"));
6916 
6917  fix_limits (ylim);
6918 
6919  update_yscale ();
6920 
6921  if (do_clr_zoom)
6922  zoom_stack.clear ();
6923 
6924  update_axes_layout ();
6925  }
6926 
6927  void update_zlim (void)
6928  {
6929  if (ztickmode.is ("auto"))
6930  calc_ticks_and_lims (zlim, ztick, zmtick, zlimmode.is ("auto"),
6931  zscale.is ("log"));
6932  if (zticklabelmode.is ("auto"))
6933  calc_ticklabels (ztick, zticklabel, zscale.is ("log"));
6934 
6935  fix_limits (zlim);
6936 
6937  update_zscale ();
6938 
6939  zoom_stack.clear ();
6940 
6941  update_axes_layout ();
6942  }
6943 
6944  };
6945 
6946 private:
6948 
6949 public:
6950  axes (const graphics_handle& mh, const graphics_handle& p)
6951  : base_graphics_object (), xproperties (mh, p), default_properties ()
6952  {
6953  xproperties.override_defaults (*this);
6954  xproperties.update_transform ();
6955  }
6956 
6957  ~axes (void) { }
6958 
6960  {
6961  // Allow parent (figure) to override first (properties knows how
6962  // to find the parent object).
6963  xproperties.override_defaults (obj);
6964 
6965  // Now override with our defaults. If the default_properties
6966  // list includes the properties for all defaults (line,
6967  // surface, etc.) then we don't have to know the type of OBJ
6968  // here, we just call its set function and let it decide which
6969  // properties from the list to use.
6970  obj.set_from_list (default_properties);
6971  }
6972 
6973  void set (const caseless_str& name, const octave_value& value)
6974  {
6975  if (name.compare ("default", 7))
6976  // strip "default", pass rest to function that will
6977  // parse the remainder and add the element to the
6978  // default_properties map.
6979  default_properties.set (name.substr (7), value);
6980  else
6981  xproperties.set (name, value);
6982  }
6983 
6984  void set_defaults (const std::string& mode)
6985  {
6986  remove_all_listeners ();
6987  xproperties.set_defaults (*this, mode);
6988  }
6989 
6990  octave_value get (const caseless_str& name) const
6991  {
6992  octave_value retval;
6993 
6994  // FIXME: finish this.
6995  if (name.compare ("default", 7))
6996  retval = get_default (name.substr (7));
6997  else
6998  retval = xproperties.get (name);
6999 
7000  return retval;
7001  }
7002 
7003  octave_value get_default (const caseless_str& name) const;
7004 
7005  octave_value get_defaults (void) const
7006  {
7007  return default_properties.as_struct ("default");
7008  }
7009 
7010  base_properties& get_properties (void) { return xproperties; }
7011 
7012  const base_properties& get_properties (void) const { return xproperties; }
7013 
7014  void update_axis_limits (const std::string& axis_type);
7015 
7016  void update_axis_limits (const std::string& axis_type,
7017  const graphics_handle& h);
7018 
7019  bool valid_object (void) const { return true; }
7020 
7021  void reset_default_properties (void);
7022 
7023 protected:
7024  void initialize (const graphics_object& go);
7025 
7026 private:
7028 };
7029 
7030 // ---------------------------------------------------------------------
7031 
7033 {
7034 public:
7036  {
7037  public:
7038  // See the genprops.awk script for an explanation of the
7039  // properties declarations.
7040  // Programming note: Keep property list sorted if new ones are added.
7041 
7042 public:
7043  properties (const graphics_handle& mh, const graphics_handle& p);
7044 
7045  ~properties (void) { }
7046 
7047  void set (const caseless_str& pname, const octave_value& val);
7048 
7049  octave_value get (bool all = false) const;
7050 
7051  octave_value get (const caseless_str& pname) const;
7052 
7053  octave_value get (const std::string& pname) const
7054  {
7055  return get (caseless_str (pname));
7056  }
7057 
7058  octave_value get (const char *pname) const
7059  {
7060  return get (caseless_str (pname));
7061  }
7062 
7063  property get_property (const caseless_str& pname);
7064 
7065  std::string graphics_object_name (void) const { return go_name; }
7066 
7067  static property_list::pval_map_type factory_defaults (void);
7068 
7069 private:
7070  static std::string go_name;
7071 
7072 public:
7073 
7074 
7075  static std::set<std::string> core_property_names (void);
7076 
7077  static bool has_core_property (const caseless_str& pname);
7078 
7079  std::set<std::string> all_property_names (void) const;
7080 
7081  bool has_property (const caseless_str& pname) const;
7082 
7083 private:
7084 
7107 
7108 public:
7109 
7110  enum
7111  {
7112  ID_COLOR = 4000,
7113  ID_DISPLAYNAME = 4001,
7114  ID_ERASEMODE = 4002,
7115  ID_INTERPRETER = 4003,
7116  ID_LINESTYLE = 4004,
7117  ID_LINEWIDTH = 4005,
7118  ID_MARKER = 4006,
7119  ID_MARKEREDGECOLOR = 4007,
7120  ID_MARKERFACECOLOR = 4008,
7121  ID_MARKERSIZE = 4009,
7122  ID_XDATA = 4010,
7123  ID_XDATASOURCE = 4011,
7124  ID_YDATA = 4012,
7125  ID_YDATASOURCE = 4013,
7126  ID_ZDATA = 4014,
7127  ID_ZDATASOURCE = 4015,
7128  ID_XLIM = 4016,
7129  ID_YLIM = 4017,
7130  ID_ZLIM = 4018,
7131  ID_XLIMINCLUDE = 4019,
7132  ID_YLIMINCLUDE = 4020,
7133  ID_ZLIMINCLUDE = 4021
7134  };
7135 
7136  bool color_is_rgb (void) const { return color.is_rgb (); }
7137  bool color_is (const std::string& v) const { return color.is (v); }
7138  Matrix get_color_rgb (void) const { return (color.is_rgb () ? color.rgb () : Matrix ()); }
7139  octave_value get_color (void) const { return color.get (); }
7140 
7141  std::string get_displayname (void) const { return displayname.string_value (); }
7142 
7143  bool erasemode_is (const std::string& v) const { return erasemode.is (v); }
7144  std::string get_erasemode (void) const { return erasemode.current_value (); }
7145 
7146  bool interpreter_is (const std::string& v) const { return interpreter.is (v); }
7147  std::string get_interpreter (void) const { return interpreter.current_value (); }
7148 
7149  bool linestyle_is (const std::string& v) const { return linestyle.is (v); }
7150  std::string get_linestyle (void) const { return linestyle.current_value (); }
7151 
7152  double get_linewidth (void) const { return linewidth.double_value (); }
7153 
7154  bool marker_is (const std::string& v) const { return marker.is (v); }
7155  std::string get_marker (void) const { return marker.current_value (); }
7156 
7157  bool markeredgecolor_is_rgb (void) const { return markeredgecolor.is_rgb (); }
7158  bool markeredgecolor_is (const std::string& v) const { return markeredgecolor.is (v); }
7159  Matrix get_markeredgecolor_rgb (void) const { return (markeredgecolor.is_rgb () ? markeredgecolor.rgb () : Matrix ()); }
7160  octave_value get_markeredgecolor (void) const { return markeredgecolor.get (); }
7161 
7162  bool markerfacecolor_is_rgb (void) const { return markerfacecolor.is_rgb (); }
7163  bool markerfacecolor_is (const std::string& v) const { return markerfacecolor.is (v); }
7164  Matrix get_markerfacecolor_rgb (void) const { return (markerfacecolor.is_rgb () ? markerfacecolor.rgb () : Matrix ()); }
7165  octave_value get_markerfacecolor (void) const { return markerfacecolor.get (); }
7166 
7167  double get_markersize (void) const { return markersize.double_value (); }
7168 
7169  octave_value get_xdata (void) const { return xdata.get (); }
7170 
7171  std::string get_xdatasource (void) const { return xdatasource.string_value (); }
7172 
7173  octave_value get_ydata (void) const { return ydata.get (); }
7174 
7175  std::string get_ydatasource (void) const { return ydatasource.string_value (); }
7176 
7177  octave_value get_zdata (void) const { return zdata.get (); }
7178 
7179  std::string get_zdatasource (void) const { return zdatasource.string_value (); }
7180 
7181  octave_value get_xlim (void) const { return xlim.get (); }
7182 
7183  octave_value get_ylim (void) const { return ylim.get (); }
7184 
7185  octave_value get_zlim (void) const { return zlim.get (); }
7186 
7187  bool is_xliminclude (void) const { return xliminclude.is_on (); }
7188  std::string get_xliminclude (void) const { return xliminclude.current_value (); }
7189 
7190  bool is_yliminclude (void) const { return yliminclude.is_on (); }
7191  std::string get_yliminclude (void) const { return yliminclude.current_value (); }
7192 
7193  bool is_zliminclude (void) const { return zliminclude.is_on (); }
7194  std::string get_zliminclude (void) const { return zliminclude.current_value (); }
7195 
7196 
7197  void set_color (const octave_value& val)
7198  {
7199  if (! error_state)
7200  {
7201  if (color.set (val, true))
7202  {
7203  mark_modified ();
7204  }
7205  }
7206  }
7207 
7208  void set_displayname (const octave_value& val)
7209  {
7210  if (! error_state)
7211  {
7212  if (displayname.set (val, true))
7213  {
7214  mark_modified ();
7215  }
7216  }
7217  }
7218 
7219  void set_erasemode (const octave_value& val)
7220  {
7221  if (! error_state)
7222  {
7223  if (erasemode.set (val, true))
7224  {
7225  mark_modified ();
7226  }
7227  }
7228  }
7229 
7230  void set_interpreter (const octave_value& val)
7231  {
7232  if (! error_state)
7233  {
7234  if (interpreter.set (val, true))
7235  {
7236  mark_modified ();
7237  }
7238  }
7239  }
7240 
7241  void set_linestyle (const octave_value& val)
7242  {
7243  if (! error_state)
7244  {
7245  if (linestyle.set (val, true))
7246  {
7247  mark_modified ();
7248  }
7249  }
7250  }
7251 
7252  void set_linewidth (const octave_value& val)
7253  {
7254  if (! error_state)
7255  {
7256  if (linewidth.set (val, true))
7257  {
7258  mark_modified ();
7259  }
7260  }
7261  }
7262 
7263  void set_marker (const octave_value& val)
7264  {
7265  if (! error_state)
7266  {
7267  if (marker.set (val, true))
7268  {
7269  mark_modified ();
7270  }
7271  }
7272  }
7273 
7274  void set_markeredgecolor (const octave_value& val)
7275  {
7276  if (! error_state)
7277  {
7278  if (markeredgecolor.set (val, true))
7279  {
7280  mark_modified ();
7281  }
7282  }
7283  }
7284 
7285  void set_markerfacecolor (const octave_value& val)
7286  {
7287  if (! error_state)
7288  {
7289  if (markerfacecolor.set (val, true))
7290  {
7291  mark_modified ();
7292  }
7293  }
7294  }
7295 
7296  void set_markersize (const octave_value& val)
7297  {
7298  if (! error_state)
7299  {
7300  if (markersize.set (val, true))
7301  {
7302  mark_modified ();
7303  }
7304  }
7305  }
7306 
7307  void set_xdata (const octave_value& val)
7308  {
7309  if (! error_state)
7310  {
7311  if (xdata.set (val, true))
7312  {
7313  update_xdata ();
7314  mark_modified ();
7315  }
7316  }
7317  }
7318 
7319  void set_xdatasource (const octave_value& val)
7320  {
7321  if (! error_state)
7322  {
7323  if (xdatasource.set (val, true))
7324  {
7325  mark_modified ();
7326  }
7327  }
7328  }
7329 
7330  void set_ydata (const octave_value& val)
7331  {
7332  if (! error_state)
7333  {
7334  if (ydata.set (val, true))
7335  {
7336  update_ydata ();
7337  mark_modified ();
7338  }
7339  }
7340  }
7341 
7342  void set_ydatasource (const octave_value& val)
7343  {
7344  if (! error_state)
7345  {
7346  if (ydatasource.set (val, true))
7347  {
7348  mark_modified ();
7349  }
7350  }
7351  }
7352 
7353  void set_zdata (const octave_value& val)
7354  {
7355  if (! error_state)
7356  {
7357  if (zdata.set (val, true))
7358  {
7359  update_zdata ();
7360  mark_modified ();
7361  }
7362  }
7363  }
7364 
7365  void set_zdatasource (const octave_value& val)
7366  {
7367  if (! error_state)
7368  {
7369  if (zdatasource.set (val, true))
7370  {
7371  mark_modified ();
7372  }
7373  }
7374  }
7375 
7376  void set_xlim (const octave_value& val)
7377  {
7378  if (! error_state)
7379  {
7380  if (xlim.set (val, false))
7381  {
7382  update_axis_limits ("xlim");
7383  xlim.run_listeners (POSTSET);
7384  mark_modified ();
7385  }
7386  }
7387  }
7388 
7389  void set_ylim (const octave_value& val)
7390  {
7391  if (! error_state)
7392  {
7393  if (ylim.set (val, false))
7394  {
7395  update_axis_limits ("ylim");
7396  ylim.run_listeners (POSTSET);
7397  mark_modified ();
7398  }
7399  }
7400  }
7401 
7402  void set_zlim (const octave_value& val)
7403  {
7404  if (! error_state)
7405  {
7406  if (zlim.set (val, false))
7407  {
7408  update_axis_limits ("zlim");
7409  zlim.run_listeners (POSTSET);
7410  mark_modified ();
7411  }
7412  }
7413  }
7414 
7415  void set_xliminclude (const octave_value& val)
7416  {
7417  if (! error_state)
7418  {
7419  if (xliminclude.set (val, false))
7420  {
7421  update_axis_limits ("xliminclude");
7422  xliminclude.run_listeners (POSTSET);
7423  mark_modified ();
7424  }
7425  }
7426  }
7427 
7428  void set_yliminclude (const octave_value& val)
7429  {
7430  if (! error_state)
7431  {
7432  if (yliminclude.set (val, false))
7433  {
7434  update_axis_limits ("yliminclude");
7435  yliminclude.run_listeners (POSTSET);
7436  mark_modified ();
7437  }
7438  }
7439  }
7440 
7441  void set_zliminclude (const octave_value& val)
7442  {
7443  if (! error_state)
7444  {
7445  if (zliminclude.set (val, false))
7446  {
7447  update_axis_limits ("zliminclude");
7448  zliminclude.run_listeners (POSTSET);
7449  mark_modified ();
7450  }
7451  }
7452  }
7453 
7454 
7455  private:
7456  Matrix compute_xlim (void) const;
7457  Matrix compute_ylim (void) const;
7458 
7459  void update_xdata (void) { set_xlim (compute_xlim ()); }
7460 
7461  void update_ydata (void) { set_ylim (compute_ylim ()); }
7462 
7463  void update_zdata (void)
7464  {
7465  set_zlim (zdata.get_limits ());
7466  set_zliminclude (get_zdata ().numel () > 0);
7467  }
7468  };
7469 
7470 private:
7472 
7473 public:
7474  line (const graphics_handle& mh, const graphics_handle& p)
7475  : base_graphics_object (), xproperties (mh, p)
7476  {
7477  xproperties.override_defaults (*this);
7478  }
7479 
7480  ~line (void) { }
7481 
7482  base_properties& get_properties (void) { return xproperties; }
7483 
7484  const base_properties& get_properties (void) const { return xproperties; }
7485 
7486  bool valid_object (void) const { return true; }
7487 };
7488 
7489 // ---------------------------------------------------------------------
7490 
7492 {
7493 public:
7495  {
7496  public:
7497  double get_fontsize_points (double box_pix_height = 0) const;
7498 
7499  void set_position (const octave_value& val)
7500  {
7501  if (! error_state)
7502  {
7503  octave_value new_val (val);
7504 
7505  if (new_val.numel () == 2)
7506  {
7507  dim_vector dv (1, 3);
7508 
7509  new_val = new_val.resize (dv, true);
7510  }
7511 
7512  if (position.set (new_val, false))
7513  {
7514  set_positionmode ("manual");
7515  update_position ();
7516  position.run_listeners (POSTSET);
7517  mark_modified ();
7518  }
7519  else
7520  set_positionmode ("manual");
7521  }
7522  }
7523 
7524  // See the genprops.awk script for an explanation of the
7525  // properties declarations.
7526 
7527 public:
7528  properties (const graphics_handle& mh, const graphics_handle& p);
7529 
7530  ~properties (void) { }
7531 
7532  void set (const caseless_str& pname, const octave_value& val);
7533 
7534  octave_value get (bool all = false) const;
7535 
7536  octave_value get (const caseless_str& pname) const;
7537 
7538  octave_value get (const std::string& pname) const
7539  {
7540  return get (caseless_str (pname));
7541  }
7542 
7543  octave_value get (const char *pname) const
7544  {
7545  return get (caseless_str (pname));
7546  }
7547 
7548  property get_property (const caseless_str& pname);
7549 
7550  std::string graphics_object_name (void) const { return go_name; }
7551 
7552  static property_list::pval_map_type factory_defaults (void);
7553 
7554 private:
7555  static std::string go_name;
7556 
7557 public:
7558 
7559 
7560  static std::set<std::string> core_property_names (void);
7561 
7562  static bool has_core_property (const caseless_str& pname);
7563 
7564  std::set<std::string> all_property_names (void) const;
7565 
7566  bool has_property (const caseless_str& pname) const;
7567 
7568 private:
7569 
7603 
7604 public:
7605 
7606  enum
7607  {
7608  ID_BACKGROUNDCOLOR = 5000,
7609  ID_COLOR = 5001,
7610  ID_DISPLAYNAME = 5002,
7611  ID_EDGECOLOR = 5003,
7612  ID_EDITING = 5004,
7613  ID_ERASEMODE = 5005,
7614  ID_EXTENT = 5006,
7615  ID_FONTANGLE = 5007,
7616  ID_FONTNAME = 5008,
7617  ID_FONTSIZE = 5009,
7618  ID_FONTUNITS = 5010,
7619  ID_FONTWEIGHT = 5011,
7620  ID_HORIZONTALALIGNMENT = 5012,
7621  ID_INTERPRETER = 5013,
7622  ID_LINESTYLE = 5014,
7623  ID_LINEWIDTH = 5015,
7624  ID_MARGIN = 5016,
7625  ID_POSITION = 5017,
7626  ID_ROTATION = 5018,
7627  ID_STRING = 5019,
7628  ID_UNITS = 5020,
7629  ID_VERTICALALIGNMENT = 5021,
7630  ID_XLIM = 5022,
7631  ID_YLIM = 5023,
7632  ID_ZLIM = 5024,
7633  ID_XLIMINCLUDE = 5025,
7634  ID_YLIMINCLUDE = 5026,
7635  ID_ZLIMINCLUDE = 5027,
7636  ID_POSITIONMODE = 5028,
7637  ID_ROTATIONMODE = 5029,
7638  ID_HORIZONTALALIGNMENTMODE = 5030,
7639  ID_VERTICALALIGNMENTMODE = 5031,
7640  ID_AUTOPOS_TAG = 5032
7641  };
7642 
7643  bool backgroundcolor_is_rgb (void) const { return backgroundcolor.is_rgb (); }
7644  bool backgroundcolor_is (const std::string& v) const { return backgroundcolor.is (v); }
7645  Matrix get_backgroundcolor_rgb (void) const { return (backgroundcolor.is_rgb () ? backgroundcolor.rgb () : Matrix ()); }
7646  octave_value get_backgroundcolor (void) const { return backgroundcolor.get (); }
7647 
7648  bool color_is_rgb (void) const { return color.is_rgb (); }
7649  bool color_is (const std::string& v) const { return color.is (v); }
7650  Matrix get_color_rgb (void) const { return (color.is_rgb () ? color.rgb () : Matrix ()); }
7651  octave_value get_color (void) const { return color.get (); }
7652 
7653  std::string get_displayname (void) const { return displayname.string_value (); }
7654 
7655  bool edgecolor_is_rgb (void) const { return edgecolor.is_rgb (); }
7656  bool edgecolor_is (const std::string& v) const { return edgecolor.is (v); }
7657  Matrix get_edgecolor_rgb (void) const { return (edgecolor.is_rgb () ? edgecolor.rgb () : Matrix ()); }
7658  octave_value get_edgecolor (void) const { return edgecolor.get (); }
7659 
7660  bool is_editing (void) const { return editing.is_on (); }
7661  std::string get_editing (void) const { return editing.current_value (); }
7662 
7663  bool erasemode_is (const std::string& v) const { return erasemode.is (v); }
7664  std::string get_erasemode (void) const { return erasemode.current_value (); }
7665 
7666  octave_value get_extent (void) const;
7667 
7668  bool fontangle_is (const std::string& v) const { return fontangle.is (v); }
7669  std::string get_fontangle (void) const { return fontangle.current_value (); }
7670 
7671  std::string get_fontname (void) const { return fontname.string_value (); }
7672 
7673  double get_fontsize (void) const { return fontsize.double_value (); }
7674 
7675  bool fontunits_is (const std::string& v) const { return fontunits.is (v); }
7676  std::string get_fontunits (void) const { return fontunits.current_value (); }
7677 
7678  bool fontweight_is (const std::string& v) const { return fontweight.is (v); }
7679  std::string get_fontweight (void) const { return fontweight.current_value (); }
7680 
7681  bool horizontalalignment_is (const std::string& v) const { return horizontalalignment.is (v); }
7682  std::string get_horizontalalignment (void) const { return horizontalalignment.current_value (); }
7683 
7684  bool interpreter_is (const std::string& v) const { return interpreter.is (v); }
7685  std::string get_interpreter (void) const { return interpreter.current_value (); }
7686 
7687  bool linestyle_is (const std::string& v) const { return linestyle.is (v); }
7688  std::string get_linestyle (void) const { return linestyle.current_value (); }
7689 
7690  double get_linewidth (void) const { return linewidth.double_value (); }
7691 
7692  double get_margin (void) const { return margin.double_value (); }
7693 
7694  octave_value get_position (void) const { return position.get (); }
7695 
7696  double get_rotation (void) const { return rotation.double_value (); }
7697 
7698  octave_value get_string (void) const { return string.get (); }
7699 
7700  bool units_is (const std::string& v) const { return units.is (v); }
7701  std::string get_units (void) const { return units.current_value (); }
7702 
7703  bool verticalalignment_is (const std::string& v) const { return verticalalignment.is (v); }
7704  std::string get_verticalalignment (void) const { return verticalalignment.current_value (); }
7705 
7706  octave_value get_xlim (void) const { return xlim.get (); }
7707 
7708  octave_value get_ylim (void) const { return ylim.get (); }
7709 
7710  octave_value get_zlim (void) const { return zlim.get (); }
7711 
7712  bool is_xliminclude (void) const { return xliminclude.is_on (); }
7713  std::string get_xliminclude (void) const { return xliminclude.current_value (); }
7714 
7715  bool is_yliminclude (void) const { return yliminclude.is_on (); }
7716  std::string get_yliminclude (void) const { return yliminclude.current_value (); }
7717 
7718  bool is_zliminclude (void) const { return zliminclude.is_on (); }
7719  std::string get_zliminclude (void) const { return zliminclude.current_value (); }
7720 
7721  bool positionmode_is (const std::string& v) const { return positionmode.is (v); }
7722  std::string get_positionmode (void) const { return positionmode.current_value (); }
7723 
7724  bool rotationmode_is (const std::string& v) const { return rotationmode.is (v); }
7725  std::string get_rotationmode (void) const { return rotationmode.current_value (); }
7726 
7727  bool horizontalalignmentmode_is (const std::string& v) const { return horizontalalignmentmode.is (v); }
7728  std::string get_horizontalalignmentmode (void) const { return horizontalalignmentmode.current_value (); }
7729 
7730  bool verticalalignmentmode_is (const std::string& v) const { return verticalalignmentmode.is (v); }
7731  std::string get_verticalalignmentmode (void) const { return verticalalignmentmode.current_value (); }
7732 
7733  bool autopos_tag_is (const std::string& v) const { return autopos_tag.is (v); }
7734  std::string get_autopos_tag (void) const { return autopos_tag.current_value (); }
7735 
7736 
7737  void set_backgroundcolor (const octave_value& val)
7738  {
7739  if (! error_state)
7740  {
7741  if (backgroundcolor.set (val, true))
7742  {
7743  mark_modified ();
7744  }
7745  }
7746  }
7747 
7748  void set_color (const octave_value& val)
7749  {
7750  if (! error_state)
7751  {
7752  if (color.set (val, true))
7753  {
7754  update_color ();
7755  mark_modified ();
7756  }
7757  }
7758  }
7759 
7760  void set_displayname (const octave_value& val)
7761  {
7762  if (! error_state)
7763  {
7764  if (displayname.set (val, true))
7765  {
7766  mark_modified ();
7767  }
7768  }
7769  }
7770 
7771  void set_edgecolor (const octave_value& val)
7772  {
7773  if (! error_state)
7774  {
7775  if (edgecolor.set (val, true))
7776  {
7777  mark_modified ();
7778  }
7779  }
7780  }
7781 
7782  void set_editing (const octave_value& val)
7783  {
7784  if (! error_state)
7785  {
7786  if (editing.set (val, true))
7787  {
7788  mark_modified ();
7789  }
7790  }
7791  }
7792 
7793  void set_erasemode (const octave_value& val)
7794  {
7795  if (! error_state)
7796  {
7797  if (erasemode.set (val, true))
7798  {
7799  mark_modified ();
7800  }
7801  }
7802  }
7803 
7804  void set_extent (const octave_value& val)
7805  {
7806  if (! error_state)
7807  {
7808  if (extent.set (val, true))
7809  {
7810  mark_modified ();
7811  }
7812  }
7813  }
7814 
7815  void set_fontangle (const octave_value& val)
7816  {
7817  if (! error_state)
7818  {
7819  if (fontangle.set (val, true))
7820  {
7821  update_fontangle ();
7822  mark_modified ();
7823  }
7824  }
7825  }
7826 
7827  void set_fontname (const octave_value& val)
7828  {
7829  if (! error_state)
7830  {
7831  if (fontname.set (val, true))
7832  {
7833  update_fontname ();
7834  mark_modified ();
7835  }
7836  }
7837  }
7838 
7839  void set_fontsize (const octave_value& val)
7840  {
7841  if (! error_state)
7842  {
7843  if (fontsize.set (val, true))
7844  {
7845  update_fontsize ();
7846  mark_modified ();
7847  }
7848  }
7849  }
7850 
7851  void set_fontunits (const octave_value& val)
7852  {
7853  if (! error_state)
7854  {
7855  if (fontunits.set (val, true))
7856  {
7857  mark_modified ();
7858  }
7859  }
7860  }
7861 
7862  void set_fontweight (const octave_value& val)
7863  {
7864  if (! error_state)
7865  {
7866  if (fontweight.set (val, true))
7867  {
7868  update_fontweight ();
7869  mark_modified ();
7870  }
7871  }
7872  }
7873 
7874  void set_horizontalalignment (const octave_value& val)
7875  {
7876  if (! error_state)
7877  {
7878  if (horizontalalignment.set (val, false))
7879  {
7880  set_horizontalalignmentmode ("manual");
7881  update_horizontalalignment ();
7882  horizontalalignment.run_listeners (POSTSET);
7883  mark_modified ();
7884  }
7885  else
7886  set_horizontalalignmentmode ("manual");
7887  }
7888  }
7889 
7890  void set_interpreter (const octave_value& val)
7891  {
7892  if (! error_state)
7893  {
7894  if (interpreter.set (val, true))
7895  {
7896  update_interpreter ();
7897  mark_modified ();
7898  }
7899  }
7900  }
7901 
7902  void set_linestyle (const octave_value& val)
7903  {
7904  if (! error_state)
7905  {
7906  if (linestyle.set (val, true))
7907  {
7908  mark_modified ();
7909  }
7910  }
7911  }
7912 
7913  void set_linewidth (const octave_value& val)
7914  {
7915  if (! error_state)
7916  {
7917  if (linewidth.set (val, true))
7918  {
7919  mark_modified ();
7920  }
7921  }
7922  }
7923 
7924  void set_margin (const octave_value& val)
7925  {
7926  if (! error_state)
7927  {
7928  if (margin.set (val, true))
7929  {
7930  mark_modified ();
7931  }
7932  }
7933  }
7934 
7935  void set_rotation (const octave_value& val)
7936  {
7937  if (! error_state)
7938  {
7939  if (rotation.set (val, false))
7940  {
7941  set_rotationmode ("manual");
7942  update_rotation ();
7943  rotation.run_listeners (POSTSET);
7944  mark_modified ();
7945  }
7946  else
7947  set_rotationmode ("manual");
7948  }
7949  }
7950 
7951  void set_string (const octave_value& val)
7952  {
7953  if (! error_state)
7954  {
7955  if (string.set (val, true))
7956  {
7957  update_string ();
7958  mark_modified ();
7959  }
7960  }
7961  }
7962 
7963  void set_units (const octave_value& val)
7964  {
7965  if (! error_state)
7966  {
7967  if (units.set (val, true))
7968  {
7969  update_units ();
7970  mark_modified ();
7971  }
7972  }
7973  }
7974 
7975  void set_verticalalignment (const octave_value& val)
7976  {
7977  if (! error_state)
7978  {
7979  if (verticalalignment.set (val, false))
7980  {
7981  set_verticalalignmentmode ("manual");
7982  update_verticalalignment ();
7983  verticalalignment.run_listeners (POSTSET);
7984  mark_modified ();
7985  }
7986  else
7987  set_verticalalignmentmode ("manual");
7988  }
7989  }
7990 
7991  void set_xlim (const octave_value& val)
7992  {
7993  if (! error_state)
7994  {
7995  if (xlim.set (val, false))
7996  {
7997  update_axis_limits ("xlim");
7998  xlim.run_listeners (POSTSET);
7999  mark_modified ();
8000  }
8001  }
8002  }
8003 
8004  void set_ylim (const octave_value& val)
8005  {
8006  if (! error_state)
8007  {
8008  if (ylim.set (val, false))
8009  {
8010  update_axis_limits ("ylim");
8011  ylim.run_listeners (POSTSET);
8012  mark_modified ();
8013  }
8014  }
8015  }
8016 
8017  void set_zlim (const octave_value& val)
8018  {
8019  if (! error_state)
8020  {
8021  if (zlim.set (val, false))
8022  {
8023  update_axis_limits ("zlim");
8024  zlim.run_listeners (POSTSET);
8025  mark_modified ();
8026  }
8027  }
8028  }
8029 
8030  void set_xliminclude (const octave_value& val)
8031  {
8032  if (! error_state)
8033  {
8034  if (xliminclude.set (val, false))
8035  {
8036  update_axis_limits ("xliminclude");
8037  xliminclude.run_listeners (POSTSET);
8038  mark_modified ();
8039  }
8040  }
8041  }
8042 
8043  void set_yliminclude (const octave_value& val)
8044  {
8045  if (! error_state)
8046  {
8047  if (yliminclude.set (val, false))
8048  {
8049  update_axis_limits ("yliminclude");
8050  yliminclude.run_listeners (POSTSET);
8051  mark_modified ();
8052  }
8053  }
8054  }
8055 
8056  void set_zliminclude (const octave_value& val)
8057  {
8058  if (! error_state)
8059  {
8060  if (zliminclude.set (val, false))
8061  {
8062  update_axis_limits ("zliminclude");
8063  zliminclude.run_listeners (POSTSET);
8064  mark_modified ();
8065  }
8066  }
8067  }
8068 
8069  void set_positionmode (const octave_value& val)
8070  {
8071  if (! error_state)
8072  {
8073  if (positionmode.set (val, true))
8074  {
8075  update_positionmode ();
8076  mark_modified ();
8077  }
8078  }
8079  }
8080 
8081  void set_rotationmode (const octave_value& val)
8082  {
8083  if (! error_state)
8084  {
8085  if (rotationmode.set (val, true))
8086  {
8087  update_rotationmode ();
8088  mark_modified ();
8089  }
8090  }
8091  }
8092 
8093  void set_horizontalalignmentmode (const octave_value& val)
8094  {
8095  if (! error_state)
8096  {
8097  if (horizontalalignmentmode.set (val, true))
8098  {
8099  update_horizontalalignmentmode ();
8100  mark_modified ();
8101  }
8102  }
8103  }
8104 
8105  void set_verticalalignmentmode (const octave_value& val)
8106  {
8107  if (! error_state)
8108  {
8109  if (verticalalignmentmode.set (val, true))
8110  {
8111  update_verticalalignmentmode ();
8112  mark_modified ();
8113  }
8114  }
8115  }
8116 
8117  void set_autopos_tag (const octave_value& val)
8118  {
8119  if (! error_state)
8120  {
8121  if (autopos_tag.set (val, true))
8122  {
8123  mark_modified ();
8124  }
8125  }
8126  }
8127 
8128 
8129  Matrix get_data_position (void) const;
8130  Matrix get_extent_matrix (void) const;
8131  const uint8NDArray& get_pixels (void) const { return pixels; }
8132 #if HAVE_FREETYPE
8133  // freetype renderer, used for calculation of text size
8135 #endif
8136 
8137  protected:
8138  void init (void)
8139  {
8140  position.add_constraint (dim_vector (1, 3));
8141  cached_units = get_units ();
8142  update_font ();
8143  }
8144 
8145  private:
8146  void update_position (void)
8147  {
8148  Matrix pos = get_data_position ();
8149  Matrix lim;
8150 
8151  lim = Matrix (1, 3, pos(0));
8152  lim(2) = (lim(2) <= 0 ? octave_Inf : lim(2));
8153  set_xlim (lim);
8154 
8155  lim = Matrix (1, 3, pos(1));
8156  lim(2) = (lim(2) <= 0 ? octave_Inf : lim(2));
8157  set_ylim (lim);
8158 
8159  if (pos.numel () == 3)
8160  {
8161  lim = Matrix (1, 3, pos(2));
8162  lim(2) = (lim(2) <= 0 ? octave_Inf : lim(2));
8163  set_zliminclude ("on");
8164  set_zlim (lim);
8165  }
8166  else
8167  set_zliminclude ("off");
8168  }
8169 
8170  void update_text_extent (void);
8171 
8172  void request_autopos (void);
8173  void update_positionmode (void) { request_autopos (); }
8174  void update_rotationmode (void) { request_autopos (); }
8175  void update_horizontalalignmentmode (void) { request_autopos (); }
8176  void update_verticalalignmentmode (void) { request_autopos (); }
8177 
8178  void update_font (void);
8179  void update_string (void) { request_autopos (); update_text_extent (); }
8180  void update_rotation (void) { update_text_extent (); }
8181  void update_color (void) { update_font (); update_text_extent (); }
8182  void update_fontname (void) { update_font (); update_text_extent (); }
8183  void update_fontsize (void) { update_font (); update_text_extent (); }
8184  void update_fontangle (void) { update_font (); update_text_extent (); }
8185  void update_fontweight (void) { update_font (); update_text_extent (); }
8186  void update_interpreter (void) { update_text_extent (); }
8187  void update_horizontalalignment (void) { update_text_extent (); }
8188  void update_verticalalignment (void) { update_text_extent (); }
8189 
8190  void update_units (void);
8191 
8192  private:
8193  std::string cached_units;
8195  };
8196 
8197 private:
8199 
8200 public:
8201  text (const graphics_handle& mh, const graphics_handle& p)
8202  : base_graphics_object (), xproperties (mh, p)
8203  {
8204  xproperties.set_clipping ("off");
8205  xproperties.override_defaults (*this);
8206  }
8207 
8208  ~text (void) { }
8209 
8210  base_properties& get_properties (void) { return xproperties; }
8211 
8212  const base_properties& get_properties (void) const { return xproperties; }
8213 
8214  bool valid_object (void) const { return true; }
8215 };
8216 
8217 // ---------------------------------------------------------------------
8218 
8220 {
8221 public:
8223  {
8224  public:
8225  bool is_aliminclude (void) const
8226  { return (aliminclude.is_on () && alphadatamapping.is ("scaled")); }
8227  std::string get_aliminclude (void) const
8228  { return aliminclude.current_value (); }
8229 
8230  bool is_climinclude (void) const
8231  { return (climinclude.is_on () && cdatamapping.is ("scaled")); }
8232  std::string get_climinclude (void) const
8233  { return climinclude.current_value (); }
8234 
8235  octave_value get_color_data (void) const;
8236 
8237  // See the genprops.awk script for an explanation of the
8238  // properties declarations.
8239  // Programming note: Keep property list sorted if new ones are added.
8240 
8241 public:
8242  properties (const graphics_handle& mh, const graphics_handle& p);
8243 
8244  ~properties (void) { }
8245 
8246  void set (const caseless_str& pname, const octave_value& val);
8247 
8248  octave_value get (bool all = false) const;
8249 
8250  octave_value get (const caseless_str& pname) const;
8251 
8252  octave_value get (const std::string& pname) const
8253  {
8254  return get (caseless_str (pname));
8255  }
8256 
8257  octave_value get (const char *pname) const
8258  {
8259  return get (caseless_str (pname));
8260  }
8261 
8262  property get_property (const caseless_str& pname);
8263 
8264  std::string graphics_object_name (void) const { return go_name; }
8265 
8266  static property_list::pval_map_type factory_defaults (void);
8267 
8268 private:
8269  static std::string go_name;
8270 
8271 public:
8272 
8273 
8274  static std::set<std::string> core_property_names (void);
8275 
8276  static bool has_core_property (const caseless_str& pname);
8277 
8278  std::set<std::string> all_property_names (void) const;
8279 
8280  bool has_property (const caseless_str& pname) const;
8281 
8282 private:
8283 
8299 
8300 public:
8301 
8302  enum
8303  {
8304  ID_ALPHADATA = 6000,
8305  ID_ALPHADATAMAPPING = 6001,
8306  ID_CDATA = 6002,
8307  ID_CDATAMAPPING = 6003,
8308  ID_ERASEMODE = 6004,
8309  ID_XDATA = 6005,
8310  ID_YDATA = 6006,
8311  ID_ALIM = 6007,
8312  ID_CLIM = 6008,
8313  ID_XLIM = 6009,
8314  ID_YLIM = 6010,
8315  ID_ALIMINCLUDE = 6011,
8316  ID_CLIMINCLUDE = 6012,
8317  ID_XLIMINCLUDE = 6013,
8318  ID_YLIMINCLUDE = 6014
8319  };
8320 
8321  octave_value get_alphadata (void) const { return alphadata.get (); }
8322 
8323  bool alphadatamapping_is (const std::string& v) const { return alphadatamapping.is (v); }
8324  std::string get_alphadatamapping (void) const { return alphadatamapping.current_value (); }
8325 
8326  octave_value get_cdata (void) const { return cdata.get (); }
8327 
8328  bool cdatamapping_is (const std::string& v) const { return cdatamapping.is (v); }
8329  std::string get_cdatamapping (void) const { return cdatamapping.current_value (); }
8330 
8331  bool erasemode_is (const std::string& v) const { return erasemode.is (v); }
8332  std::string get_erasemode (void) const { return erasemode.current_value (); }
8333 
8334  octave_value get_xdata (void) const { return xdata.get (); }
8335 
8336  octave_value get_ydata (void) const { return ydata.get (); }
8337 
8338  octave_value get_alim (void) const { return alim.get (); }
8339 
8340  octave_value get_clim (void) const { return clim.get (); }
8341 
8342  octave_value get_xlim (void) const { return xlim.get (); }
8343 
8344  octave_value get_ylim (void) const { return ylim.get (); }
8345 
8346  bool is_xliminclude (void) const { return xliminclude.is_on (); }
8347  std::string get_xliminclude (void) const { return xliminclude.current_value (); }
8348 
8349  bool is_yliminclude (void) const { return yliminclude.is_on (); }
8350  std::string get_yliminclude (void) const { return yliminclude.current_value (); }
8351 
8352 
8353  void set_alphadata (const octave_value& val)
8354  {
8355  if (! error_state)
8356  {
8357  if (alphadata.set (val, true))
8358  {
8359  update_alphadata ();
8360  mark_modified ();
8361  }
8362  }
8363  }
8364 
8365  void set_alphadatamapping (const octave_value& val)
8366  {
8367  if (! error_state)
8368  {
8369  if (alphadatamapping.set (val, false))
8370  {
8371  update_axis_limits ("alphadatamapping");
8372  alphadatamapping.run_listeners (POSTSET);
8373  mark_modified ();
8374  }
8375  }
8376  }
8377 
8378  void set_cdata (const octave_value& val)
8379  {
8380  if (! error_state)
8381  {
8382  if (cdata.set (val, true))
8383  {
8384  update_cdata ();
8385  mark_modified ();
8386  }
8387  }
8388  }
8389 
8390  void set_cdatamapping (const octave_value& val)
8391  {
8392  if (! error_state)
8393  {
8394  if (cdatamapping.set (val, false))
8395  {
8396  update_axis_limits ("cdatamapping");
8397  cdatamapping.run_listeners (POSTSET);
8398  mark_modified ();
8399  }
8400  }
8401  }
8402 
8403  void set_erasemode (const octave_value& val)
8404  {
8405  if (! error_state)
8406  {
8407  if (erasemode.set (val, true))
8408  {
8409  mark_modified ();
8410  }
8411  }
8412  }
8413 
8414  void set_xdata (const octave_value& val)
8415  {
8416  if (! error_state)
8417  {
8418  if (xdata.set (val, true))
8419  {
8420  update_xdata ();
8421  mark_modified ();
8422  }
8423  }
8424  }
8425 
8426  void set_ydata (const octave_value& val)
8427  {
8428  if (! error_state)
8429  {
8430  if (ydata.set (val, true))
8431  {
8432  update_ydata ();
8433  mark_modified ();
8434  }
8435  }
8436  }
8437 
8438  void set_alim (const octave_value& val)
8439  {
8440  if (! error_state)
8441  {
8442  if (alim.set (val, false))
8443  {
8444  update_axis_limits ("alim");
8445  alim.run_listeners (POSTSET);
8446  mark_modified ();
8447  }
8448  }
8449  }
8450 
8451  void set_clim (const octave_value& val)
8452  {
8453  if (! error_state)
8454  {
8455  if (clim.set (val, false))
8456  {
8457  update_axis_limits ("clim");
8458  clim.run_listeners (POSTSET);
8459  mark_modified ();
8460  }
8461  }
8462  }
8463 
8464  void set_xlim (const octave_value& val)
8465  {
8466  if (! error_state)
8467  {
8468  if (xlim.set (val, false))
8469  {
8470  update_axis_limits ("xlim");
8471  xlim.run_listeners (POSTSET);
8472  mark_modified ();
8473  }
8474  }
8475  }
8476 
8477  void set_ylim (const octave_value& val)
8478  {
8479  if (! error_state)
8480  {
8481  if (ylim.set (val, false))
8482  {
8483  update_axis_limits ("ylim");
8484  ylim.run_listeners (POSTSET);
8485  mark_modified ();
8486  }
8487  }
8488  }
8489 
8490  void set_aliminclude (const octave_value& val)
8491  {
8492  if (! error_state)
8493  {
8494  if (aliminclude.set (val, false))
8495  {
8496  update_axis_limits ("aliminclude");
8497  aliminclude.run_listeners (POSTSET);
8498  mark_modified ();
8499  }
8500  }
8501  }
8502 
8503  void set_climinclude (const octave_value& val)
8504  {
8505  if (! error_state)
8506  {
8507  if (climinclude.set (val, false))
8508  {
8509  update_axis_limits ("climinclude");
8510  climinclude.run_listeners (POSTSET);
8511  mark_modified ();
8512  }
8513  }
8514  }
8515 
8516  void set_xliminclude (const octave_value& val)
8517  {
8518  if (! error_state)
8519  {
8520  if (xliminclude.set (val, false))
8521  {
8522  update_axis_limits ("xliminclude");
8523  xliminclude.run_listeners (POSTSET);
8524  mark_modified ();
8525  }
8526  }
8527  }
8528 
8529  void set_yliminclude (const octave_value& val)
8530  {
8531  if (! error_state)
8532  {
8533  if (yliminclude.set (val, false))
8534  {
8535  update_axis_limits ("yliminclude");
8536  yliminclude.run_listeners (POSTSET);
8537  mark_modified ();
8538  }
8539  }
8540  }
8541 
8542 
8543  protected:
8544  void init (void)
8545  {
8546  xdata.add_constraint (2);
8547  ydata.add_constraint (2);
8548  cdata.add_constraint ("double");
8549  cdata.add_constraint ("single");
8550  cdata.add_constraint ("logical");
8551  cdata.add_constraint ("uint8");
8552  cdata.add_constraint ("uint16");
8553  cdata.add_constraint ("int16");
8554  cdata.add_constraint ("real");
8555  cdata.add_constraint (dim_vector (-1, -1));
8556  cdata.add_constraint (dim_vector (-1, -1, 3));
8557  alphadata.add_constraint (dim_vector (-1, -1));
8558  alphadata.add_constraint ("double");
8559  alphadata.add_constraint ("uint8");
8560  }
8561 
8562  private:
8563  void update_alphadata (void)
8564  {
8565  if (alphadatamapping_is ("scaled"))
8566  set_alim (alphadata.get_limits ());
8567  else
8568  alim = alphadata.get_limits ();
8569  }
8570 
8571  void update_cdata (void)
8572  {
8573  if (cdatamapping_is ("scaled"))
8574  set_clim (cdata.get_limits ());
8575  else
8576  clim = cdata.get_limits ();
8577  }
8578 
8579  void update_xdata (void)
8580  {
8581  Matrix limits = xdata.get_limits ();
8582  float dp = pixel_xsize ();
8583 
8584  limits(0) = limits(0) - dp;
8585  limits(1) = limits(1) + dp;
8586  set_xlim (limits);
8587  }
8588 
8589  void update_ydata (void)
8590  {
8591  Matrix limits = ydata.get_limits ();
8592  float dp = pixel_ysize ();
8593 
8594  limits(0) = limits(0) - dp;
8595  limits(1) = limits(1) + dp;
8596  set_ylim (limits);
8597  }
8598 
8599  float pixel_size (octave_idx_type dim, const Matrix limits)
8600  {
8601  octave_idx_type l = dim - 1;
8602  float dp;
8603 
8604  if (l > 0 && limits(0) != limits(1))
8605  dp = (limits(1) - limits(0))/(2*l);
8606  else
8607  {
8608  if (limits(1) == limits(2))
8609  dp = 0.5;
8610  else
8611  dp = (limits(1) - limits(0))/2;
8612  }
8613  return dp;
8614  }
8615 
8616  public:
8617  float pixel_xsize (void)
8618  {
8619  return pixel_size ((get_cdata ().dims ())(1), xdata.get_limits ());
8620  }
8621 
8622  float pixel_ysize (void)
8623  {
8624  return pixel_size ((get_cdata ().dims ())(0), ydata.get_limits ());
8625  }
8626  };
8627 
8628 private:
8630 
8631 public:
8632  image (const graphics_handle& mh, const graphics_handle& p)
8633  : base_graphics_object (), xproperties (mh, p)
8634  {
8635  xproperties.override_defaults (*this);
8636  }
8637 
8638  ~image (void) { }
8639 
8640  base_properties& get_properties (void) { return xproperties; }
8641 
8642  const base_properties& get_properties (void) const { return xproperties; }
8643 
8644  bool valid_object (void) const { return true; }
8645 };
8646 
8647 // ---------------------------------------------------------------------
8648 
8650 {
8651 public:
8653  {
8654  public:
8655  octave_value get_color_data (void) const;
8656 
8657  bool is_aliminclude (void) const
8658  { return (aliminclude.is_on () && alphadatamapping.is ("scaled")); }
8659  std::string get_aliminclude (void) const
8660  { return aliminclude.current_value (); }
8661 
8662  bool is_climinclude (void) const
8663  { return (climinclude.is_on () && cdatamapping.is ("scaled")); }
8664  std::string get_climinclude (void) const
8665  { return climinclude.current_value (); }
8666 
8667  // See the genprops.awk script for an explanation of the
8668  // properties declarations.
8669  // Programming note: Keep property list sorted if new ones are added.
8670 
8671 public:
8672  properties (const graphics_handle& mh, const graphics_handle& p);
8673 
8674  ~properties (void) { }
8675 
8676  void set (const caseless_str& pname, const octave_value& val);
8677 
8678  octave_value get (bool all = false) const;
8679 
8680  octave_value get (const caseless_str& pname) const;
8681 
8682  octave_value get (const std::string& pname) const
8683  {
8684  return get (caseless_str (pname));
8685  }
8686 
8687  octave_value get (const char *pname) const
8688  {
8689  return get (caseless_str (pname));
8690  }
8691 
8692  property get_property (const caseless_str& pname);
8693 
8694  std::string graphics_object_name (void) const { return go_name; }
8695 
8696  static property_list::pval_map_type factory_defaults (void);
8697 
8698 private:
8699  static std::string go_name;
8700 
8701 public:
8702 
8703 
8704  static std::set<std::string> core_property_names (void);
8705 
8706  static bool has_core_property (const caseless_str& pname);
8707 
8708  std::set<std::string> all_property_names (void) const;
8709 
8710  bool has_property (const caseless_str& pname) const;
8711 
8712 private:
8713 
8757 
8758 public:
8759 
8760  enum
8761  {
8762  ID_ALPHADATAMAPPING = 7000,
8763  ID_AMBIENTSTRENGTH = 7001,
8764  ID_BACKFACELIGHTING = 7002,
8765  ID_CDATA = 7003,
8766  ID_CDATAMAPPING = 7004,
8767  ID_DIFFUSESTRENGTH = 7005,
8768  ID_DISPLAYNAME = 7006,
8769  ID_EDGEALPHA = 7007,
8770  ID_EDGECOLOR = 7008,
8771  ID_EDGELIGHTING = 7009,
8772  ID_ERASEMODE = 7010,
8773  ID_FACEALPHA = 7011,
8774  ID_FACECOLOR = 7012,
8775  ID_FACELIGHTING = 7013,
8776  ID_FACES = 7014,
8777  ID_FACEVERTEXALPHADATA = 7015,
8778  ID_FACEVERTEXCDATA = 7016,
8779  ID_INTERPRETER = 7017,
8780  ID_LINESTYLE = 7018,
8781  ID_LINEWIDTH = 7019,
8782  ID_MARKER = 7020,
8783  ID_MARKEREDGECOLOR = 7021,
8784  ID_MARKERFACECOLOR = 7022,
8785  ID_MARKERSIZE = 7023,
8786  ID_NORMALMODE = 7024,
8787  ID_SPECULARCOLORREFLECTANCE = 7025,
8788  ID_SPECULAREXPONENT = 7026,
8789  ID_SPECULARSTRENGTH = 7027,
8790  ID_VERTEXNORMALS = 7028,
8791  ID_VERTICES = 7029,
8792  ID_XDATA = 7030,
8793  ID_YDATA = 7031,
8794  ID_ZDATA = 7032,
8795  ID_ALIM = 7033,
8796  ID_CLIM = 7034,
8797  ID_XLIM = 7035,
8798  ID_YLIM = 7036,
8799  ID_ZLIM = 7037,
8800  ID_ALIMINCLUDE = 7038,
8801  ID_CLIMINCLUDE = 7039,
8802  ID_XLIMINCLUDE = 7040,
8803  ID_YLIMINCLUDE = 7041,
8804  ID_ZLIMINCLUDE = 7042
8805  };
8806 
8807  bool alphadatamapping_is (const std::string& v) const { return alphadatamapping.is (v); }
8808  std::string get_alphadatamapping (void) const { return alphadatamapping.current_value (); }
8809 
8810  double get_ambientstrength (void) const { return ambientstrength.double_value (); }
8811 
8812  bool backfacelighting_is (const std::string& v) const { return backfacelighting.is (v); }
8813  std::string get_backfacelighting (void) const { return backfacelighting.current_value (); }
8814 
8815  octave_value get_cdata (void) const { return cdata.get (); }
8816 
8817  bool cdatamapping_is (const std::string& v) const { return cdatamapping.is (v); }
8818  std::string get_cdatamapping (void) const { return cdatamapping.current_value (); }
8819 
8820  double get_diffusestrength (void) const { return diffusestrength.double_value (); }
8821 
8822  std::string get_displayname (void) const { return displayname.string_value (); }
8823 
8824  bool edgealpha_is_double (void) const { return edgealpha.is_double (); }
8825  bool edgealpha_is (const std::string& v) const { return edgealpha.is (v); }
8826  double get_edgealpha_double (void) const { return (edgealpha.is_double () ? edgealpha.double_value () : 0); }
8827  octave_value get_edgealpha (void) const { return edgealpha.get (); }
8828 
8829  bool edgecolor_is_rgb (void) const { return edgecolor.is_rgb (); }
8830  bool edgecolor_is (const std::string& v) const { return edgecolor.is (v); }
8831  Matrix get_edgecolor_rgb (void) const { return (edgecolor.is_rgb () ? edgecolor.rgb () : Matrix ()); }
8832  octave_value get_edgecolor (void) const { return edgecolor.get (); }
8833 
8834  bool edgelighting_is (const std::string& v) const { return edgelighting.is (v); }
8835  std::string get_edgelighting (void) const { return edgelighting.current_value (); }
8836 
8837  bool erasemode_is (const std::string& v) const { return erasemode.is (v); }
8838  std::string get_erasemode (void) const { return erasemode.current_value (); }
8839 
8840  bool facealpha_is_double (void) const { return facealpha.is_double (); }
8841  bool facealpha_is (const std::string& v) const { return facealpha.is (v); }
8842  double get_facealpha_double (void) const { return (facealpha.is_double () ? facealpha.double_value () : 0); }
8843  octave_value get_facealpha (void) const { return facealpha.get (); }
8844 
8845  bool facecolor_is_rgb (void) const { return facecolor.is_rgb (); }
8846  bool facecolor_is (const std::string& v) const { return facecolor.is (v); }
8847  Matrix get_facecolor_rgb (void) const { return (facecolor.is_rgb () ? facecolor.rgb () : Matrix ()); }
8848  octave_value get_facecolor (void) const { return facecolor.get (); }
8849 
8850  bool facelighting_is (const std::string& v) const { return facelighting.is (v); }
8851  std::string get_facelighting (void) const { return facelighting.current_value (); }
8852 
8853  octave_value get_faces (void) const { return faces.get (); }
8854 
8855  octave_value get_facevertexalphadata (void) const { return facevertexalphadata.get (); }
8856 
8857  octave_value get_facevertexcdata (void) const { return facevertexcdata.get (); }
8858 
8859  bool interpreter_is (const std::string& v) const { return interpreter.is (v); }
8860  std::string get_interpreter (void) const { return interpreter.current_value (); }
8861 
8862  bool linestyle_is (const std::string& v) const { return linestyle.is (v); }
8863  std::string get_linestyle (void) const { return linestyle.current_value (); }
8864 
8865  double get_linewidth (void) const { return linewidth.double_value (); }
8866 
8867  bool marker_is (const std::string& v) const { return marker.is (v); }
8868  std::string get_marker (void) const { return marker.current_value (); }
8869 
8870  bool markeredgecolor_is_rgb (void) const { return markeredgecolor.is_rgb (); }
8871  bool markeredgecolor_is (const std::string& v) const { return markeredgecolor.is (v); }
8872  Matrix get_markeredgecolor_rgb (void) const { return (markeredgecolor.is_rgb () ? markeredgecolor.rgb () : Matrix ()); }
8873  octave_value get_markeredgecolor (void) const { return markeredgecolor.get (); }
8874 
8875  bool markerfacecolor_is_rgb (void) const { return markerfacecolor.is_rgb (); }
8876  bool markerfacecolor_is (const std::string& v) const { return markerfacecolor.is (v); }
8877  Matrix get_markerfacecolor_rgb (void) const { return (markerfacecolor.is_rgb () ? markerfacecolor.rgb () : Matrix ()); }
8878  octave_value get_markerfacecolor (void) const { return markerfacecolor.get (); }
8879 
8880  double get_markersize (void) const { return markersize.double_value (); }
8881 
8882  bool normalmode_is (const std::string& v) const { return normalmode.is (v); }
8883  std::string get_normalmode (void) const { return normalmode.current_value (); }
8884 
8885  double get_specularcolorreflectance (void) const { return specularcolorreflectance.double_value (); }
8886 
8887  double get_specularexponent (void) const { return specularexponent.double_value (); }
8888 
8889  double get_specularstrength (void) const { return specularstrength.double_value (); }
8890 
8891  octave_value get_vertexnormals (void) const { return vertexnormals.get (); }
8892 
8893  octave_value get_vertices (void) const { return vertices.get (); }
8894 
8895  octave_value get_xdata (void) const { return xdata.get (); }
8896 
8897  octave_value get_ydata (void) const { return ydata.get (); }
8898 
8899  octave_value get_zdata (void) const { return zdata.get (); }
8900 
8901  octave_value get_alim (void) const { return alim.get (); }
8902 
8903  octave_value get_clim (void) const { return clim.get (); }
8904 
8905  octave_value get_xlim (void) const { return xlim.get (); }
8906 
8907  octave_value get_ylim (void) const { return ylim.get (); }
8908 
8909  octave_value get_zlim (void) const { return zlim.get (); }
8910 
8911  bool is_xliminclude (void) const { return xliminclude.is_on (); }
8912  std::string get_xliminclude (void) const { return xliminclude.current_value (); }
8913 
8914  bool is_yliminclude (void) const { return yliminclude.is_on (); }
8915  std::string get_yliminclude (void) const { return yliminclude.current_value (); }
8916 
8917  bool is_zliminclude (void) const { return zliminclude.is_on (); }
8918  std::string get_zliminclude (void) const { return zliminclude.current_value (); }
8919 
8920 
8921  void set_alphadatamapping (const octave_value& val)
8922  {
8923  if (! error_state)
8924  {
8925  if (alphadatamapping.set (val, false))
8926  {
8927  update_axis_limits ("alphadatamapping");
8928  alphadatamapping.run_listeners (POSTSET);
8929  mark_modified ();
8930  }
8931  }
8932  }
8933 
8934  void set_ambientstrength (const octave_value& val)
8935  {
8936  if (! error_state)
8937  {
8938  if (ambientstrength.set (val, true))
8939  {
8940  mark_modified ();
8941  }
8942  }
8943  }
8944 
8945  void set_backfacelighting (const octave_value& val)
8946  {
8947  if (! error_state)
8948  {
8949  if (backfacelighting.set (val, true))
8950  {
8951  mark_modified ();
8952  }
8953  }
8954  }
8955 
8956  void set_cdata (const octave_value& val)
8957  {
8958  if (! error_state)
8959  {
8960  if (cdata.set (val, true))
8961  {
8962  update_cdata ();
8963  mark_modified ();
8964  }
8965  }
8966  }
8967 
8968  void set_cdatamapping (const octave_value& val)
8969  {
8970  if (! error_state)
8971  {
8972  if (cdatamapping.set (val, false))
8973  {
8974  update_axis_limits ("cdatamapping");
8975  cdatamapping.run_listeners (POSTSET);
8976  mark_modified ();
8977  }
8978  }
8979  }
8980 
8981  void set_diffusestrength (const octave_value& val)
8982  {
8983  if (! error_state)
8984  {
8985  if (diffusestrength.set (val, true))
8986  {
8987  mark_modified ();
8988  }
8989  }
8990  }
8991 
8992  void set_displayname (const octave_value& val)
8993  {
8994  if (! error_state)
8995  {
8996  if (displayname.set (val, true))
8997  {
8998  mark_modified ();
8999  }
9000  }
9001  }
9002 
9003  void set_edgealpha (const octave_value& val)
9004  {
9005  if (! error_state)
9006  {
9007  if (edgealpha.set (val, true))
9008  {
9009  mark_modified ();
9010  }
9011  }
9012  }
9013 
9014  void set_edgecolor (const octave_value& val)
9015  {
9016  if (! error_state)
9017  {
9018  if (edgecolor.set (val, true))
9019  {
9020  mark_modified ();
9021  }
9022  }
9023  }
9024 
9025  void set_edgelighting (const octave_value& val)
9026  {
9027  if (! error_state)
9028  {
9029  if (edgelighting.set (val, true))
9030  {
9031  mark_modified ();
9032  }
9033  }
9034  }
9035 
9036  void set_erasemode (const octave_value& val)
9037  {
9038  if (! error_state)
9039  {
9040  if (erasemode.set (val, true))
9041  {
9042  mark_modified ();
9043  }
9044  }
9045  }
9046 
9047  void set_facealpha (const octave_value& val)
9048  {
9049  if (! error_state)
9050  {
9051  if (facealpha.set (val, true))
9052  {
9053  mark_modified ();
9054  }
9055  }
9056  }
9057 
9058  void set_facecolor (const octave_value& val)
9059  {
9060  if (! error_state)
9061  {
9062  if (facecolor.set (val, true))
9063  {
9064  mark_modified ();
9065  }
9066  }
9067  }
9068 
9069  void set_facelighting (const octave_value& val)
9070  {
9071  if (! error_state)
9072  {
9073  if (facelighting.set (val, true))
9074  {
9075  mark_modified ();
9076  }
9077  }
9078  }
9079 
9080  void set_faces (const octave_value& val)
9081  {
9082  if (! error_state)
9083  {
9084  if (faces.set (val, true))
9085  {
9086  mark_modified ();
9087  }
9088  }
9089  }
9090 
9091  void set_facevertexalphadata (const octave_value& val)
9092  {
9093  if (! error_state)
9094  {
9095  if (facevertexalphadata.set (val, true))
9096  {
9097  mark_modified ();
9098  }
9099  }
9100  }
9101 
9102  void set_facevertexcdata (const octave_value& val)
9103  {
9104  if (! error_state)
9105  {
9106  if (facevertexcdata.set (val, true))
9107  {
9108  mark_modified ();
9109  }
9110  }
9111  }
9112 
9113  void set_interpreter (const octave_value& val)
9114  {
9115  if (! error_state)
9116  {
9117  if (interpreter.set (val, true))
9118  {
9119  mark_modified ();
9120  }
9121  }
9122  }
9123 
9124  void set_linestyle (const octave_value& val)
9125  {
9126  if (! error_state)
9127  {
9128  if (linestyle.set (val, true))
9129  {
9130  mark_modified ();
9131  }
9132  }
9133  }
9134 
9135  void set_linewidth (const octave_value& val)
9136  {
9137  if (! error_state)
9138  {
9139  if (linewidth.set (val, true))
9140  {
9141  mark_modified ();
9142  }
9143  }
9144  }
9145 
9146  void set_marker (const octave_value& val)
9147  {
9148  if (! error_state)
9149  {
9150  if (marker.set (val, true))
9151  {
9152  mark_modified ();
9153  }
9154  }
9155  }
9156 
9157  void set_markeredgecolor (const octave_value& val)
9158  {
9159  if (! error_state)
9160  {
9161  if (markeredgecolor.set (val, true))
9162  {
9163  mark_modified ();
9164  }
9165  }
9166  }
9167 
9168  void set_markerfacecolor (const octave_value& val)
9169  {
9170  if (! error_state)
9171  {
9172  if (markerfacecolor.set (val, true))
9173  {
9174  mark_modified ();
9175  }
9176  }
9177  }
9178 
9179  void set_markersize (const octave_value& val)
9180  {
9181  if (! error_state)
9182  {
9183  if (markersize.set (val, true))
9184  {
9185  mark_modified ();
9186  }
9187  }
9188  }
9189 
9190  void set_normalmode (const octave_value& val)
9191  {
9192  if (! error_state)
9193  {
9194  if (normalmode.set (val, true))
9195  {
9196  mark_modified ();
9197  }
9198  }
9199  }
9200 
9201  void set_specularcolorreflectance (const octave_value& val)
9202  {
9203  if (! error_state)
9204  {
9205  if (specularcolorreflectance.set (val, true))
9206  {
9207  mark_modified ();
9208  }
9209  }
9210  }
9211 
9212  void set_specularexponent (const octave_value& val)
9213  {
9214  if (! error_state)
9215  {
9216  if (specularexponent.set (val, true))
9217  {
9218  mark_modified ();
9219  }
9220  }
9221  }
9222 
9223  void set_specularstrength (const octave_value& val)
9224  {
9225  if (! error_state)
9226  {
9227  if (specularstrength.set (val, true))
9228  {
9229  mark_modified ();
9230  }
9231  }
9232  }
9233 
9234  void set_vertexnormals (const octave_value& val)
9235  {
9236  if (! error_state)
9237  {
9238  if (vertexnormals.set (val, true))
9239  {
9240  mark_modified ();
9241  }
9242  }
9243  }
9244 
9245  void set_vertices (const octave_value& val)
9246  {
9247  if (! error_state)
9248  {
9249  if (vertices.set (val, true))
9250  {
9251  mark_modified ();
9252  }
9253  }
9254  }
9255 
9256  void set_xdata (const octave_value& val)
9257  {
9258  if (! error_state)
9259  {
9260  if (xdata.set (val, true))
9261  {
9262  update_xdata ();
9263  mark_modified ();
9264  }
9265  }
9266  }
9267 
9268  void set_ydata (const octave_value& val)
9269  {
9270  if (! error_state)
9271  {
9272  if (ydata.set (val, true))
9273  {
9274  update_ydata ();
9275  mark_modified ();
9276  }
9277  }
9278  }
9279 
9280  void set_zdata (const octave_value& val)
9281  {
9282  if (! error_state)
9283  {
9284  if (zdata.set (val, true))
9285  {
9286  update_zdata ();
9287  mark_modified ();
9288  }
9289  }
9290  }
9291 
9292  void set_alim (const octave_value& val)
9293  {
9294  if (! error_state)
9295  {
9296  if (alim.set (val, false))
9297  {
9298  update_axis_limits ("alim");
9299  alim.run_listeners (POSTSET);
9300  mark_modified ();
9301  }
9302  }
9303  }
9304 
9305  void set_clim (const octave_value& val)
9306  {
9307  if (! error_state)
9308  {
9309  if (clim.set (val, false))
9310  {
9311  update_axis_limits ("clim");
9312  clim.run_listeners (POSTSET);
9313  mark_modified ();
9314  }
9315  }
9316  }
9317 
9318  void set_xlim (const octave_value& val)
9319  {
9320  if (! error_state)
9321  {
9322  if (xlim.set (val, false))
9323  {
9324  update_axis_limits ("xlim");
9325  xlim.run_listeners (POSTSET);
9326  mark_modified ();
9327  }
9328  }
9329  }
9330 
9331  void set_ylim (const octave_value& val)
9332  {
9333  if (! error_state)
9334  {
9335  if (ylim.set (val, false))
9336  {
9337  update_axis_limits ("ylim");
9338  ylim.run_listeners (POSTSET);
9339  mark_modified ();
9340  }
9341  }
9342  }
9343 
9344  void set_zlim (const octave_value& val)
9345  {
9346  if (! error_state)
9347  {
9348  if (zlim.set (val, false))
9349  {
9350  update_axis_limits ("zlim");
9351  zlim.run_listeners (POSTSET);
9352  mark_modified ();
9353  }
9354  }
9355  }
9356 
9357  void set_aliminclude (const octave_value& val)
9358  {
9359  if (! error_state)
9360  {
9361  if (aliminclude.set (val, false))
9362  {
9363  update_axis_limits ("aliminclude");
9364  aliminclude.run_listeners (POSTSET);
9365  mark_modified ();
9366  }
9367  }
9368  }
9369 
9370  void set_climinclude (const octave_value& val)
9371  {
9372  if (! error_state)
9373  {
9374  if (climinclude.set (val, false))
9375  {
9376  update_axis_limits ("climinclude");
9377  climinclude.run_listeners (POSTSET);
9378  mark_modified ();
9379  }
9380  }
9381  }
9382 
9383  void set_xliminclude (const octave_value& val)
9384  {
9385  if (! error_state)
9386  {
9387  if (xliminclude.set (val, false))
9388  {
9389  update_axis_limits ("xliminclude");
9390  xliminclude.run_listeners (POSTSET);
9391  mark_modified ();
9392  }
9393  }
9394  }
9395 
9396  void set_yliminclude (const octave_value& val)
9397  {
9398  if (! error_state)
9399  {
9400  if (yliminclude.set (val, false))
9401  {
9402  update_axis_limits ("yliminclude");
9403  yliminclude.run_listeners (POSTSET);
9404  mark_modified ();
9405  }
9406  }
9407  }
9408 
9409  void set_zliminclude (const octave_value& val)
9410  {
9411  if (! error_state)
9412  {
9413  if (zliminclude.set (val, false))
9414  {
9415  update_axis_limits ("zliminclude");
9416  zliminclude.run_listeners (POSTSET);
9417  mark_modified ();
9418  }
9419  }
9420  }
9421 
9422 
9423  protected:
9424  void init (void)
9425  {
9426  xdata.add_constraint (dim_vector (-1, -1));
9427  ydata.add_constraint (dim_vector (-1, -1));
9428  zdata.add_constraint (dim_vector (-1, -1));
9429  faces.add_constraint (dim_vector (-1, -1));
9430  vertices.add_constraint (dim_vector (-1, 2));
9431  vertices.add_constraint (dim_vector (-1, 3));
9432  cdata.add_constraint (dim_vector (-1, -1));
9433  cdata.add_constraint (dim_vector (-1, -1, 3));
9434  facevertexcdata.add_constraint (dim_vector (-1, 1));
9435  facevertexcdata.add_constraint (dim_vector (-1, 3));
9436  facevertexalphadata.add_constraint (dim_vector (-1, 1));
9437  vertexnormals.add_constraint (dim_vector (-1, -1));
9438  }
9439 
9440  private:
9441  void update_xdata (void) { set_xlim (xdata.get_limits ()); }
9442  void update_ydata (void) { set_ylim (ydata.get_limits ()); }
9443  void update_zdata (void) { set_zlim (zdata.get_limits ()); }
9444 
9445  void update_cdata (void)
9446  {
9447  if (cdatamapping_is ("scaled"))
9448  set_clim (cdata.get_limits ());
9449  else
9450  clim = cdata.get_limits ();
9451  }
9452  };
9453 
9454 private:
9456 
9457 public:
9458  patch (const graphics_handle& mh, const graphics_handle& p)
9459  : base_graphics_object (), xproperties (mh, p)
9460  {
9461  xproperties.override_defaults (*this);
9462  }
9463 
9464  ~patch (void) { }
9465 
9466  base_properties& get_properties (void) { return xproperties; }
9467 
9468  const base_properties& get_properties (void) const { return xproperties; }
9469 
9470  bool valid_object (void) const { return true; }
9471 };
9472 
9473 // ---------------------------------------------------------------------
9474 
9476 {
9477 public:
9479  {
9480  public:
9481  octave_value get_color_data (void) const;
9482 
9483  bool is_aliminclude (void) const
9484  { return (aliminclude.is_on () && alphadatamapping.is ("scaled")); }
9485  std::string get_aliminclude (void) const
9486  { return aliminclude.current_value (); }
9487 
9488  bool is_climinclude (void) const
9489  { return (climinclude.is_on () && cdatamapping.is ("scaled")); }
9490  std::string get_climinclude (void) const
9491  { return climinclude.current_value (); }
9492 
9493  // See the genprops.awk script for an explanation of the
9494  // properties declarations.
9495  // Programming note: Keep property list sorted if new ones are added.
9496 
9497 public:
9498  properties (const graphics_handle& mh, const graphics_handle& p);
9499 
9500  ~properties (void) { }
9501 
9502  void set (const caseless_str& pname, const octave_value& val);
9503 
9504  octave_value get (bool all = false) const;
9505 
9506  octave_value get (const caseless_str& pname) const;
9507 
9508  octave_value get (const std::string& pname) const
9509  {
9510  return get (caseless_str (pname));
9511  }
9512 
9513  octave_value get (const char *pname) const
9514  {
9515  return get (caseless_str (pname));
9516  }
9517 
9518  property get_property (const caseless_str& pname);
9519 
9520  std::string graphics_object_name (void) const { return go_name; }
9521 
9522  static property_list::pval_map_type factory_defaults (void);
9523 
9524 private:
9525  static std::string go_name;
9526 
9527 public:
9528 
9529 
9530  static std::set<std::string> core_property_names (void);
9531 
9532  static bool has_core_property (const caseless_str& pname);
9533 
9534  std::set<std::string> all_property_names (void) const;
9535 
9536  bool has_property (const caseless_str& pname) const;
9537 
9538 private:
9539 
9585 
9586 public:
9587 
9588  enum
9589  {
9590  ID_ALPHADATA = 8000,
9591  ID_ALPHADATAMAPPING = 8001,
9592  ID_AMBIENTSTRENGTH = 8002,
9593  ID_BACKFACELIGHTING = 8003,
9594  ID_CDATA = 8004,
9595  ID_CDATAMAPPING = 8005,
9596  ID_CDATASOURCE = 8006,
9597  ID_DIFFUSESTRENGTH = 8007,
9598  ID_DISPLAYNAME = 8008,
9599  ID_EDGEALPHA = 8009,
9600  ID_EDGECOLOR = 8010,
9601  ID_EDGELIGHTING = 8011,
9602  ID_ERASEMODE = 8012,
9603  ID_FACEALPHA = 8013,
9604  ID_FACECOLOR = 8014,
9605  ID_FACELIGHTING = 8015,
9606  ID_INTERPRETER = 8016,
9607  ID_LINESTYLE = 8017,
9608  ID_LINEWIDTH = 8018,
9609  ID_MARKER = 8019,
9610  ID_MARKEREDGECOLOR = 8020,
9611  ID_MARKERFACECOLOR = 8021,
9612  ID_MARKERSIZE = 8022,
9613  ID_MESHSTYLE = 8023,
9614  ID_NORMALMODE = 8024,
9615  ID_SPECULARCOLORREFLECTANCE = 8025,
9616  ID_SPECULAREXPONENT = 8026,
9617  ID_SPECULARSTRENGTH = 8027,
9618  ID_VERTEXNORMALS = 8028,
9619  ID_XDATA = 8029,
9620  ID_XDATASOURCE = 8030,
9621  ID_YDATA = 8031,
9622  ID_YDATASOURCE = 8032,
9623  ID_ZDATA = 8033,
9624  ID_ZDATASOURCE = 8034,
9625  ID_ALIM = 8035,
9626  ID_CLIM = 8036,
9627  ID_XLIM = 8037,
9628  ID_YLIM = 8038,
9629  ID_ZLIM = 8039,
9630  ID_ALIMINCLUDE = 8040,
9631  ID_CLIMINCLUDE = 8041,
9632  ID_XLIMINCLUDE = 8042,
9633  ID_YLIMINCLUDE = 8043,
9634  ID_ZLIMINCLUDE = 8044
9635  };
9636 
9637  octave_value get_alphadata (void) const { return alphadata.get (); }
9638 
9639  bool alphadatamapping_is (const std::string& v) const { return alphadatamapping.is (v); }
9640  std::string get_alphadatamapping (void) const { return alphadatamapping.current_value (); }
9641 
9642  double get_ambientstrength (void) const { return ambientstrength.double_value (); }
9643 
9644  bool backfacelighting_is (const std::string& v) const { return backfacelighting.is (v); }
9645  std::string get_backfacelighting (void) const { return backfacelighting.current_value (); }
9646 
9647  octave_value get_cdata (void) const { return cdata.get (); }
9648 
9649  bool cdatamapping_is (const std::string& v) const { return cdatamapping.is (v); }
9650  std::string get_cdatamapping (void) const { return cdatamapping.current_value (); }
9651 
9652  std::string get_cdatasource (void) const { return cdatasource.string_value (); }
9653 
9654  double get_diffusestrength (void) const { return diffusestrength.double_value (); }
9655 
9656  std::string get_displayname (void) const { return displayname.string_value (); }
9657 
9658  bool edgealpha_is_double (void) const { return edgealpha.is_double (); }
9659  bool edgealpha_is (const std::string& v) const { return edgealpha.is (v); }
9660  double get_edgealpha_double (void) const { return (edgealpha.is_double () ? edgealpha.double_value () : 0); }
9661  octave_value get_edgealpha (void) const { return edgealpha.get (); }
9662 
9663  bool edgecolor_is_rgb (void) const { return edgecolor.is_rgb (); }
9664  bool edgecolor_is (const std::string& v) const { return edgecolor.is (v); }
9665  Matrix get_edgecolor_rgb (void) const { return (edgecolor.is_rgb () ? edgecolor.rgb () : Matrix ()); }
9666  octave_value get_edgecolor (void) const { return edgecolor.get (); }
9667 
9668  bool edgelighting_is (const std::string& v) const { return edgelighting.is (v); }
9669  std::string get_edgelighting (void) const { return edgelighting.current_value (); }
9670 
9671  bool erasemode_is (const std::string& v) const { return erasemode.is (v); }
9672  std::string get_erasemode (void) const { return erasemode.current_value (); }
9673 
9674  bool facealpha_is_double (void) const { return facealpha.is_double (); }
9675  bool facealpha_is (const std::string& v) const { return facealpha.is (v); }
9676  double get_facealpha_double (void) const { return (facealpha.is_double () ? facealpha.double_value () : 0); }
9677  octave_value get_facealpha (void) const { return facealpha.get (); }
9678 
9679  bool facecolor_is_rgb (void) const { return facecolor.is_rgb (); }
9680  bool facecolor_is (const std::string& v) const { return facecolor.is (v); }
9681  Matrix get_facecolor_rgb (void) const { return (facecolor.is_rgb () ? facecolor.rgb () : Matrix ()); }
9682  octave_value get_facecolor (void) const { return facecolor.get (); }
9683 
9684  bool facelighting_is (const std::string& v) const { return facelighting.is (v); }
9685  std::string get_facelighting (void) const { return facelighting.current_value (); }
9686 
9687  bool interpreter_is (const std::string& v) const { return interpreter.is (v); }
9688  std::string get_interpreter (void) const { return interpreter.current_value (); }
9689 
9690  bool linestyle_is (const std::string& v) const { return linestyle.is (v); }
9691  std::string get_linestyle (void) const { return linestyle.current_value (); }
9692 
9693  double get_linewidth (void) const { return linewidth.double_value (); }
9694 
9695  bool marker_is (const std::string& v) const { return marker.is (v); }
9696  std::string get_marker (void) const { return marker.current_value (); }
9697 
9698  bool markeredgecolor_is_rgb (void) const { return markeredgecolor.is_rgb (); }
9699  bool markeredgecolor_is (const std::string& v) const { return markeredgecolor.is (v); }
9700  Matrix get_markeredgecolor_rgb (void) const { return (markeredgecolor.is_rgb () ? markeredgecolor.rgb () : Matrix ()); }
9701  octave_value get_markeredgecolor (void) const { return markeredgecolor.get (); }
9702 
9703  bool markerfacecolor_is_rgb (void) const { return markerfacecolor.is_rgb (); }
9704  bool markerfacecolor_is (const std::string& v) const { return markerfacecolor.is (v); }
9705  Matrix get_markerfacecolor_rgb (void) const { return (markerfacecolor.is_rgb () ? markerfacecolor.rgb () : Matrix ()); }
9706  octave_value get_markerfacecolor (void) const { return markerfacecolor.get (); }
9707 
9708  double get_markersize (void) const { return markersize.double_value (); }
9709 
9710  bool meshstyle_is (const std::string& v) const { return meshstyle.is (v); }
9711  std::string get_meshstyle (void) const { return meshstyle.current_value (); }
9712 
9713  bool normalmode_is (const std::string& v) const { return normalmode.is (v); }
9714  std::string get_normalmode (void) const { return normalmode.current_value (); }
9715 
9716  double get_specularcolorreflectance (void) const { return specularcolorreflectance.double_value (); }
9717 
9718  double get_specularexponent (void) const { return specularexponent.double_value (); }
9719 
9720  double get_specularstrength (void) const { return specularstrength.double_value (); }
9721 
9722  octave_value get_vertexnormals (void) const { return vertexnormals.get (); }
9723 
9724  octave_value get_xdata (void) const { return xdata.get (); }
9725 
9726  std::string get_xdatasource (void) const { return xdatasource.string_value (); }
9727 
9728  octave_value get_ydata (void) const { return ydata.get (); }
9729 
9730  std::string get_ydatasource (void) const { return ydatasource.string_value (); }
9731 
9732  octave_value get_zdata (void) const { return zdata.get (); }
9733 
9734  std::string get_zdatasource (void) const { return zdatasource.string_value (); }
9735 
9736  octave_value get_alim (void) const { return alim.get (); }
9737 
9738  octave_value get_clim (void) const { return clim.get (); }
9739 
9740  octave_value get_xlim (void) const { return xlim.get (); }
9741 
9742  octave_value get_ylim (void) const { return ylim.get (); }
9743 
9744  octave_value get_zlim (void) const { return zlim.get (); }
9745 
9746  bool is_xliminclude (void) const { return xliminclude.is_on (); }
9747  std::string get_xliminclude (void) const { return xliminclude.current_value (); }
9748 
9749  bool is_yliminclude (void) const { return yliminclude.is_on (); }
9750  std::string get_yliminclude (void) const { return yliminclude.current_value (); }
9751 
9752  bool is_zliminclude (void) const { return zliminclude.is_on (); }
9753  std::string get_zliminclude (void) const { return zliminclude.current_value (); }
9754 
9755 
9756  void set_alphadata (const octave_value& val)
9757  {
9758  if (! error_state)
9759  {
9760  if (alphadata.set (val, true))
9761  {
9762  update_alphadata ();
9763  mark_modified ();
9764  }
9765  }
9766  }
9767 
9768  void set_alphadatamapping (const octave_value& val)
9769  {
9770  if (! error_state)
9771  {
9772  if (alphadatamapping.set (val, false))
9773  {
9774  update_axis_limits ("alphadatamapping");
9775  alphadatamapping.run_listeners (POSTSET);
9776  mark_modified ();
9777  }
9778  }
9779  }
9780 
9781  void set_ambientstrength (const octave_value& val)
9782  {
9783  if (! error_state)
9784  {
9785  if (ambientstrength.set (val, true))
9786  {
9787  mark_modified ();
9788  }
9789  }
9790  }
9791 
9792  void set_backfacelighting (const octave_value& val)
9793  {
9794  if (! error_state)
9795  {
9796  if (backfacelighting.set (val, true))
9797  {
9798  mark_modified ();
9799  }
9800  }
9801  }
9802 
9803  void set_cdata (const octave_value& val)
9804  {
9805  if (! error_state)
9806  {
9807  if (cdata.set (val, true))
9808  {
9809  update_cdata ();
9810  mark_modified ();
9811  }
9812  }
9813  }
9814 
9815  void set_cdatamapping (const octave_value& val)
9816  {
9817  if (! error_state)
9818  {
9819  if (cdatamapping.set (val, false))
9820  {
9821  update_axis_limits ("cdatamapping");
9822  cdatamapping.run_listeners (POSTSET);
9823  mark_modified ();
9824  }
9825  }
9826  }
9827 
9828  void set_cdatasource (const octave_value& val)
9829  {
9830  if (! error_state)
9831  {
9832  if (cdatasource.set (val, true))
9833  {
9834  mark_modified ();
9835  }
9836  }
9837  }
9838 
9839  void set_diffusestrength (const octave_value& val)
9840  {
9841  if (! error_state)
9842  {
9843  if (diffusestrength.set (val, true))
9844  {
9845  mark_modified ();
9846  }
9847  }
9848  }
9849 
9850  void set_displayname (const octave_value& val)
9851  {
9852  if (! error_state)
9853  {
9854  if (displayname.set (val, true))
9855  {
9856  mark_modified ();
9857  }
9858  }
9859  }
9860 
9861  void set_edgealpha (const octave_value& val)
9862  {
9863  if (! error_state)
9864  {
9865  if (edgealpha.set (val, true))
9866  {
9867  mark_modified ();
9868  }
9869  }
9870  }
9871 
9872  void set_edgecolor (const octave_value& val)
9873  {
9874  if (! error_state)
9875  {
9876  if (edgecolor.set (val, true))
9877  {
9878  mark_modified ();
9879  }
9880  }
9881  }
9882 
9883  void set_edgelighting (const octave_value& val)
9884  {
9885  if (! error_state)
9886  {
9887  if (edgelighting.set (val, true))
9888  {
9889  mark_modified ();
9890  }
9891  }
9892  }
9893 
9894  void set_erasemode (const octave_value& val)
9895  {
9896  if (! error_state)
9897  {
9898  if (erasemode.set (val, true))
9899  {
9900  mark_modified ();
9901  }
9902  }
9903  }
9904 
9905  void set_facealpha (const octave_value& val)
9906  {
9907  if (! error_state)
9908  {
9909  if (facealpha.set (val, true))
9910  {
9911  mark_modified ();
9912  }
9913  }
9914  }
9915 
9916  void set_facecolor (const octave_value& val)
9917  {
9918  if (! error_state)
9919  {
9920  if (facecolor.set (val, true))
9921  {
9922  mark_modified ();
9923  }
9924  }
9925  }
9926 
9927  void set_facelighting (const octave_value& val)
9928  {
9929  if (! error_state)
9930  {
9931  if (facelighting.set (val, true))
9932  {
9933  mark_modified ();
9934  }
9935  }
9936  }
9937 
9938  void set_interpreter (const octave_value& val)
9939  {
9940  if (! error_state)
9941  {
9942  if (interpreter.set (val, true))
9943  {
9944  mark_modified ();
9945  }
9946  }
9947  }
9948 
9949  void set_linestyle (const octave_value& val)
9950  {
9951  if (! error_state)
9952  {
9953  if (linestyle.set (val, true))
9954  {
9955  mark_modified ();
9956  }
9957  }
9958  }
9959 
9960  void set_linewidth (const octave_value& val)
9961  {
9962  if (! error_state)
9963  {
9964  if (linewidth.set (val, true))
9965  {
9966  mark_modified ();
9967  }
9968  }
9969  }
9970 
9971  void set_marker (const octave_value& val)
9972  {
9973  if (! error_state)
9974  {
9975  if (marker.set (val, true))
9976  {
9977  mark_modified ();
9978  }
9979  }
9980  }
9981 
9982  void set_markeredgecolor (const octave_value& val)
9983  {
9984  if (! error_state)
9985  {
9986  if (markeredgecolor.set (val, true))
9987  {
9988  mark_modified ();
9989  }
9990  }
9991  }
9992 
9993  void set_markerfacecolor (const octave_value& val)
9994  {
9995  if (! error_state)
9996  {
9997  if (markerfacecolor.set (val, true))
9998  {
9999  mark_modified ();
10000  }
10001  }
10002  }
10003 
10004  void set_markersize (const octave_value& val)
10005  {
10006  if (! error_state)
10007  {
10008  if (markersize.set (val, true))
10009  {
10010  mark_modified ();
10011  }
10012  }
10013  }
10014 
10015  void set_meshstyle (const octave_value& val)
10016  {
10017  if (! error_state)
10018  {
10019  if (meshstyle.set (val, true))
10020  {
10021  mark_modified ();
10022  }
10023  }
10024  }
10025 
10026  void set_normalmode (const octave_value& val)
10027  {
10028  if (! error_state)
10029  {
10030  if (normalmode.set (val, true))
10031  {
10032  update_normalmode ();
10033  mark_modified ();
10034  }
10035  }
10036  }
10037 
10038  void set_specularcolorreflectance (const octave_value& val)
10039  {
10040  if (! error_state)
10041  {
10042  if (specularcolorreflectance.set (val, true))
10043  {
10044  mark_modified ();
10045  }
10046  }
10047  }
10048 
10049  void set_specularexponent (const octave_value& val)
10050  {
10051  if (! error_state)
10052  {
10053  if (specularexponent.set (val, true))
10054  {
10055  mark_modified ();
10056  }
10057  }
10058  }
10059 
10060  void set_specularstrength (const octave_value& val)
10061  {
10062  if (! error_state)
10063  {
10064  if (specularstrength.set (val, true))
10065  {
10066  mark_modified ();
10067  }
10068  }
10069  }
10070 
10071  void set_vertexnormals (const octave_value& val)
10072  {
10073  if (! error_state)
10074  {
10075  if (vertexnormals.set (val, true))
10076  {
10077  update_vertexnormals ();
10078  mark_modified ();
10079  }
10080  }
10081  }
10082 
10083  void set_xdata (const octave_value& val)
10084  {
10085  if (! error_state)
10086  {
10087  if (xdata.set (val, true))
10088  {
10089  update_xdata ();
10090  mark_modified ();
10091  }
10092  }
10093  }
10094 
10095  void set_xdatasource (const octave_value& val)
10096  {
10097  if (! error_state)
10098  {
10099  if (xdatasource.set (val, true))
10100  {
10101  mark_modified ();
10102  }
10103  }
10104  }
10105 
10106  void set_ydata (const octave_value& val)
10107  {
10108  if (! error_state)
10109  {
10110  if (ydata.set (val, true))
10111  {
10112  update_ydata ();
10113  mark_modified ();
10114  }
10115  }
10116  }
10117 
10118  void set_ydatasource (const octave_value& val)
10119  {
10120  if (! error_state)
10121  {
10122  if (ydatasource.set (val, true))
10123  {
10124  mark_modified ();
10125  }
10126  }
10127  }
10128 
10129  void set_zdata (const octave_value& val)
10130  {
10131  if (! error_state)
10132  {
10133  if (zdata.set (val, true))
10134  {
10135  update_zdata ();
10136  mark_modified ();
10137  }
10138  }
10139  }
10140 
10141  void set_zdatasource (const octave_value& val)
10142  {
10143  if (! error_state)
10144  {
10145  if (zdatasource.set (val, true))
10146  {
10147  mark_modified ();
10148  }
10149  }
10150  }
10151 
10152  void set_alim (const octave_value& val)
10153  {
10154  if (! error_state)
10155  {
10156  if (alim.set (val, false))
10157  {
10158  update_axis_limits ("alim");
10159  alim.run_listeners (POSTSET);
10160  mark_modified ();
10161  }
10162  }
10163  }
10164 
10165  void set_clim (const octave_value& val)
10166  {
10167  if (! error_state)
10168  {
10169  if (clim.set (val, false))
10170  {
10171  update_axis_limits ("clim");
10172  clim.run_listeners (POSTSET);
10173  mark_modified ();
10174  }
10175  }
10176  }
10177 
10178  void set_xlim (const octave_value& val)
10179  {
10180  if (! error_state)
10181  {
10182  if (xlim.set (val, false))
10183  {
10184  update_axis_limits ("xlim");
10185  xlim.run_listeners (POSTSET);
10186  mark_modified ();
10187  }
10188  }
10189  }
10190 
10191  void set_ylim (const octave_value& val)
10192  {
10193  if (! error_state)
10194  {
10195  if (ylim.set (val, false))
10196  {
10197  update_axis_limits ("ylim");
10198  ylim.run_listeners (POSTSET);
10199  mark_modified ();
10200  }
10201  }
10202  }
10203 
10204  void set_zlim (const octave_value& val)
10205  {
10206  if (! error_state)
10207  {
10208  if (zlim.set (val, false))
10209  {
10210  update_axis_limits ("zlim");
10211  zlim.run_listeners (POSTSET);
10212  mark_modified ();
10213  }
10214  }
10215  }
10216 
10217  void set_aliminclude (const octave_value& val)
10218  {
10219  if (! error_state)
10220  {
10221  if (aliminclude.set (val, false))
10222  {
10223  update_axis_limits ("aliminclude");
10224  aliminclude.run_listeners (POSTSET);
10225  mark_modified ();
10226  }
10227  }
10228  }
10229 
10230  void set_climinclude (const octave_value& val)
10231  {
10232  if (! error_state)
10233  {
10234  if (climinclude.set (val, false))
10235  {
10236  update_axis_limits ("climinclude");
10237  climinclude.run_listeners (POSTSET);
10238  mark_modified ();
10239  }
10240  }
10241  }
10242 
10243  void set_xliminclude (const octave_value& val)
10244  {
10245  if (! error_state)
10246  {
10247  if (xliminclude.set (val, false))
10248  {
10249  update_axis_limits ("xliminclude");
10250  xliminclude.run_listeners (POSTSET);
10251  mark_modified ();
10252  }
10253  }
10254  }
10255 
10256  void set_yliminclude (const octave_value& val)
10257  {
10258  if (! error_state)
10259  {
10260  if (yliminclude.set (val, false))
10261  {
10262  update_axis_limits ("yliminclude");
10263  yliminclude.run_listeners (POSTSET);
10264  mark_modified ();
10265  }
10266  }
10267  }
10268 
10269  void set_zliminclude (const octave_value& val)
10270  {
10271  if (! error_state)
10272  {
10273  if (zliminclude.set (val, false))
10274  {
10275  update_axis_limits ("zliminclude");
10276  zliminclude.run_listeners (POSTSET);
10277  mark_modified ();
10278  }
10279  }
10280  }
10281 
10282 
10283  protected:
10284  void init (void)
10285  {
10286  xdata.add_constraint (dim_vector (-1, -1));
10287  ydata.add_constraint (dim_vector (-1, -1));
10288  zdata.add_constraint (dim_vector (-1, -1));
10289  cdata.add_constraint ("double");
10290  cdata.add_constraint ("single");
10291  cdata.add_constraint (dim_vector (-1, -1));
10292  cdata.add_constraint (dim_vector (-1, -1, 3));
10293  alphadata.add_constraint ("double");
10294  alphadata.add_constraint ("uint8");
10295  alphadata.add_constraint (dim_vector (-1, -1));
10296  vertexnormals.add_constraint (dim_vector (-1, -1, 3));
10297  }
10298 
10299  private:
10300  void update_alphadata (void)
10301  {
10302  if (alphadatamapping_is ("scaled"))
10303  set_alim (alphadata.get_limits ());
10304  else
10305  alim = alphadata.get_limits ();
10306  }
10307 
10308  void update_cdata (void)
10309  {
10310  if (cdatamapping_is ("scaled"))
10311  set_clim (cdata.get_limits ());
10312  else
10313  clim = cdata.get_limits ();
10314  }
10315 
10316  void update_xdata (void)
10317  {
10318  update_normals ();
10319  set_xlim (xdata.get_limits ());
10320  }
10321 
10322  void update_ydata (void)
10323  {
10324  update_normals ();
10325  set_ylim (ydata.get_limits ());
10326  }
10327 
10328  void update_zdata (void)
10329  {
10330  update_normals ();
10331  set_zlim (zdata.get_limits ());
10332  }
10333 
10334  void update_normals (void);
10335 
10336  void update_normalmode (void)
10337  { update_normals (); }
10338 
10339  void update_vertexnormals (void)
10340  { set_normalmode ("manual"); }
10341  };
10342 
10343 private:
10345 
10346 public:
10348  : base_graphics_object (), xproperties (mh, p)
10349  {
10350  xproperties.override_defaults (*this);
10351  }
10352 
10353  ~surface (void) { }
10354 
10355  base_properties& get_properties (void) { return xproperties; }
10356 
10357  const base_properties& get_properties (void) const { return xproperties; }
10358 
10359  bool valid_object (void) const { return true; }
10360 };
10361 
10362 // ---------------------------------------------------------------------
10363 
10365 {
10366 public:
10368  {
10369  public:
10370  void remove_child (const graphics_handle& h)
10371  {
10373  update_limits ();
10374  }
10375 
10376  void adopt (const graphics_handle& h)
10377  {
10378 
10380  update_limits (h);
10381  }
10382 
10383  // See the genprops.awk script for an explanation of the
10384  // properties declarations.
10385  // Programming note: Keep property list sorted if new ones are added.
10386 
10387 public:
10388  properties (const graphics_handle& mh, const graphics_handle& p);
10389 
10390  ~properties (void) { }
10391 
10392  void set (const caseless_str& pname, const octave_value& val);
10393 
10394  octave_value get (bool all = false) const;
10395 
10396  octave_value get (const caseless_str& pname) const;
10397 
10398  octave_value get (const std::string& pname) const
10399  {
10400  return get (caseless_str (pname));
10401  }
10402 
10403  octave_value get (const char *pname) const
10404  {
10405  return get (caseless_str (pname));
10406  }
10407 
10408  property get_property (const caseless_str& pname);
10409 
10410  std::string graphics_object_name (void) const { return go_name; }
10411 
10412  static property_list::pval_map_type factory_defaults (void);
10413 
10414 private:
10415  static std::string go_name;
10416 
10417 public:
10418 
10419 
10420  static std::set<std::string> core_property_names (void);
10421 
10422  static bool has_core_property (const caseless_str& pname);
10423 
10424  std::set<std::string> all_property_names (void) const;
10425 
10426  bool has_property (const caseless_str& pname) const;
10427 
10428 private:
10429 
10442 
10443 public:
10444 
10445  enum
10446  {
10447  ID_DISPLAYNAME = 9000,
10448  ID_ERASEMODE = 9001,
10449  ID_ALIM = 9002,
10450  ID_CLIM = 9003,
10451  ID_XLIM = 9004,
10452  ID_YLIM = 9005,
10453  ID_ZLIM = 9006,
10454  ID_ALIMINCLUDE = 9007,
10455  ID_CLIMINCLUDE = 9008,
10456  ID_XLIMINCLUDE = 9009,
10457  ID_YLIMINCLUDE = 9010,
10458  ID_ZLIMINCLUDE = 9011
10459  };
10460 
10461  std::string get_displayname (void) const { return displayname.string_value (); }
10462 
10463  bool erasemode_is (const std::string& v) const { return erasemode.is (v); }
10464  std::string get_erasemode (void) const { return erasemode.current_value (); }
10465 
10466  octave_value get_alim (void) const { return alim.get (); }
10467 
10468  octave_value get_clim (void) const { return clim.get (); }
10469 
10470  octave_value get_xlim (void) const { return xlim.get (); }
10471 
10472  octave_value get_ylim (void) const { return ylim.get (); }
10473 
10474  octave_value get_zlim (void) const { return zlim.get (); }
10475 
10476  bool is_aliminclude (void) const { return aliminclude.is_on (); }
10477  std::string get_aliminclude (void) const { return aliminclude.current_value (); }
10478 
10479  bool is_climinclude (void) const { return climinclude.is_on (); }
10480  std::string get_climinclude (void) const { return climinclude.current_value (); }
10481 
10482  bool is_xliminclude (void) const { return xliminclude.is_on (); }
10483  std::string get_xliminclude (void) const { return xliminclude.current_value (); }
10484 
10485  bool is_yliminclude (void) const { return yliminclude.is_on (); }
10486  std::string get_yliminclude (void) const { return yliminclude.current_value (); }
10487 
10488  bool is_zliminclude (void) const { return zliminclude.is_on (); }
10489  std::string get_zliminclude (void) const { return zliminclude.current_value (); }
10490 
10491 
10492  void set_displayname (const octave_value& val)
10493  {
10494  if (! error_state)
10495  {
10496  if (displayname.set (val, true))
10497  {
10498  mark_modified ();
10499  }
10500  }
10501  }
10502 
10503  void set_erasemode (const octave_value& val)
10504  {
10505  if (! error_state)
10506  {
10507  if (erasemode.set (val, true))
10508  {
10509  mark_modified ();
10510  }
10511  }
10512  }
10513 
10514  void set_alim (const octave_value& val)
10515  {
10516  if (! error_state)
10517  {
10518  if (alim.set (val, true))
10519  {
10520  mark_modified ();
10521  }
10522  }
10523  }
10524 
10525  void set_clim (const octave_value& val)
10526  {
10527  if (! error_state)
10528  {
10529  if (clim.set (val, true))
10530  {
10531  mark_modified ();
10532  }
10533  }
10534  }
10535 
10536  void set_xlim (const octave_value& val)
10537  {
10538  if (! error_state)
10539  {
10540  if (xlim.set (val, true))
10541  {
10542  mark_modified ();
10543  }
10544  }
10545  }
10546 
10547  void set_ylim (const octave_value& val)
10548  {
10549  if (! error_state)
10550  {
10551  if (ylim.set (val, true))
10552  {
10553  mark_modified ();
10554  }
10555  }
10556  }
10557 
10558  void set_zlim (const octave_value& val)
10559  {
10560  if (! error_state)
10561  {
10562  if (zlim.set (val, true))
10563  {
10564  mark_modified ();
10565  }
10566  }
10567  }
10568 
10569  void set_aliminclude (const octave_value& val)
10570  {
10571  if (! error_state)
10572  {
10573  if (aliminclude.set (val, true))
10574  {
10575  mark_modified ();
10576  }
10577  }
10578  }
10579 
10580  void set_climinclude (const octave_value& val)
10581  {
10582  if (! error_state)
10583  {
10584  if (climinclude.set (val, true))
10585  {
10586  mark_modified ();
10587  }
10588  }
10589  }
10590 
10591  void set_xliminclude (const octave_value& val)
10592  {
10593  if (! error_state)
10594  {
10595  if (xliminclude.set (val, true))
10596  {
10597  mark_modified ();
10598  }
10599  }
10600  }
10601 
10602  void set_yliminclude (const octave_value& val)
10603  {
10604  if (! error_state)
10605  {
10606  if (yliminclude.set (val, true))
10607  {
10608  mark_modified ();
10609  }
10610  }
10611  }
10612 
10613  void set_zliminclude (const octave_value& val)
10614  {
10615  if (! error_state)
10616  {
10617  if (zliminclude.set (val, true))
10618  {
10619  mark_modified ();
10620  }
10621  }
10622  }
10623 
10624 
10625  private:
10626  void update_limits (void) const;
10627 
10628  void update_limits (const graphics_handle& h) const;
10629 
10630  protected:
10631  void init (void)
10632  { }
10633 
10634  };
10635 
10636 private:
10638 
10639 public:
10641  : base_graphics_object (), xproperties (mh, p)
10642  {
10643  xproperties.override_defaults (*this);
10644  }
10645 
10646  ~hggroup (void) { }
10647 
10648  base_properties& get_properties (void) { return xproperties; }
10649 
10650  const base_properties& get_properties (void) const { return xproperties; }
10651 
10652  bool valid_object (void) const { return true; }
10653 
10654  void update_axis_limits (const std::string& axis_type);
10655 
10656  void update_axis_limits (const std::string& axis_type,
10657  const graphics_handle& h);
10658 
10659 };
10660 
10661 // ---------------------------------------------------------------------
10662 
10664 {
10665 public:
10667  {
10668  public:
10669  void remove_child (const graphics_handle& h)
10670  {
10672  }
10673 
10674  void adopt (const graphics_handle& h)
10675  {
10677  }
10678 
10679  // See the genprops.awk script for an explanation of the
10680  // properties declarations.
10681  // Programming note: Keep property list sorted if new ones are added.
10682 
10683 public:
10684  properties (const graphics_handle& mh, const graphics_handle& p);
10685 
10686  ~properties (void) { }
10687 
10688  void set (const caseless_str& pname, const octave_value& val);
10689 
10690  octave_value get (bool all = false) const;
10691 
10692  octave_value get (const caseless_str& pname) const;
10693 
10694  octave_value get (const std::string& pname) const
10695  {
10696  return get (caseless_str (pname));
10697  }
10698 
10699  octave_value get (const char *pname) const
10700  {
10701  return get (caseless_str (pname));
10702  }
10703 
10704  property get_property (const caseless_str& pname);
10705 
10706  std::string graphics_object_name (void) const { return go_name; }
10707 
10708  static property_list::pval_map_type factory_defaults (void);
10709 
10710 private:
10711  static std::string go_name;
10712 
10713 public:
10714 
10715 
10716  static std::set<std::string> core_property_names (void);
10717 
10718  static bool has_core_property (const caseless_str& pname);
10719 
10720  std::set<std::string> all_property_names (void) const;
10721 
10722  bool has_property (const caseless_str& pname) const;
10723 
10724 private:
10725 
10736 
10737 public:
10738 
10739  enum
10740  {
10741  ID___OBJECT__ = 10000,
10742  ID_ACCELERATOR = 10001,
10743  ID_CALLBACK = 10002,
10744  ID_CHECKED = 10003,
10745  ID_ENABLE = 10004,
10746  ID_FOREGROUNDCOLOR = 10005,
10747  ID_LABEL = 10006,
10748  ID_POSITION = 10007,
10749  ID_SEPARATOR = 10008,
10750  ID_FLTK_LABEL = 10009
10751  };
10752 
10753  octave_value get___object__ (void) const { return __object__.get (); }
10754 
10755  std::string get_accelerator (void) const { return accelerator.string_value (); }
10756 
10757  void execute_callback (const octave_value& data = octave_value ()) const { callback.execute (data); }
10758  octave_value get_callback (void) const { return callback.get (); }
10759 
10760  bool is_checked (void) const { return checked.is_on (); }
10761  std::string get_checked (void) const { return checked.current_value (); }
10762 
10763  bool is_enable (void) const { return enable.is_on (); }
10764  std::string get_enable (void) const { return enable.current_value (); }
10765 
10766  bool foregroundcolor_is_rgb (void) const { return foregroundcolor.is_rgb (); }
10767  bool foregroundcolor_is (const std::string& v) const { return foregroundcolor.is (v); }
10768  Matrix get_foregroundcolor_rgb (void) const { return (foregroundcolor.is_rgb () ? foregroundcolor.rgb () : Matrix ()); }
10769  octave_value get_foregroundcolor (void) const { return foregroundcolor.get (); }
10770 
10771  std::string get_label (void) const { return label.string_value (); }
10772 
10773  double get_position (void) const { return position.double_value (); }
10774 
10775  bool is_separator (void) const { return separator.is_on (); }
10776  std::string get_separator (void) const { return separator.current_value (); }
10777 
10778  std::string get_fltk_label (void) const { return fltk_label.string_value (); }
10779 
10780 
10781  void set___object__ (const octave_value& val)
10782  {
10783  if (! error_state)
10784  {
10785  if (__object__.set (val, true))
10786  {
10787  mark_modified ();
10788  }
10789  }
10790  }
10791 
10792  void set_accelerator (const octave_value& val)
10793  {
10794  if (! error_state)
10795  {
10796  if (accelerator.set (val, true))
10797  {
10798  mark_modified ();
10799  }
10800  }
10801  }
10802 
10803  void set_callback (const octave_value& val)
10804  {
10805  if (! error_state)
10806  {
10807  if (callback.set (val, true))
10808  {
10809  mark_modified ();
10810  }
10811  }
10812  }
10813 
10814  void set_checked (const octave_value& val)
10815  {
10816  if (! error_state)
10817  {
10818  if (checked.set (val, true))
10819  {
10820  mark_modified ();
10821  }
10822  }
10823  }
10824 
10825  void set_enable (const octave_value& val)
10826  {
10827  if (! error_state)
10828  {
10829  if (enable.set (val, true))
10830  {
10831  mark_modified ();
10832  }
10833  }
10834  }
10835 
10836  void set_foregroundcolor (const octave_value& val)
10837  {
10838  if (! error_state)
10839  {
10840  if (foregroundcolor.set (val, true))
10841  {
10842  mark_modified ();
10843  }
10844  }
10845  }
10846 
10847  void set_label (const octave_value& val)
10848  {
10849  if (! error_state)
10850  {
10851  if (label.set (val, true))
10852  {
10853  mark_modified ();
10854  }
10855  }
10856  }
10857 
10858  void set_position (const octave_value& val)
10859  {
10860  if (! error_state)
10861  {
10862  if (position.set (val, true))
10863  {
10864  mark_modified ();
10865  }
10866  }
10867  }
10868 
10869  void set_separator (const octave_value& val)
10870  {
10871  if (! error_state)
10872  {
10873  if (separator.set (val, true))
10874  {
10875  mark_modified ();
10876  }
10877  }
10878  }
10879 
10880  void set_fltk_label (const octave_value& val)
10881  {
10882  if (! error_state)
10883  {
10884  if (fltk_label.set (val, true))
10885  {
10886  mark_modified ();
10887  }
10888  }
10889  }
10890 
10891 
10892  protected:
10893  void init (void)
10894  { }
10895  };
10896 
10897 private:
10899 
10900 public:
10902  : base_graphics_object (), xproperties (mh, p)
10903  {
10904  xproperties.override_defaults (*this);
10905  }
10906 
10907  ~uimenu (void) { }
10908 
10909  base_properties& get_properties (void) { return xproperties; }
10910 
10911  const base_properties& get_properties (void) const { return xproperties; }
10912 
10913  bool valid_object (void) const { return true; }
10914 
10915 };
10916 
10917 // ---------------------------------------------------------------------
10918 
10920 {
10921 public:
10923  {
10924  public:
10925  // See the genprops.awk script for an explanation of the
10926  // properties declarations.
10927  // Programming note: Keep property list sorted if new ones are added.
10928 
10929 public:
10930  properties (const graphics_handle& mh, const graphics_handle& p);
10931 
10932  ~properties (void) { }
10933 
10934  void set (const caseless_str& pname, const octave_value& val);
10935 
10936  octave_value get (bool all = false) const;
10937 
10938  octave_value get (const caseless_str& pname) const;
10939 
10940  octave_value get (const std::string& pname) const
10941  {
10942  return get (caseless_str (pname));
10943  }
10944 
10945  octave_value get (const char *pname) const
10946  {
10947  return get (caseless_str (pname));
10948  }
10949 
10950  property get_property (const caseless_str& pname);
10951 
10952  std::string graphics_object_name (void) const { return go_name; }
10953 
10954  static property_list::pval_map_type factory_defaults (void);
10955 
10956 private:
10957  static std::string go_name;
10958 
10959 public:
10960 
10961 
10962  static std::set<std::string> core_property_names (void);
10963 
10964  static bool has_core_property (const caseless_str& pname);
10965 
10966  std::set<std::string> all_property_names (void) const;
10967 
10968  bool has_property (const caseless_str& pname) const;
10969 
10970 private:
10971 
10975 
10976 public:
10977 
10978  enum
10979  {
10980  ID___OBJECT__ = 11000,
10981  ID_CALLBACK = 11001,
10982  ID_POSITION = 11002
10983  };
10984 
10985  octave_value get___object__ (void) const { return __object__.get (); }
10986 
10987  void execute_callback (const octave_value& data = octave_value ()) const { callback.execute (data); }
10988  octave_value get_callback (void) const { return callback.get (); }
10989 
10990  octave_value get_position (void) const { return position.get (); }
10991 
10992 
10993  void set___object__ (const octave_value& val)
10994  {
10995  if (! error_state)
10996  {
10997  if (__object__.set (val, true))
10998  {
10999  mark_modified ();
11000  }
11001  }
11002  }
11003 
11004  void set_callback (const octave_value& val)
11005  {
11006  if (! error_state)
11007  {
11008  if (callback.set (val, true))
11009  {
11010  mark_modified ();
11011  }
11012  }
11013  }
11014 
11015  void set_position (const octave_value& val)
11016  {
11017  if (! error_state)
11018  {
11019  if (position.set (val, true))
11020  {
11021  mark_modified ();
11022  }
11023  }
11024  }
11025 
11026 
11027  protected:
11028  void init (void)
11029  {
11030  position.add_constraint (dim_vector (1, 2));
11031  position.add_constraint (dim_vector (2, 1));
11032  visible.set (octave_value (true));
11033  }
11034  };
11035 
11036 private:
11038 
11039 public:
11041  : base_graphics_object (), xproperties (mh, p)
11042  {
11043  xproperties.override_defaults (*this);
11044  }
11045 
11046  ~uicontextmenu (void) { }
11047 
11048  base_properties& get_properties (void) { return xproperties; }
11049 
11050  const base_properties& get_properties (void) const { return xproperties; }
11051 
11052  bool valid_object (void) const { return true; }
11053 
11054 };
11055 
11056 // ---------------------------------------------------------------------
11057 
11059 {
11060 public:
11062  {
11063  public:
11064  Matrix get_boundingbox (bool internal = false,
11065  const Matrix& parent_pix_size = Matrix ()) const;
11066 
11067  double get_fontsize_points (double box_pix_height = 0) const;
11068 
11069  // See the genprops.awk script for an explanation of the
11070  // properties declarations.
11071  // Programming note: Keep property list sorted if new ones are added.
11072 
11073 public:
11074  properties (const graphics_handle& mh, const graphics_handle& p);
11075 
11076  ~properties (void) { }
11077 
11078  void set (const caseless_str& pname, const octave_value& val);
11079 
11080  octave_value get (bool all = false) const;
11081 
11082  octave_value get (const caseless_str& pname) const;
11083 
11084  octave_value get (const std::string& pname) const
11085  {
11086  return get (caseless_str (pname));
11087  }
11088 
11089  octave_value get (const char *pname) const
11090  {
11091  return get (caseless_str (pname));
11092  }
11093 
11094  property get_property (const caseless_str& pname);
11095 
11096  std::string graphics_object_name (void) const { return go_name; }
11097 
11098  static property_list::pval_map_type factory_defaults (void);
11099 
11100 private:
11101  static std::string go_name;
11102 
11103 public:
11104 
11105 
11106  static std::set<std::string> core_property_names (void);
11107 
11108  static bool has_core_property (const caseless_str& pname);
11109 
11110  std::set<std::string> all_property_names (void) const;
11111 
11112  bool has_property (const caseless_str& pname) const;
11113 
11114 private:
11115 
11142 
11143 public:
11144 
11145  enum
11146  {
11147  ID___OBJECT__ = 12000,
11148  ID_BACKGROUNDCOLOR = 12001,
11149  ID_CALLBACK = 12002,
11150  ID_CDATA = 12003,
11151  ID_CLIPPING = 12004,
11152  ID_ENABLE = 12005,
11153  ID_EXTENT = 12006,
11154  ID_FONTANGLE = 12007,
11155  ID_FONTNAME = 12008,
11156  ID_FONTSIZE = 12009,
11157  ID_FONTUNITS = 12010,
11158  ID_FONTWEIGHT = 12011,
11159  ID_FOREGROUNDCOLOR = 12012,
11160  ID_HORIZONTALALIGNMENT = 12013,
11161  ID_KEYPRESSFCN = 12014,
11162  ID_LISTBOXTOP = 12015,
11163  ID_MAX = 12016,
11164  ID_MIN = 12017,
11165  ID_POSITION = 12018,
11166  ID_SLIDERSTEP = 12019,
11167  ID_STRING = 12020,
11168  ID_STYLE = 12021,
11169  ID_TOOLTIPSTRING = 12022,
11170  ID_UNITS = 12023,
11171  ID_VALUE = 12024,
11172  ID_VERTICALALIGNMENT = 12025
11173  };
11174 
11175  octave_value get___object__ (void) const { return __object__.get (); }
11176 
11177  bool backgroundcolor_is_rgb (void) const { return backgroundcolor.is_rgb (); }
11178  bool backgroundcolor_is (const std::string& v) const { return backgroundcolor.is (v); }
11179  Matrix get_backgroundcolor_rgb (void) const { return (backgroundcolor.is_rgb () ? backgroundcolor.rgb () : Matrix ()); }
11180  octave_value get_backgroundcolor (void) const { return backgroundcolor.get (); }
11181 
11182  void execute_callback (const octave_value& data = octave_value ()) const { callback.execute (data); }
11183  octave_value get_callback (void) const { return callback.get (); }
11184 
11185  octave_value get_cdata (void) const { return cdata.get (); }
11186 
11187  bool is_clipping (void) const { return clipping.is_on (); }
11188  std::string get_clipping (void) const { return clipping.current_value (); }
11189 
11190  bool enable_is (const std::string& v) const { return enable.is (v); }
11191  std::string get_enable (void) const { return enable.current_value (); }
11192 
11193  octave_value get_extent (void) const;
11194 
11195  bool fontangle_is (const std::string& v) const { return fontangle.is (v); }
11196  std::string get_fontangle (void) const { return fontangle.current_value (); }
11197 
11198  std::string get_fontname (void) const { return fontname.string_value (); }
11199 
11200  double get_fontsize (void) const { return fontsize.double_value (); }
11201 
11202  bool fontunits_is (const std::string& v) const { return fontunits.is (v); }
11203  std::string get_fontunits (void) const { return fontunits.current_value (); }
11204 
11205  bool fontweight_is (const std::string& v) const { return fontweight.is (v); }
11206  std::string get_fontweight (void) const { return fontweight.current_value (); }
11207 
11208  bool foregroundcolor_is_rgb (void) const { return foregroundcolor.is_rgb (); }
11209  bool foregroundcolor_is (const std::string& v) const { return foregroundcolor.is (v); }
11210  Matrix get_foregroundcolor_rgb (void) const { return (foregroundcolor.is_rgb () ? foregroundcolor.rgb () : Matrix ()); }
11211  octave_value get_foregroundcolor (void) const { return foregroundcolor.get (); }
11212 
11213  bool horizontalalignment_is (const std::string& v) const { return horizontalalignment.is (v); }
11214  std::string get_horizontalalignment (void) const { return horizontalalignment.current_value (); }
11215 
11216  void execute_keypressfcn (const octave_value& data = octave_value ()) const { keypressfcn.execute (data); }
11217  octave_value get_keypressfcn (void) const { return keypressfcn.get (); }
11218 
11219  double get_listboxtop (void) const { return listboxtop.double_value (); }
11220 
11221  double get_max (void) const { return max.double_value (); }
11222 
11223  double get_min (void) const { return min.double_value (); }
11224 
11225  octave_value get_position (void) const { return position.get (); }
11226 
11227  octave_value get_sliderstep (void) const { return sliderstep.get (); }
11228 
11229  std::string get_string_string (void) const { return string.string_value (); }
11230  string_vector get_string_vector (void) const { return string.string_vector_value (); }
11231  octave_value get_string (void) const { return string.get (); }
11232 
11233  bool style_is (const std::string& v) const { return style.is (v); }
11234  std::string get_style (void) const { return style.current_value (); }
11235 
11236  std::string get_tooltipstring (void) const { return tooltipstring.string_value (); }
11237 
11238  bool units_is (const std::string& v) const { return units.is (v); }
11239  std::string get_units (void) const { return units.current_value (); }
11240 
11241  octave_value get_value (void) const { return value.get (); }
11242 
11243  bool verticalalignment_is (const std::string& v) const { return verticalalignment.is (v); }
11244  std::string get_verticalalignment (void) const { return verticalalignment.current_value (); }
11245 
11246 
11247  void set___object__ (const octave_value& val)
11248  {
11249  if (! error_state)
11250  {
11251  if (__object__.set (val, true))
11252  {
11253  mark_modified ();
11254  }
11255  }
11256  }
11257 
11258  void set_backgroundcolor (const octave_value& val)
11259  {
11260  if (! error_state)
11261  {
11262  if (backgroundcolor.set (val, true))
11263  {
11264  mark_modified ();
11265  }
11266  }
11267  }
11268 
11269  void set_callback (const octave_value& val)
11270  {
11271  if (! error_state)
11272  {
11273  if (callback.set (val, true))
11274  {
11275  mark_modified ();
11276  }
11277  }
11278  }
11279 
11280  void set_cdata (const octave_value& val)
11281  {
11282  if (! error_state)
11283  {
11284  if (cdata.set (val, true))
11285  {
11286  mark_modified ();
11287  }
11288  }
11289  }
11290 
11291  void set_clipping (const octave_value& val)
11292  {
11293  if (! error_state)
11294  {
11295  if (clipping.set (val, true))
11296  {
11297  mark_modified ();
11298  }
11299  }
11300  }
11301 
11302  void set_enable (const octave_value& val)
11303  {
11304  if (! error_state)
11305  {
11306  if (enable.set (val, true))
11307  {
11308  mark_modified ();
11309  }
11310  }
11311  }
11312 
11313  void set_extent (const octave_value& val)
11314  {
11315  if (! error_state)
11316  {
11317  if (extent.set (val, true))
11318  {
11319  mark_modified ();
11320  }
11321  }
11322  }
11323 
11324  void set_fontangle (const octave_value& val)
11325  {
11326  if (! error_state)
11327  {
11328  if (fontangle.set (val, true))
11329  {
11330  update_fontangle ();
11331  mark_modified ();
11332  }
11333  }
11334  }
11335 
11336  void set_fontname (const octave_value& val)
11337  {
11338  if (! error_state)
11339  {
11340  if (fontname.set (val, true))
11341  {
11342  update_fontname ();
11343  mark_modified ();
11344  }
11345  }
11346  }
11347 
11348  void set_fontsize (const octave_value& val)
11349  {
11350  if (! error_state)
11351  {
11352  if (fontsize.set (val, true))
11353  {
11354  update_fontsize ();
11355  mark_modified ();
11356  }
11357  }
11358  }
11359 
11360  void set_fontunits (const octave_value& val);
11361 
11362  void set_fontweight (const octave_value& val)
11363  {
11364  if (! error_state)
11365  {
11366  if (fontweight.set (val, true))
11367  {
11368  update_fontweight ();
11369  mark_modified ();
11370  }
11371  }
11372  }
11373 
11374  void set_foregroundcolor (const octave_value& val)
11375  {
11376  if (! error_state)
11377  {
11378  if (foregroundcolor.set (val, true))
11379  {
11380  mark_modified ();
11381  }
11382  }
11383  }
11384 
11385  void set_horizontalalignment (const octave_value& val)
11386  {
11387  if (! error_state)
11388  {
11389  if (horizontalalignment.set (val, true))
11390  {
11391  mark_modified ();
11392  }
11393  }
11394  }
11395 
11396  void set_keypressfcn (const octave_value& val)
11397  {
11398  if (! error_state)
11399  {
11400  if (keypressfcn.set (val, true))
11401  {
11402  mark_modified ();
11403  }
11404  }
11405  }
11406 
11407  void set_listboxtop (const octave_value& val)
11408  {
11409  if (! error_state)
11410  {
11411  if (listboxtop.set (val, true))
11412  {
11413  mark_modified ();
11414  }
11415  }
11416  }
11417 
11418  void set_max (const octave_value& val)
11419  {
11420  if (! error_state)
11421  {
11422  if (max.set (val, true))
11423  {
11424  mark_modified ();
11425  }
11426  }
11427  }
11428 
11429  void set_min (const octave_value& val)
11430  {
11431  if (! error_state)
11432  {
11433  if (min.set (val, true))
11434  {
11435  mark_modified ();
11436  }
11437  }
11438  }
11439 
11440  void set_position (const octave_value& val)
11441  {
11442  if (! error_state)
11443  {
11444  if (position.set (val, true))
11445  {
11446  mark_modified ();
11447  }
11448  }
11449  }
11450 
11451  void set_sliderstep (const octave_value& val)
11452  {
11453  if (! error_state)
11454  {
11455  if (sliderstep.set (val, true))
11456  {
11457  mark_modified ();
11458  }
11459  }
11460  }
11461 
11462  void set_string (const octave_value& val)
11463  {
11464  if (! error_state)
11465  {
11466  if (string.set (val, true))
11467  {
11468  update_string ();
11469  mark_modified ();
11470  }
11471  }
11472  }
11473 
11474  void set_style (const octave_value& val);
11475 
11476  void set_tooltipstring (const octave_value& val)
11477  {
11478  if (! error_state)
11479  {
11480  if (tooltipstring.set (val, true))
11481  {
11482  mark_modified ();
11483  }
11484  }
11485  }
11486 
11487  void set_units (const octave_value& val)
11488  {
11489  if (! error_state)
11490  {
11491  if (units.set (val, true))
11492  {
11493  update_units ();
11494  mark_modified ();
11495  }
11496  }
11497  }
11498 
11499  void set_value (const octave_value& val)
11500  {
11501  if (! error_state)
11502  {
11503  if (value.set (val, true))
11504  {
11505  mark_modified ();
11506  }
11507  }
11508  }
11509 
11510  void set_verticalalignment (const octave_value& val)
11511  {
11512  if (! error_state)
11513  {
11514  if (verticalalignment.set (val, true))
11515  {
11516  mark_modified ();
11517  }
11518  }
11519  }
11520 
11521 
11522  private:
11523  std::string cached_units;
11524 
11525  protected:
11526  void init (void)
11527  {
11528  cdata.add_constraint ("double");
11529  cdata.add_constraint ("single");
11530  cdata.add_constraint (dim_vector (-1, -1, 3));
11531  position.add_constraint (dim_vector (1, 4));
11532  sliderstep.add_constraint (dim_vector (1, 2));
11533  cached_units = get_units ();
11534  }
11535 
11536  void update_text_extent (void);
11537 
11538  void update_string (void) { update_text_extent (); }
11539  void update_fontname (void) { update_text_extent (); }
11540  void update_fontsize (void) { update_text_extent (); }
11541  void update_fontangle (void) { update_text_extent (); }
11542  void update_fontweight (void) { update_text_extent (); }
11543  void update_fontunits (const caseless_str& old_units);
11544 
11545  void update_units (void);
11546 
11547  };
11548 
11549 private:
11551 
11552 public:
11554  : base_graphics_object (), xproperties (mh, p)
11555  {
11556  xproperties.override_defaults (*this);
11557  }
11558 
11559  ~uicontrol (void) { }
11560 
11561  base_properties& get_properties (void) { return xproperties; }
11562 
11563  const base_properties& get_properties (void) const { return xproperties; }
11564 
11565  bool valid_object (void) const { return true; }
11566 };
11567 
11568 // ---------------------------------------------------------------------
11569 
11571 {
11572 public:
11574  {
11575  public:
11576  Matrix get_boundingbox (bool internal = false,
11577  const Matrix& parent_pix_size = Matrix ()) const;
11578 
11579  double get_fontsize_points (double box_pix_height = 0) const;
11580 
11581  // See the genprops.awk script for an explanation of the
11582  // properties declarations.
11583  // Programming note: Keep property list sorted if new ones are added.
11584 
11585 public:
11586  properties (const graphics_handle& mh, const graphics_handle& p);
11587 
11588  ~properties (void) { }
11589 
11590  void set (const caseless_str& pname, const octave_value& val);
11591 
11592  octave_value get (bool all = false) const;
11593 
11594  octave_value get (const caseless_str& pname) const;
11595 
11596  octave_value get (const std::string& pname) const
11597  {
11598  return get (caseless_str (pname));
11599  }
11600 
11601  octave_value get (const char *pname) const
11602  {
11603  return get (caseless_str (pname));
11604  }
11605 
11606  property get_property (const caseless_str& pname);
11607 
11608  std::string graphics_object_name (void) const { return go_name; }
11609 
11610  static property_list::pval_map_type factory_defaults (void);
11611 
11612 private:
11613  static std::string go_name;
11614 
11615 public:
11616 
11617 
11618  static std::set<std::string> core_property_names (void);
11619 
11620  static bool has_core_property (const caseless_str& pname);
11621 
11622  std::set<std::string> all_property_names (void) const;
11623 
11624  bool has_property (const caseless_str& pname) const;
11625 
11626 private:
11627 
11645 
11646 public:
11647 
11648  enum
11649  {
11650  ID___OBJECT__ = 13000,
11651  ID_BACKGROUNDCOLOR = 13001,
11652  ID_BORDERTYPE = 13002,
11653  ID_BORDERWIDTH = 13003,
11654  ID_FONTANGLE = 13004,
11655  ID_FONTNAME = 13005,
11656  ID_FONTSIZE = 13006,
11657  ID_FONTUNITS = 13007,
11658  ID_FONTWEIGHT = 13008,
11659  ID_FOREGROUNDCOLOR = 13009,
11660  ID_HIGHLIGHTCOLOR = 13010,
11661  ID_POSITION = 13011,
11662  ID_RESIZEFCN = 13012,
11663  ID_SHADOWCOLOR = 13013,
11664  ID_TITLE = 13014,
11665  ID_TITLEPOSITION = 13015,
11666  ID_UNITS = 13016
11667  };
11668 
11669  octave_value get___object__ (void) const { return __object__.get (); }
11670 
11671  bool backgroundcolor_is_rgb (void) const { return backgroundcolor.is_rgb (); }
11672  bool backgroundcolor_is (const std::string& v) const { return backgroundcolor.is (v); }
11673  Matrix get_backgroundcolor_rgb (void) const { return (backgroundcolor.is_rgb () ? backgroundcolor.rgb () : Matrix ()); }
11674  octave_value get_backgroundcolor (void) const { return backgroundcolor.get (); }
11675 
11676  bool bordertype_is (const std::string& v) const { return bordertype.is (v); }
11677  std::string get_bordertype (void) const { return bordertype.current_value (); }
11678 
11679  double get_borderwidth (void) const { return borderwidth.double_value (); }
11680 
11681  bool fontangle_is (const std::string& v) const { return fontangle.is (v); }
11682  std::string get_fontangle (void) const { return fontangle.current_value (); }
11683 
11684  std::string get_fontname (void) const { return fontname.string_value (); }
11685 
11686  double get_fontsize (void) const { return fontsize.double_value (); }
11687 
11688  bool fontunits_is (const std::string& v) const { return fontunits.is (v); }
11689  std::string get_fontunits (void) const { return fontunits.current_value (); }
11690 
11691  bool fontweight_is (const std::string& v) const { return fontweight.is (v); }
11692  std::string get_fontweight (void) const { return fontweight.current_value (); }
11693 
11694  bool foregroundcolor_is_rgb (void) const { return foregroundcolor.is_rgb (); }
11695  bool foregroundcolor_is (const std::string& v) const { return foregroundcolor.is (v); }
11696  Matrix get_foregroundcolor_rgb (void) const { return (foregroundcolor.is_rgb () ? foregroundcolor.rgb () : Matrix ()); }
11697  octave_value get_foregroundcolor (void) const { return foregroundcolor.get (); }
11698 
11699  bool highlightcolor_is_rgb (void) const { return highlightcolor.is_rgb (); }
11700  bool highlightcolor_is (const std::string& v) const { return highlightcolor.is (v); }
11701  Matrix get_highlightcolor_rgb (void) const { return (highlightcolor.is_rgb () ? highlightcolor.rgb () : Matrix ()); }
11702  octave_value get_highlightcolor (void) const { return highlightcolor.get (); }
11703 
11704  octave_value get_position (void) const { return position.get (); }
11705 
11706  void execute_resizefcn (const octave_value& data = octave_value ()) const { resizefcn.execute (data); }
11707  octave_value get_resizefcn (void) const { return resizefcn.get (); }
11708 
11709  bool shadowcolor_is_rgb (void) const { return shadowcolor.is_rgb (); }
11710  bool shadowcolor_is (const std::string& v) const { return shadowcolor.is (v); }
11711  Matrix get_shadowcolor_rgb (void) const { return (shadowcolor.is_rgb () ? shadowcolor.rgb () : Matrix ()); }
11712  octave_value get_shadowcolor (void) const { return shadowcolor.get (); }
11713 
11714  std::string get_title (void) const { return title.string_value (); }
11715 
11716  bool titleposition_is (const std::string& v) const { return titleposition.is (v); }
11717  std::string get_titleposition (void) const { return titleposition.current_value (); }
11718 
11719  bool units_is (const std::string& v) const { return units.is (v); }
11720  std::string get_units (void) const { return units.current_value (); }
11721 
11722 
11723  void set___object__ (const octave_value& val)
11724  {
11725  if (! error_state)
11726  {
11727  if (__object__.set (val, true))
11728  {
11729  mark_modified ();
11730  }
11731  }
11732  }
11733 
11734  void set_backgroundcolor (const octave_value& val)
11735  {
11736  if (! error_state)
11737  {
11738  if (backgroundcolor.set (val, true))
11739  {
11740  mark_modified ();
11741  }
11742  }
11743  }
11744 
11745  void set_bordertype (const octave_value& val)
11746  {
11747  if (! error_state)
11748  {
11749  if (bordertype.set (val, true))
11750  {
11751  mark_modified ();
11752  }
11753  }
11754  }
11755 
11756  void set_borderwidth (const octave_value& val)
11757  {
11758  if (! error_state)
11759  {
11760  if (borderwidth.set (val, true))
11761  {
11762  mark_modified ();
11763  }
11764  }
11765  }
11766 
11767  void set_fontangle (const octave_value& val)
11768  {
11769  if (! error_state)
11770  {
11771  if (fontangle.set (val, true))
11772  {
11773  mark_modified ();
11774  }
11775  }
11776  }
11777 
11778  void set_fontname (const octave_value& val)
11779  {
11780  if (! error_state)
11781  {
11782  if (fontname.set (val, true))
11783  {
11784  mark_modified ();
11785  }
11786  }
11787  }
11788 
11789  void set_fontsize (const octave_value& val)
11790  {
11791  if (! error_state)
11792  {
11793  if (fontsize.set (val, true))
11794  {
11795  mark_modified ();
11796  }
11797  }
11798  }
11799 
11800  void set_fontunits (const octave_value& val);
11801 
11802  void set_fontweight (const octave_value& val)
11803  {
11804  if (! error_state)
11805  {
11806  if (fontweight.set (val, true))
11807  {
11808  mark_modified ();
11809  }
11810  }
11811  }
11812 
11813  void set_foregroundcolor (const octave_value& val)
11814  {
11815  if (! error_state)
11816  {
11817  if (foregroundcolor.set (val, true))
11818  {
11819  mark_modified ();
11820  }
11821  }
11822  }
11823 
11824  void set_highlightcolor (const octave_value& val)
11825  {
11826  if (! error_state)
11827  {
11828  if (highlightcolor.set (val, true))
11829  {
11830  mark_modified ();
11831  }
11832  }
11833  }
11834 
11835  void set_position (const octave_value& val)
11836  {
11837  if (! error_state)
11838  {
11839  if (position.set (val, true))
11840  {
11841  mark_modified ();
11842  }
11843  }
11844  }
11845 
11846  void set_resizefcn (const octave_value& val)
11847  {
11848  if (! error_state)
11849  {
11850  if (resizefcn.set (val, true))
11851  {
11852  mark_modified ();
11853  }
11854  }
11855  }
11856 
11857  void set_shadowcolor (const octave_value& val)
11858  {
11859  if (! error_state)
11860  {
11861  if (shadowcolor.set (val, true))
11862  {
11863  mark_modified ();
11864  }
11865  }
11866  }
11867 
11868  void set_title (const octave_value& val)
11869  {
11870  if (! error_state)
11871  {
11872  if (title.set (val, true))
11873  {
11874  mark_modified ();
11875  }
11876  }
11877  }
11878 
11879  void set_titleposition (const octave_value& val)
11880  {
11881  if (! error_state)
11882  {
11883  if (titleposition.set (val, true))
11884  {
11885  mark_modified ();
11886  }
11887  }
11888  }
11889 
11890  void set_units (const octave_value& val);
11891 
11892 
11893  protected:
11894  void init (void)
11895  {
11896  position.add_constraint (dim_vector (1, 4));
11897  }
11898 
11899  void update_units (const caseless_str& old_units);
11900  void update_fontunits (const caseless_str& old_units);
11901 
11902  };
11903 
11904 private:
11906 
11907 public:
11909  : base_graphics_object (), xproperties (mh, p)
11910  {
11911  xproperties.override_defaults (*this);
11912  }
11913 
11914  ~uipanel (void) { }
11915 
11916  base_properties& get_properties (void) { return xproperties; }
11917 
11918  const base_properties& get_properties (void) const { return xproperties; }
11919 
11920  bool valid_object (void) const { return true; }
11921 };
11922 
11923 // ---------------------------------------------------------------------
11924 
11926 {
11927 public:
11929  {
11930  public:
11931  // See the genprops.awk script for an explanation of the
11932  // properties declarations.
11933  // Programming note: Keep property list sorted if new ones are added.
11934 
11935 public:
11936  properties (const graphics_handle& mh, const graphics_handle& p);
11937 
11938  ~properties (void) { }
11939 
11940  void set (const caseless_str& pname, const octave_value& val);
11941 
11942  octave_value get (bool all = false) const;
11943 
11944  octave_value get (const caseless_str& pname) const;
11945 
11946  octave_value get (const std::string& pname) const
11947  {
11948  return get (caseless_str (pname));
11949  }
11950 
11951  octave_value get (const char *pname) const
11952  {
11953  return get (caseless_str (pname));
11954  }
11955 
11956  property get_property (const caseless_str& pname);
11957 
11958  std::string graphics_object_name (void) const { return go_name; }
11959 
11960  static property_list::pval_map_type factory_defaults (void);
11961 
11962 private:
11963  static std::string go_name;
11964 
11965 public:
11966 
11967 
11968  static std::set<std::string> core_property_names (void);
11969 
11970  static bool has_core_property (const caseless_str& pname);
11971 
11972  std::set<std::string> all_property_names (void) const;
11973 
11974  bool has_property (const caseless_str& pname) const;
11975 
11976 private:
11977 
11979 
11980 public:
11981 
11982  enum
11983  {
11984  ID___OBJECT__ = 14000
11985  };
11986 
11987  octave_value get___object__ (void) const { return __object__.get (); }
11988 
11989 
11990  void set___object__ (const octave_value& val)
11991  {
11992  if (! error_state)
11993  {
11994  if (__object__.set (val, true))
11995  {
11996  mark_modified ();
11997  }
11998  }
11999  }
12000 
12001 
12002  protected:
12003  void init (void)
12004  { }
12005  };
12006 
12007 private:
12009 
12010 public:
12012  : base_graphics_object (), xproperties (mh, p), default_properties ()
12013  {
12014  xproperties.override_defaults (*this);
12015  }
12016 
12017  ~uitoolbar (void) { }
12018 
12020  {
12021  // Allow parent (figure) to override first (properties knows how
12022  // to find the parent object).
12023  xproperties.override_defaults (obj);
12024 
12025  // Now override with our defaults. If the default_properties
12026  // list includes the properties for all defaults (line,
12027  // surface, etc.) then we don't have to know the type of OBJ
12028  // here, we just call its set function and let it decide which
12029  // properties from the list to use.
12030  obj.set_from_list (default_properties);
12031  }
12032 
12033  void set (const caseless_str& name, const octave_value& value)
12034  {
12035  if (name.compare ("default", 7))
12036  // strip "default", pass rest to function that will
12037  // parse the remainder and add the element to the
12038  // default_properties map.
12039  default_properties.set (name.substr (7), value);
12040  else
12041  xproperties.set (name, value);
12042  }
12043 
12044  octave_value get (const caseless_str& name) const
12045  {
12046  octave_value retval;
12047 
12048  if (name.compare ("default", 7))
12049  retval = get_default (name.substr (7));
12050  else
12051  retval = xproperties.get (name);
12052 
12053  return retval;
12054  }
12055 
12056  octave_value get_default (const caseless_str& name) const;
12057 
12058  octave_value get_defaults (void) const
12059  {
12060  return default_properties.as_struct ("default");
12061  }
12062 
12063  base_properties& get_properties (void) { return xproperties; }
12064 
12065  const base_properties& get_properties (void) const { return xproperties; }
12066 
12067  bool valid_object (void) const { return true; }
12068 
12069  void reset_default_properties (void);
12070 
12071 private:
12073 };
12074 
12075 // ---------------------------------------------------------------------
12076 
12078 {
12079 public:
12081  {
12082  public:
12083  // See the genprops.awk script for an explanation of the
12084  // properties declarations.
12085  // Programming note: Keep property list sorted if new ones are added.
12086 
12087 public:
12088  properties (const graphics_handle& mh, const graphics_handle& p);
12089 
12090  ~properties (void) { }
12091 
12092  void set (const caseless_str& pname, const octave_value& val);
12093 
12094  octave_value get (bool all = false) const;
12095 
12096  octave_value get (const caseless_str& pname) const;
12097 
12098  octave_value get (const std::string& pname) const
12099  {
12100  return get (caseless_str (pname));
12101  }
12102 
12103  octave_value get (const char *pname) const
12104  {
12105  return get (caseless_str (pname));
12106  }
12107 
12108  property get_property (const caseless_str& pname);
12109 
12110  std::string graphics_object_name (void) const { return go_name; }
12111 
12112  static property_list::pval_map_type factory_defaults (void);
12113 
12114 private:
12115  static std::string go_name;
12116 
12117 public:
12118 
12119 
12120  static std::set<std::string> core_property_names (void);
12121 
12122  static bool has_core_property (const caseless_str& pname);
12123 
12124  std::set<std::string> all_property_names (void) const;
12125 
12126  bool has_property (const caseless_str& pname) const;
12127 
12128 private:
12129 
12136 
12137 public:
12138 
12139  enum
12140  {
12141  ID___OBJECT__ = 15000,
12142  ID_CDATA = 15001,
12143  ID_CLICKEDCALLBACK = 15002,
12144  ID_ENABLE = 15003,
12145  ID_SEPARATOR = 15004,
12146  ID_TOOLTIPSTRING = 15005
12147  };
12148 
12149  octave_value get___object__ (void) const { return __object__.get (); }
12150 
12151  octave_value get_cdata (void) const { return cdata.get (); }
12152 
12153  void execute_clickedcallback (const octave_value& data = octave_value ()) const { clickedcallback.execute (data); }
12154  octave_value get_clickedcallback (void) const { return clickedcallback.get (); }
12155 
12156  bool is_enable (void) const { return enable.is_on (); }
12157  std::string get_enable (void) const { return enable.current_value (); }
12158 
12159  bool is_separator (void) const { return separator.is_on (); }
12160  std::string get_separator (void) const { return separator.current_value (); }
12161 
12162  std::string get_tooltipstring (void) const { return tooltipstring.string_value (); }
12163 
12164 
12165  void set___object__ (const octave_value& val)
12166  {
12167  if (! error_state)
12168  {
12169  if (__object__.set (val, true))
12170  {
12171  mark_modified ();
12172  }
12173  }
12174  }
12175 
12176  void set_cdata (const octave_value& val)
12177  {
12178  if (! error_state)
12179  {
12180  if (cdata.set (val, true))
12181  {
12182  mark_modified ();
12183  }
12184  }
12185  }
12186 
12187  void set_clickedcallback (const octave_value& val)
12188  {
12189  if (! error_state)
12190  {
12191  if (clickedcallback.set (val, true))
12192  {
12193  mark_modified ();
12194  }
12195  }
12196  }
12197 
12198  void set_enable (const octave_value& val)
12199  {
12200  if (! error_state)
12201  {
12202  if (enable.set (val, true))
12203  {
12204  mark_modified ();
12205  }
12206  }
12207  }
12208 
12209  void set_separator (const octave_value& val)
12210  {
12211  if (! error_state)
12212  {
12213  if (separator.set (val, true))
12214  {
12215  mark_modified ();
12216  }
12217  }
12218  }
12219 
12220  void set_tooltipstring (const octave_value& val)
12221  {
12222  if (! error_state)
12223  {
12224  if (tooltipstring.set (val, true))
12225  {
12226  mark_modified ();
12227  }
12228  }
12229  }
12230 
12231 
12232  protected:
12233  void init (void)
12234  {
12235  cdata.add_constraint ("double");
12236  cdata.add_constraint ("single");
12237  cdata.add_constraint (dim_vector (-1, -1, 3));
12238  }
12239  };
12240 
12241 private:
12243 
12244 public:
12246  : base_graphics_object (), xproperties (mh, p)
12247  {
12248  xproperties.override_defaults (*this);
12249  }
12250 
12251  ~uipushtool (void) { }
12252 
12253  base_properties& get_properties (void) { return xproperties; }
12254 
12255  const base_properties& get_properties (void) const { return xproperties; }
12256 
12257  bool valid_object (void) const { return true; }
12258 
12259 };
12260 
12261 // ---------------------------------------------------------------------
12262 
12264 {
12265 public:
12267  {
12268  public:
12269  // See the genprops.awk script for an explanation of the
12270  // properties declarations.
12271  // Programming note: Keep property list sorted if new ones are added.
12272 
12273 public:
12274  properties (const graphics_handle& mh, const graphics_handle& p);
12275 
12276  ~properties (void) { }
12277 
12278  void set (const caseless_str& pname, const octave_value& val);
12279 
12280  octave_value get (bool all = false) const;
12281 
12282  octave_value get (const caseless_str& pname) const;
12283 
12284  octave_value get (const std::string& pname) const
12285  {
12286  return get (caseless_str (pname));
12287  }
12288 
12289  octave_value get (const char *pname) const
12290  {
12291  return get (caseless_str (pname));
12292  }
12293 
12294  property get_property (const caseless_str& pname);
12295 
12296  std::string graphics_object_name (void) const { return go_name; }
12297 
12298  static property_list::pval_map_type factory_defaults (void);
12299 
12300 private:
12301  static std::string go_name;
12302 
12303 public:
12304 
12305 
12306  static std::set<std::string> core_property_names (void);
12307 
12308  static bool has_core_property (const caseless_str& pname);
12309 
12310  std::set<std::string> all_property_names (void) const;
12311 
12312  bool has_property (const caseless_str& pname) const;
12313 
12314 private:
12315 
12325 
12326 public:
12327 
12328  enum
12329  {
12330  ID___OBJECT__ = 16000,
12331  ID_CDATA = 16001,
12332  ID_CLICKEDCALLBACK = 16002,
12333  ID_ENABLE = 16003,
12334  ID_OFFCALLBACK = 16004,
12335  ID_ONCALLBACK = 16005,
12336  ID_SEPARATOR = 16006,
12337  ID_STATE = 16007,
12338  ID_TOOLTIPSTRING = 16008
12339  };
12340 
12341  octave_value get___object__ (void) const { return __object__.get (); }
12342 
12343  octave_value get_cdata (void) const { return cdata.get (); }
12344 
12345  void execute_clickedcallback (const octave_value& data = octave_value ()) const { clickedcallback.execute (data); }
12346  octave_value get_clickedcallback (void) const { return clickedcallback.get (); }
12347 
12348  bool is_enable (void) const { return enable.is_on (); }
12349  std::string get_enable (void) const { return enable.current_value (); }
12350 
12351  void execute_offcallback (const octave_value& data = octave_value ()) const { offcallback.execute (data); }
12352  octave_value get_offcallback (void) const { return offcallback.get (); }
12353 
12354  void execute_oncallback (const octave_value& data = octave_value ()) const { oncallback.execute (data); }
12355  octave_value get_oncallback (void) const { return oncallback.get (); }
12356 
12357  bool is_separator (void) const { return separator.is_on (); }
12358  std::string get_separator (void) const { return separator.current_value (); }
12359 
12360  bool is_state (void) const { return state.is_on (); }
12361  std::string get_state (void) const { return state.current_value (); }
12362 
12363  std::string get_tooltipstring (void) const { return tooltipstring.string_value (); }
12364 
12365 
12366  void set___object__ (const octave_value& val)
12367  {
12368  if (! error_state)
12369  {
12370  if (__object__.set (val, true))
12371  {
12372  mark_modified ();
12373  }
12374  }
12375  }
12376 
12377  void set_cdata (const octave_value& val)
12378  {
12379  if (! error_state)
12380  {
12381  if (cdata.set (val, true))
12382  {
12383  mark_modified ();
12384  }
12385  }
12386  }
12387 
12388  void set_clickedcallback (const octave_value& val)
12389  {
12390  if (! error_state)
12391  {
12392  if (clickedcallback.set (val, true))
12393  {
12394  mark_modified ();
12395  }
12396  }
12397  }
12398 
12399  void set_enable (const octave_value& val)
12400  {
12401  if (! error_state)
12402  {
12403  if (enable.set (val, true))
12404  {
12405  mark_modified ();
12406  }
12407  }
12408  }
12409 
12410  void set_offcallback (const octave_value& val)
12411  {
12412  if (! error_state)
12413  {
12414  if (offcallback.set (val, true))
12415  {
12416  mark_modified ();
12417  }
12418  }
12419  }
12420 
12421  void set_oncallback (const octave_value& val)
12422  {
12423  if (! error_state)
12424  {
12425  if (oncallback.set (val, true))
12426  {
12427  mark_modified ();
12428  }
12429  }
12430  }
12431 
12432  void set_separator (const octave_value& val)
12433  {
12434  if (! error_state)
12435  {
12436  if (separator.set (val, true))
12437  {
12438  mark_modified ();
12439  }
12440  }
12441  }
12442 
12443  void set_state (const octave_value& val)
12444  {
12445  if (! error_state)
12446  {
12447  if (state.set (val, true))
12448  {
12449  mark_modified ();
12450  }
12451  }
12452  }
12453 
12454  void set_tooltipstring (const octave_value& val)
12455  {
12456  if (! error_state)
12457  {
12458  if (tooltipstring.set (val, true))
12459  {
12460  mark_modified ();
12461  }
12462  }
12463  }
12464 
12465 
12466  protected:
12467  void init (void)
12468  {
12469  cdata.add_constraint ("double");
12470  cdata.add_constraint ("single");
12471  cdata.add_constraint (dim_vector (-1, -1, 3));
12472  }
12473  };
12474 
12475 private:
12477 
12478 public:
12480  : base_graphics_object (), xproperties (mh, p)
12481  {
12482  xproperties.override_defaults (*this);
12483  }
12484 
12485  ~uitoggletool (void) { }
12486 
12487  base_properties& get_properties (void) { return xproperties; }
12488 
12489  const base_properties& get_properties (void) const { return xproperties; }
12490 
12491  bool valid_object (void) const { return true; }
12492 
12493 };
12494 
12495 // ---------------------------------------------------------------------
12496 
12498 get_property_from_handle (double handle, const std::string &property,
12499  const std::string &func);
12500 bool
12501 set_property_in_handle (double handle, const std::string &property,
12502  const octave_value &arg, const std::string &func);
12503 
12504 // ---------------------------------------------------------------------
12505 
12506 class graphics_event;
12507 
12508 class
12510 {
12511 public:
12512  friend class graphics_event;
12513 
12514  base_graphics_event (void) : count (1) { }
12515 
12516  virtual ~base_graphics_event (void) { }
12517 
12518  virtual void execute (void) = 0;
12519 
12520 private:
12522 };
12523 
12524 class
12526 {
12527 public:
12528  typedef void (*event_fcn) (void*);
12529 
12530  graphics_event (void) : rep (0) { }
12531 
12533  {
12534  rep->count++;
12535  }
12536 
12538  {
12539  if (rep && --rep->count == 0)
12540  delete rep;
12541  }
12542 
12544  {
12545  if (rep != e.rep)
12546  {
12547  if (rep && --rep->count == 0)
12548  delete rep;
12549 
12550  rep = e.rep;
12551  if (rep)
12552  rep->count++;
12553  }
12554 
12555  return *this;
12556  }
12557 
12558  void execute (void)
12559  { if (rep) rep->execute (); }
12560 
12561  bool ok (void) const
12562  { return (rep != 0); }
12563 
12564  static graphics_event
12566  const std::string& name,
12567  const octave_value& data = Matrix ());
12568 
12569  static graphics_event
12571  const octave_value& cb,
12572  const octave_value& data = Matrix ());
12573 
12574  static graphics_event
12575  create_function_event (event_fcn fcn, void *data = 0);
12576 
12577  static graphics_event
12578  create_set_event (const graphics_handle& h, const std::string& name,
12579  const octave_value& value,
12580  bool notify_toolkit = true);
12581 private:
12583 };
12584 
12586 {
12587 protected:
12588 
12589  gh_manager (void);
12590 
12591 public:
12592 
12593  static void create_instance (void);
12594 
12595  static bool instance_ok (void)
12596  {
12597  bool retval = true;
12598 
12599  if (! instance)
12600  create_instance ();
12601 
12602  if (! instance)
12603  {
12604  ::error ("unable to create gh_manager!");
12605 
12606  retval = false;
12607  }
12608 
12609  return retval;
12610  }
12611 
12612  static void cleanup_instance (void) { delete instance; instance = 0; }
12613 
12614  static graphics_handle get_handle (bool integer_figure_handle)
12615  {
12616  return instance_ok ()
12617  ? instance->do_get_handle (integer_figure_handle)
12618  : graphics_handle ();
12619  }
12620 
12621  static void free (const graphics_handle& h)
12622  {
12623  if (instance_ok ())
12624  instance->do_free (h);
12625  }
12626 
12627  static void renumber_figure (const graphics_handle& old_gh,
12628  const graphics_handle& new_gh)
12629  {
12630  if (instance_ok ())
12631  instance->do_renumber_figure (old_gh, new_gh);
12632  }
12633 
12634  static graphics_handle lookup (double val)
12635  {
12636  return instance_ok () ? instance->do_lookup (val) : graphics_handle ();
12637  }
12638 
12640  {
12641  return val.is_real_scalar ()
12642  ? lookup (val.double_value ()) : graphics_handle ();
12643  }
12644 
12645  static graphics_object get_object (double val)
12646  {
12647  return get_object (lookup (val));
12648  }
12649 
12650  static graphics_object get_object (const graphics_handle& h)
12651  {
12652  return instance_ok () ? instance->do_get_object (h) : graphics_object ();
12653  }
12654 
12655  static graphics_handle
12656  make_graphics_handle (const std::string& go_name,
12657  const graphics_handle& parent,
12658  bool integer_figure_handle = false,
12659  bool do_createfcn = true,
12660  bool do_notify_toolkit = true)
12661  {
12662  return instance_ok ()
12663  ? instance->do_make_graphics_handle (go_name, parent,
12664  integer_figure_handle,
12665  do_createfcn, do_notify_toolkit)
12666  : graphics_handle ();
12667  }
12668 
12669  static graphics_handle make_figure_handle (double val,
12670  bool do_notify_toolkit = true)
12671  {
12672  return instance_ok ()
12673  ? instance->do_make_figure_handle (val, do_notify_toolkit)
12674  : graphics_handle ();
12675  }
12676 
12677  static void push_figure (const graphics_handle& h)
12678  {
12679  if (instance_ok ())
12680  instance->do_push_figure (h);
12681  }
12682 
12683  static void pop_figure (const graphics_handle& h)
12684  {
12685  if (instance_ok ())
12686  instance->do_pop_figure (h);
12687  }
12688 
12689  static graphics_handle current_figure (void)
12690  {
12691  return instance_ok ()
12692  ? instance->do_current_figure () : graphics_handle ();
12693  }
12694 
12695  static Matrix handle_list (bool show_hidden = false)
12696  {
12697  return instance_ok ()
12698  ? instance->do_handle_list (show_hidden) : Matrix ();
12699  }
12700 
12701  static void lock (void)
12702  {
12703  if (instance_ok ())
12704  instance->do_lock ();
12705  }
12706 
12707  static bool try_lock (void)
12708  {
12709  if (instance_ok ())
12710  return instance->do_try_lock ();
12711  else
12712  return false;
12713  }
12714 
12715  static void unlock (void)
12716  {
12717  if (instance_ok ())
12718  instance->do_unlock ();
12719  }
12720 
12721  static Matrix figure_handle_list (bool show_hidden = false)
12722  {
12723  return instance_ok ()
12724  ? instance->do_figure_handle_list (show_hidden) : Matrix ();
12725  }
12726 
12727  static void execute_listener (const graphics_handle& h,
12728  const octave_value& l)
12729  {
12730  if (instance_ok ())
12731  instance->do_execute_listener (h, l);
12732  }
12733 
12734  static void execute_callback (const graphics_handle& h,
12735  const std::string& name,
12736  const octave_value& data = Matrix ())
12737  {
12738  octave_value cb;
12739 
12740  if (true)
12741  {
12742  gh_manager::auto_lock lock;
12743 
12744  graphics_object go = get_object (h);
12745 
12746  if (go.valid_object ())
12747  cb = go.get (name);
12748  }
12749 
12750  if (! error_state)
12751  execute_callback (h, cb, data);
12752  }
12753 
12754  static void execute_callback (const graphics_handle& h,
12755  const octave_value& cb,
12756  const octave_value& data = Matrix ())
12757  {
12758  if (instance_ok ())
12759  instance->do_execute_callback (h, cb, data);
12760  }
12761 
12762  static void post_callback (const graphics_handle& h,
12763  const std::string& name,
12764  const octave_value& data = Matrix ())
12765  {
12766  if (instance_ok ())
12767  instance->do_post_callback (h, name, data);
12768  }
12769 
12770  static void post_function (graphics_event::event_fcn fcn, void* data = 0)
12771  {
12772  if (instance_ok ())
12773  instance->do_post_function (fcn, data);
12774  }
12775 
12776  static void post_set (const graphics_handle& h, const std::string& name,
12777  const octave_value& value, bool notify_toolkit = true)
12778  {
12779  if (instance_ok ())
12780  instance->do_post_set (h, name, value, notify_toolkit);
12781  }
12782 
12783  static int process_events (void)
12784  {
12785  return (instance_ok () ? instance->do_process_events () : 0);
12786  }
12787 
12788  static int flush_events (void)
12789  {
12790  return (instance_ok () ? instance->do_process_events (true) : 0);
12791  }
12792 
12793  static void enable_event_processing (bool enable = true)
12794  {
12795  if (instance_ok ())
12796  instance->do_enable_event_processing (enable);
12797  }
12798 
12799  static bool is_handle_visible (const graphics_handle& h)
12800  {
12801  bool retval = false;
12802 
12803  graphics_object go = get_object (h);
12804 
12805  if (go.valid_object ())
12806  retval = go.is_handle_visible ();
12807 
12808  return retval;
12809  }
12810 
12811  static void close_all_figures (void)
12812  {
12813  if (instance_ok ())
12814  instance->do_close_all_figures ();
12815  }
12816 
12817 public:
12819  {
12820  public:
12821  auto_lock (bool wait = true)
12822  : octave_autolock (instance_ok ()
12823  ? instance->graphics_lock
12824  : octave_mutex (),
12825  wait)
12826  { }
12827 
12828  private:
12829 
12830  // No copying!
12831  auto_lock (const auto_lock&);
12832  auto_lock& operator = (const auto_lock&);
12833  };
12834 
12835 private:
12836 
12838 
12839  typedef std::map<graphics_handle, graphics_object>::iterator iterator;
12840  typedef std::map<graphics_handle, graphics_object>::const_iterator
12842 
12843  typedef std::set<graphics_handle>::iterator free_list_iterator;
12844  typedef std::set<graphics_handle>::const_iterator const_free_list_iterator;
12845 
12846  typedef std::list<graphics_handle>::iterator figure_list_iterator;
12847  typedef std::list<graphics_handle>::const_iterator const_figure_list_iterator;
12848 
12849  // A map of handles to graphics objects.
12850  std::map<graphics_handle, graphics_object> handle_map;
12851 
12852  // The available graphics handles.
12853  std::set<graphics_handle> handle_free_list;
12854 
12855  // The next handle available if handle_free_list is empty.
12856  double next_handle;
12857 
12858  // The allocated figure handles. Top of the stack is most recently
12859  // created.
12860  std::list<graphics_handle> figure_list;
12861 
12862  // The lock for accessing the graphics sytsem.
12864 
12865  // The list of events queued by graphics toolkits.
12866  std::list<graphics_event> event_queue;
12867 
12868  // The stack of callback objects.
12869  std::list<graphics_object> callback_objects;
12870 
12871  // A flag telling whether event processing must be constantly on.
12873 
12874  graphics_handle do_get_handle (bool integer_figure_handle);
12875 
12876  void do_free (const graphics_handle& h);
12877 
12878  void do_renumber_figure (const graphics_handle& old_gh,
12879  const graphics_handle& new_gh);
12880 
12881  graphics_handle do_lookup (double val)
12882  {
12883  iterator p = (xisnan (val) ? handle_map.end () : handle_map.find (val));
12884 
12885  return (p != handle_map.end ()) ? p->first : graphics_handle ();
12886  }
12887 
12888  graphics_object do_get_object (const graphics_handle& h)
12889  {
12890  iterator p = (h.ok () ? handle_map.find (h) : handle_map.end ());
12891 
12892  return (p != handle_map.end ()) ? p->second : graphics_object ();
12893  }
12894 
12895  graphics_handle do_make_graphics_handle (const std::string& go_name,
12896  const graphics_handle& p,
12897  bool integer_figure_handle,
12898  bool do_createfcn,
12899  bool do_notify_toolkit);
12900 
12901  graphics_handle do_make_figure_handle (double val, bool do_notify_toolkit);
12902 
12903  Matrix do_handle_list (bool show_hidden)
12904  {
12905  Matrix retval (1, handle_map.size ());
12906 
12907  octave_idx_type i = 0;
12908  for (const_iterator p = handle_map.begin (); p != handle_map.end (); p++)
12909  {
12910  graphics_handle h = p->first;
12911 
12912  if (show_hidden || is_handle_visible (h))
12913  retval(i++) = h.value ();
12914  }
12915 
12916  retval.resize (1, i);
12917 
12918  return retval;
12919  }
12920 
12921  Matrix do_figure_handle_list (bool show_hidden)
12922  {
12923  Matrix retval (1, figure_list.size ());
12924 
12925  octave_idx_type i = 0;
12926  for (const_figure_list_iterator p = figure_list.begin ();
12927  p != figure_list.end ();
12928  p++)
12929  {
12930  graphics_handle h = *p;
12931 
12932  if (show_hidden || is_handle_visible (h))
12933  retval(i++) = h.value ();
12934  }
12935 
12936  retval.resize (1, i);
12937 
12938  return retval;
12939  }
12940 
12941  void do_push_figure (const graphics_handle& h);
12942 
12943  void do_pop_figure (const graphics_handle& h);
12944 
12945  graphics_handle do_current_figure (void) const
12946  {
12947  graphics_handle retval;
12948 
12949  for (const_figure_list_iterator p = figure_list.begin ();
12950  p != figure_list.end ();
12951  p++)
12952  {
12953  graphics_handle h = *p;
12954 
12955  if (is_handle_visible (h))
12956  retval = h;
12957  }
12958 
12959  return retval;
12960  }
12961 
12962  void do_lock (void) { graphics_lock.lock (); }
12963 
12964  bool do_try_lock (void) { return graphics_lock.try_lock (); }
12965 
12966  void do_unlock (void) { graphics_lock.unlock (); }
12967 
12968  void do_execute_listener (const graphics_handle& h, const octave_value& l);
12969 
12970  void do_execute_callback (const graphics_handle& h, const octave_value& cb,
12971  const octave_value& data);
12972 
12973  void do_post_callback (const graphics_handle& h, const std::string name,
12974  const octave_value& data);
12975 
12976  void do_post_function (graphics_event::event_fcn fcn, void* fcn_data);
12977 
12978  void do_post_set (const graphics_handle& h, const std::string name,
12979  const octave_value& value, bool notify_toolkit = true);
12980 
12981  int do_process_events (bool force = false);
12982 
12983  void do_close_all_figures (void);
12984 
12985  static void restore_gcbo (void)
12986  {
12987  if (instance_ok ())
12988  instance->do_restore_gcbo ();
12989  }
12990 
12991  void do_restore_gcbo (void);
12992 
12993  void do_post_event (const graphics_event& e);
12994 
12995  void do_enable_event_processing (bool enable = true);
12996 };
12997 
12998 void get_children_limits (double& min_val, double& max_val,
12999  double& min_pos, double& max_neg,
13000  const Matrix& kids, char limit_type);
13001 
13003 
13004 // This function is NOT equivalent to the scripting language function gcf.
13006 
13007 // This function is NOT equivalent to the scripting language function gca.
13009 
13010 OCTINTERP_API void close_all_figures (void);
13011 
13012 #endif