1<?php
2// $Header: /cvsroot/html2ps/box.radiobutton.php,v 1.20 2006/11/11 13:43:51 Konstantin Exp $
3
4require_once(HTML2PS_DIR.'box.inline.simple.php');
5
6class RadioBox extends SimpleInlineBox {
7  var $_checked;
8
9  /**
10   * @var String name of radio button group
11   * @access private
12   */
13  var $_group_name;
14
15  /**
16   * @var String value to be posted as this radio button value
17   * @access private
18   */
19  var $_value;
20
21  function &create(&$root, &$pipeline) {
22    $checked = $root->has_attribute('checked');
23
24    $value   = $root->get_attribute('value');
25    if (trim($value) == "") {
26      error_log("Radiobutton with empty 'value' attribute");
27      $value = sprintf("___Value%s",md5(time().rand()));
28    };
29
30    $css_state = $pipeline->get_current_css_state();
31
32    $box =& new RadioBox($checked, $value,
33                         $css_state->get_property(CSS_HTML2PS_FORM_RADIOGROUP));
34    $box->readCSS($css_state);
35    return $box;
36  }
37
38  function RadioBox($checked, $value, $group_name) {
39    // Call parent constructor
40    $this->GenericBox();
41
42    // Check the box state
43    $this->_checked = $checked;
44
45    /**
46     * Store the form value for this radio button
47     */
48    $this->_value = trim($value);
49
50    $this->_group_name = $group_name;
51
52    // Setup box size:
53    $this->default_baseline = units2pt(RADIOBUTTON_SIZE);
54    $this->height           = units2pt(RADIOBUTTON_SIZE);
55    $this->width            = units2pt(RADIOBUTTON_SIZE);
56
57    $this->setCSSProperty(CSS_DISPLAY,'-radio');
58  }
59
60  // Inherited from GenericFormattedBox
61  function get_min_width(&$context) {
62    return $this->get_full_width($context);
63  }
64
65  function get_max_width(&$context) {
66    return $this->get_full_width($context);
67  }
68
69  function get_max_width_natural(&$context) {
70    return $this->get_full_width($context);
71  }
72
73  function reflow(&$parent, &$context) {
74    GenericFormattedBox::reflow($parent, $context);
75
76    // set default baseline
77    $this->baseline = $this->default_baseline;
78
79    // append to parent line box
80    $parent->append_line($this);
81
82    // Determine coordinates of upper-left _margin_ corner
83    $this->guess_corner($parent);
84
85    // Offset parent current X coordinate
86    $parent->_current_x += $this->get_full_width();
87
88    // Extends parents height
89    $parent->extend_height($this->get_bottom_margin());
90  }
91
92  function show(&$driver) {
93    // Cet check center
94    $x = ($this->get_left() + $this->get_right()) / 2;
95    $y = ($this->get_top() + $this->get_bottom()) / 2;
96
97    // Calculate checkbox size
98    $size = $this->get_width() / 3;
99
100    // Draw checkbox
101    $driver->setlinewidth(0.25);
102    $driver->circle($x, $y, $size);
103    $driver->stroke();
104
105    /**
106     * Render the interactive button (if requested and possible)
107     * Also, if no value were specified, then this radio button should not be interactive
108     */
109    global $g_config;
110    if ($g_config['renderforms'] && $this->_value != "") {
111      $driver->field_radio($x - $size,
112                           $y + $size,
113                           2*$size,
114                           2*$size,
115                           $this->_group_name,
116                           $this->_value,
117                           $this->_checked);
118    } else {
119      // Draw checkmark if needed
120      if ($this->_checked) {
121        $check_size = $this->get_width() / 6;
122
123        $driver->circle($x, $y, $check_size);
124        $driver->fill();
125      }
126    };
127
128    return true;
129  }
130
131  function get_ascender() {
132    return $this->get_height();
133  }
134
135  function get_descender() {
136    return 0;
137  }
138}
139?>