<?xml version="1.0" encoding="UTF-8"?>
<otrunk id="33754150-b594-11d9-9669-0800200c9a66">
  <imports>
    <import class="org.concord.otrunk.OTSystem"/>
    <import class="org.concord.otrunk.view.OTViewBundle"/>
    <import class="org.concord.otrunk.view.OTViewEntry"/>
    <import class="org.concord.otrunk.script.ui.OTScriptButton"/>
    <import class="org.concord.otrunk.script.js.OTJavascript"/>
    <import class="org.concord.otrunk.script.jruby.OTJRuby"/>
    <import class="org.concord.otrunk.script.jython.OTJython"/>
    <import class="org.concord.otrunk.script.OTScriptEngineBundle"/>
    <import class="org.concord.otrunk.script.OTScriptEngineEntry"/>
    <import class="org.concord.otrunk.script.ui.OTScriptObject" />
    <import class="org.concord.otrunk.script.ui.OTScriptVariable" />
    <import class="org.concord.otrunk.script.ui.OTScriptVariableComponent" />
    <import class="org.concord.otrunk.script.ui.OTScriptVariableRealObject" />
    <import class="org.concord.otrunk.script.ui.OTScriptVariableView" />
    
    <import class="org.concord.otrunk.util.OTSharingBundle" />
    <import class="org.concord.otrunk.view.OTViewMode" />
    <import class="org.concord.otrunk.view.document.OTCompoundDoc" />
    <import class="org.concord.otrunk.view.document.OTCssText" />
    <import class="org.concord.otrunk.view.document.OTDocumentViewConfig" />
    <import class="org.concord.otrunk.view.document.edit.OTDocumentEditViewConfig" />
    <import class="org.concord.otrunk.view.OTFolderObject"/>
    <import class="org.concord.otrunk.view.OTViewMode" />
    <import class="org.concord.otrunk.view.OTObjectEditViewConfig" />
    <import class="org.concord.otrunk.ui.OTText" />

    <import class="org.concord.data.state.OTDataStore" />
    <import class="org.concord.data.state.OTDataChannelDescription" />
    <import class="org.concord.data.state.OTDataField" />
    <import class="org.concord.data.state.OTDataTable" />
    <import class="org.concord.datagraph.state.OTDataGraph" />
    <import class="org.concord.datagraph.state.OTDataAxis" />
    <import class="org.concord.datagraph.state.OTDataGraphable" />
    <import class="org.concord.datagraph.state.OTDataCollector" />
    <import class="org.concord.datagraph.state.OTMultiDataGraph" />
    <import class="org.concord.datagraph.state.OTPluginView" />
    <import class="org.concord.datagraph.state.OTDataBarGraphable" />

    <import class="org.concord.data.state.OTDifferentiatingProducerFilter" />

    <import class="org.concord.sensor.state.OTDeviceConfig" />
    <import class="org.concord.sensor.state.OTExperimentRequest" />
    <import class="org.concord.sensor.state.OTInterfaceManager" />
    <import class="org.concord.sensor.state.OTSensorDataProxy" />
    <import class="org.concord.sensor.state.OTSensorRequest" />

    <import class="org.concord.datagraph.state.OTMultiDataGraph"/>
    
    <import class="org.concord.framework.otrunk.wrapper.OTBlob" />
    <import class="org.concord.framework.otrunk.wrapper.OTBoolean" />
    <import class="org.concord.framework.otrunk.wrapper.OTInt" />

    <import class="org.concord.smartgraph.OTSmartGraphTool" />
    <import class="org.concord.otrunk.graph.OTDataCollectorViewConfig" />
    
    <import class="org.concord.otrunk.util.OTSharingBundle" />
    
    
    <import class="org.concord.otrunk.graph.OTDataCollectorViewConfig" />
    <import class="org.concord.otrunk.ui.OTModeSwitcher" />
    <import class="org.concord.framework.otrunk.view.OTFrame" />
  </imports>
  <objects>
    <OTSystem>
      <bundles>
        <OTViewBundle showLeftPanel="false">
          <frame>
            <OTFrame useScrollPane="true" width="900" height="600" />
          </frame>
          <modes>
            <OTViewMode name="authoring">
              <map>
                <entry key="${script-button-view}">
                  <OTViewEntry objectClass="org.concord.otrunk.script.ui.OTScriptButton"
                     viewClass="org.concord.otrunk.script.ui.OTScriptButtonExtendedEditView"/>
                </entry>
                <entry key="${mode-switcher-view}">
                  <OTViewEntry objectClass="org.concord.otrunk.ui.OTModeSwitcher" 
                    viewClass="org.concord.otrunk.ui.swing.OTModeSwitcherView" />
                </entry>
                <entry key="${compound_doc_view}">
                  <OTDocumentEditViewConfig objectClass="org.concord.otrunk.view.document.OTCompoundDoc" 
                    viewClass="org.concord.otrunk.view.document.edit.OTDocumentEditView">
                    <documentViewConfig>
                      <object refid="${compound_doc_view}" />
                    </documentViewConfig>
                    <objectsToInsert>
                      <OTText name="Text Box" />
                      <OTScriptButton name="Javascript Button" script="${clickme_script_javascript}">
                        <text>Click Me (JavaScript)</text>
                      </OTScriptButton>
                      <OTScriptButton name="JRuby Button" script="${clickme_script_jruby}">
                        <text>Click Me (JavaScript)</text>
                      </OTScriptButton>
                      <OTScriptButton name="Jython Button" script="${clickme_script_jython}">
                        <text>Click Me (JavaScript)</text>
                      </OTScriptButton>
                    </objectsToInsert>
                  </OTDocumentEditViewConfig>
                </entry>
                <entry key="${text-edit}">
                  <OTViewEntry objectClass="org.concord.otrunk.ui.OTText" viewClass="org.concord.otrunk.ui.swing.OTTextEditEditView" />
                </entry>
                <entry key="${data-collector-view}">
                  <OTDataCollectorViewConfig objectClass="org.concord.datagraph.state.OTDataCollector"
                    viewClass="org.concord.otrunk.graph.OTDataCollectorEditView">
                  </OTDataCollectorViewConfig>
                </entry>
              </map>
            </OTViewMode>
            <OTViewMode name="student">
              <map />
            </OTViewMode>
          </modes>
          <views>
            <OTViewEntry objectClass="org.concord.otrunk.ui.OTModeSwitcher" 
              viewClass="org.concord.otrunk.ui.swing.OTModeSwitcherView"
              local_id="mode-switcher-view" />
            <OTViewEntry objectClass="org.concord.otrunk.script.ui.OTScriptButton" 
              viewClass="org.concord.otrunk.script.ui.OTScriptButtonView"
              local_id="script-button-view" />
            <OTViewEntry objectClass="org.concord.otrunk.script.OTScript" 
              viewClass="org.concord.otrunk.script.ui.OTScriptEditView" 
              local_id="script-edit-view" />
            <OTViewEntry objectClass="org.concord.otrunk.ui.OTText" 
              viewClass="org.concord.otrunk.ui.swing.OTTextEditView"
               local_id="text-edit"  />
            <OTViewEntry 
              objectClass="org.concord.datagraph.state.OTDataCollector"
              viewClass="org.concord.datagraph.state.OTDataCollectorView"
              local_id="data-collector-view" />
            <OTViewEntry
              objectClass="org.concord.datagraph.state.OTMultiDataGraph"
              viewClass="org.concord.datagraph.state.OTMultiDataGraphView"
              local_id="multi-data-graph-view" />
            <OTDocumentViewConfig 
              objectClass="org.concord.otrunk.view.document.OTCompoundDoc" 
              viewClass="org.concord.otrunk.view.document.OTDocumentView"
              local_id="compound_doc_view"
              css="
              body { background-color:#FFFFFF; color:#333333; font-family:Tahoma,'Trebuchet MS',sans-serif; line-height:1.5em; }
              h1 { color:#FFD32C; font-size:1.5em; margin-bottom:0px; }
              h2 { color:#FFD32C; font-size:1.3em; margin-bottom:0px; }
              h2 { color:#FFD32C; font-size:1.1em; margin: 2em 0em 1em 0em; }
              .menu { color: #982f10; background-color: #fffee9;  color: #982f10; margin: 0px 1px; padding: 5px; }
              .menu_item { background-color: #fffee9; color: #982f10; margin: 1px 0px; padding: 0px 10px; }
                .menu_item a { color: #51a656; }
              #navlist ul { margin: 0; padding: 0; list-style: none; width: 150px; }
              #navlist li { display: inline; list-style-type: none;list-style-type: none; padding-right: 10px; }
              #content { margin:5px; padding:5px; }
              "/>
          </views>
        </OTViewBundle>
        <OTSharingBundle />
        <OTScriptEngineBundle>
          <engines>
            <OTScriptEngineEntry objectClass="org.concord.otrunk.script.js.OTJavascript"    
              engineClass="org.concord.otrunk.script.js.OTJavascriptEngine"/>
            <OTScriptEngineEntry objectClass="org.concord.otrunk.script.jruby.OTJRuby"
              engineClass="org.concord.otrunk.script.jruby.OTJRubyEngine"/>
            <OTScriptEngineEntry objectClass="org.concord.otrunk.script.jython.OTJython"
              engineClass="org.concord.otrunk.script.jython.OTJythonEngine"/>
          </engines>
        </OTScriptEngineBundle>
        <OTInterfaceManager>
          <deviceConfigs>
            <OTDeviceConfig configString="none" deviceId="10" />
          </deviceConfigs>
        </OTInterfaceManager>
      </bundles>
      <root>
        <OTModeSwitcher name="Simple Button Scripts">
          <otObject>
            <OTCompoundDoc name="Simple Button Scripts">
              <bodyText>
                <div id="content">
                  <h3>Script Button Edit Tests:</h3>
                  <p>
                    Each of the buttons below runs a simple script in a different scripting language when clicked.
                  </p>
                  <br />
                  <table>
                    <tr>
                      <td><object refid="${clickme_javascript_button}" /></td>
                      <td><object refid="${clickme_jruby_button}" /></td>
                      <td><object refid="${clickme_jython_button}" /></td>
                    </tr>
                  </table>
                  <p>
                    If you are in <b><i>authoring</i></b> mode you can edit the scripts for each button by CTRL-clicking on the button.
                  </p>
                  <br /><hr /><br />
                  <h3>Script buttons manipulating the data in an OTText object.</h3>
                  <p>
                    You can edit the text in the following field:
                  </p>
                  <br />
                  <table>
                    <tr>
                      <td width="400"><object refid="${text_input}" /></td>
                    </tr>
                  </table>
                  <p>
                    and then click one of the script buttons below to reverse the text:
                  </p>
                  <br />
                  <table>
                    <tr>
                      <td><object refid="${reverse_text_javascript_button}" /></td>
                      <td><object refid="${reverse_text_jruby_button}" /></td>
                      <td><object refid="${reverse_text_jython_button}" /></td>
                    </tr>
                  </table>
                  <br /><hr /><br />
                  <h3>Script buttons manipulating an OTText (backed by an OTInt) object that holds the money left in an budget.</h3>
                  <br />
                  <table>
                    <tr>
                      <td width="400"><object refid="${budget_total_text}" /></td>
                    </tr>
                  </table>
                  <p>
                    Click one of the script buttons below to add $10,000 and the other to subtract $10,000
                  </p>
                  <br />
                  <table>
                    <tr>
                      <td><object refid="${add_10000_jruby_button}" /></td>
                      <td><object refid="${sub_10000_jruby_button}" /></td>
                    </tr>
                  </table>
                  <br /><hr /><br />
                  <h3>Script Buttons interacting with a graph:</h3>
                  <p>The script buttons that manipulate the graph below were written in JRuby.</p>
                  <br />
                  <table>
                    <tr>
                      <th>Graph</th><th>JRuby button scripts</th>
                    </tr>
                    <tr>
                      <td width="600"><object refid="${datacollector1}" /></td>
                      <td align="top">
                        <object refid="${change_x_axis}" /><br />
                        <object refid="${change_y_axis}" /><br />
                        <object refid="${change_color}" /><br />
                        <object refid="${toggle_markers}" /><br />
                        <object refid="${toggle_lines}" /><br />
                        <object refid="${toggle_autoscale}" /><br />
                        <object refid="${toggle_ruler}" /><br />
                        <object refid="${toggle_multiple_graphs}" /><br />
                      </td>
                    </tr>
                  </table>
                  <br /><hr /><br />
                  <h3>Two graphs, one toolbar, linked X axes</h3>
                  <p>Script Buttons interacting with a two separate graphs embedded in an OTMultiDataGraph. 
                    The OTMultiDataGraph will display just one set of toolbar controls for all the contained graphs.
                    The X axes of the two embedded OTDataCollectors are linked internally.</p>
                    <p>The script buttons that manipulate the graph below were written in JRuby.</p>
                  <br />
                  <table>
                    <tr>
                      <th>Graph</th><th>JRuby button scripts</th>
                    </tr>
                    <tr>
                      <td width="600"><object refid="${multidatacollector}" /></td>
                      <td align="top">
                        <object refid="${change_multigraph_x_axes}" /><br />
                        <object refid="${change_multigraph_y_axes}" /><br />
                        <object refid="${change_multigraph_colors}" /><br />
                        <object refid="${toggle_multigraph_markers}" /><br />
                        <object refid="${toggle_multigraph_lines}" /><br />
                        <object refid="${toggle_multigraph_multidata}" /><br />
                      </td>
                    </tr>
                  </table>                  
                  <br /><hr /><br />
                  <h3>Same two graphs separated, linked X axes</h3>
                  <p>Script Buttons interacting with a two separate graphs with linked X axes.</p>
                  <p>The script buttons that manipulate the graph below were written in JRuby.</p>
                  <br />
                  <table>
                    <tr>
                      <th>Graph</th><th>JRuby button scripts</th>
                    </tr>
                    <tr>
                      <td width="600"><object refid="${datacollector2}" /></td>
                      <td align="top">
                      </td>                     
                    </tr>
                    <tr>
                      <td width="600"><object refid="${datacollector3}" /></td>
                      <td align="top">
                      </td>                     
                    </tr>
                  </table>
                </div>
              </bodyText>
            </OTCompoundDoc>
          </otObject>
        </OTModeSwitcher>            
      </root>
      <library>
        <OTJavascript name="Javascript Button Script" local_id="clickme_script_javascript">
          <script>
importClass(Packages.javax.swing.JOptionPane);
function clicked(){
  JOptionPane.showMessageDialog(null, "clicked (Javascript)");
}
          </script>
        </OTJavascript>
        <OTJRuby name="JRuby Button Script" local_id="clickme_script_jruby">
          <script>
include_class 'javax.swing.JOptionPane'
def self.clicked
  JOptionPane.showMessageDialog(nil, "clicked (JRuby)")
end
          </script>
        </OTJRuby>
        <OTJython name="Jython Button Script" local_id="clickme_script_jython">
          <script>
from javax.swing import JOptionPane
def clicked():
    JOptionPane.showMessageDialog(None, "clicked (Jython)")
    return True
          </script>
        </OTJython>
        <OTJavascript name="Javascript Button Script" local_id="reverse_text_script_javascript">
          <script>
function clicked() {
  var original = textinput.getText();
  var reversed = "";
  for (i=original.length-1; i>=0; i--) {
    reversed = reversed + original.charAt(i);
  }
  textinput.setText(reversed);
}
          </script>
        </OTJavascript>
        <OTJRuby name="JRuby Button Script" local_id="reverse_text_script_jruby">
          <script>
def self.clicked
  $textinput.text = $textinput.text.reverse
end
          </script>
        </OTJRuby>
        <OTJython name="Jython Button Script" local_id="reverse_text_script_jython">
          <script>
def clicked():
    reversedText = textinput.getText()[::-1]
    textinput.setText(reversedText)
    return True
          </script>
        </OTJython>
        <OTScriptButton local_id="clickme_javascript_button" name="Javascript Button" script="${clickme_script_javascript}">
          <text>Click Me (JavaScript)</text>
        </OTScriptButton>
        <OTScriptButton local_id="clickme_jruby_button" name="JRuby Button" script="${clickme_script_jruby}">
          <text>Click Me (JRuby)</text>
        </OTScriptButton>
        <OTScriptButton local_id="clickme_jython_button" name="Jython Button" script="${clickme_script_jython}">
          <text>Click Me (Jython)</text>
        </OTScriptButton>
        <OTScriptButton local_id="reverse_text_javascript_button" name="Javascript Button" script="${reverse_text_script_javascript}">
          <text>Reverse Text (JavaScript)</text>
          <scriptVariables>
            <OTScriptVariable name="textinput" reference="${text_input}" />
          </scriptVariables>
        </OTScriptButton>
        <OTScriptButton local_id="reverse_text_jruby_button" name="JRuby Button" script="${reverse_text_script_jruby}">
          <text>Reverse Text (JRuby)</text>
          <scriptVariables>
            <OTScriptVariable name="textinput" reference="${text_input}" />
          </scriptVariables>
        </OTScriptButton>
        <OTScriptButton local_id="reverse_text_jython_button" name="Jython Button" script="${reverse_text_script_jython}">
          <text>Reverse Text (Jython)</text>
          <scriptVariables>
            <OTScriptVariable name="textinput" reference="${text_input}" />
          </scriptVariables>
        </OTScriptButton>
        <OTText local_id="text_input">
          <text>this text can be reversed with a script</text>
        </OTText>
        <OTScriptButton local_id="add_10000_jruby_button" name="Jython Button" script="${add_10000_jruby_button_script_jruby}">
          <text>Add $10,000 (JRuby)</text>
          <scriptVariables>
            <OTScriptVariable name="budget_total" reference="${budget_total_int}" />
            <OTScriptVariable name="budget_total_text" reference="${budget_total_text}" />
          </scriptVariables>
        </OTScriptButton>
        <OTScriptButton local_id="sub_10000_jruby_button" name="Jython Button" script="${sub_10000_jruby_button_script_jruby}">
          <text>Subtract $10,000 (JRuby)</text>
          <scriptVariables>
            <OTScriptVariable name="budget_total" reference="${budget_total_int}" />
            <OTScriptVariable name="budget_total_text" reference="${budget_total_text}" />
          </scriptVariables>
        </OTScriptButton>
        <OTText local_id="budget_total_text">
          <text>50000</text>
        </OTText>
        <OTInt local_id="budget_total_int" value="50000" />
        <OTJRuby name="JRuby Button Script" local_id="add_10000_jruby_button_script_jruby">
          <script>
def self.clicked
  $budget_total.value = $budget_total.value + 10000
  $budget_total_text.text = $budget_total.value.to_s
end
          </script>
        </OTJRuby>
        <OTJRuby name="JRuby Button Script" local_id="sub_10000_jruby_button_script_jruby">
          <script>
def self.clicked
  $budget_total.value = $budget_total.value - 10000
  $budget_total.value = 0 if $budget_total.value &lt; 0
  $budget_total_text.text = $budget_total.value.to_s
end
          </script>
        </OTJRuby>
        <OTDataCollector local_id="datacollector1" name="position_data_graph1" title="Position data graph" autoScaleEnabled="false">
          <source>
            <OTDataGraphable name="position data 1" connectPoints="true" controllable="true" yColumn="1" drawMarks="true" color="16711680" xColumn="0" lineWidth="4.0">
              <dataStore>
                <OTDataStore local_id="datastore_01" numberChannels="2">
                  <values>
                    <float>0.0</float>
                    <float>0.5</float>
                    <float>1.0</float>
                    <float>0.7</float>
                    <float>2.0</float>
                    <float>0.9</float>
                    <float>3.0</float>
                    <float>1.1</float>
                    <float>4.0</float>
                    <float>1.3</float>
                    <float>5.0</float>
                    <float>1.5</float>
                    <float>6.0</float>
                    <float>1.7</float>
                    <float>7.0</float>
                    <float>1.9</float>
                    <float>8.0</float>
                    <float>2.1</float>
                    <float>9.0</float>
                    <float>2.3</float>
                  </values>
                </OTDataStore>
              </dataStore>
            </OTDataGraphable>
          </source>
          <xDataAxis>
            <OTDataAxis max="20.0" units="s" min="0.0" label="Time" />
          </xDataAxis>
          <yDataAxis>
            <OTDataAxis max="3.25" units="" min="-0.0" label="Distance" />
          </yDataAxis>
        </OTDataCollector>
        <OTSmartGraphTool local_id="smart_graph_tool" name="smart graph tool">
          <dataCollector>
            <object refid="${datacollector1}" />
          </dataCollector>
        </OTSmartGraphTool>        
        <OTScriptButton local_id="change_x_axis" name="JRuby Button" script="${change_x_axis_script}">
          <text>change X axis</text>
          <scriptVariables>
            <OTScriptVariableRealObject name="smartgraph">
              <reference>
                <object refid="${smart_graph_tool}" />
              </reference>
            </OTScriptVariableRealObject>
            <OTScriptVariable name="datacollector1">
              <reference>
                <object refid="${datacollector1}" />
              </reference>
            </OTScriptVariable>
          </scriptVariables>
        </OTScriptButton>     
        <OTJRuby name="JRuby Button Script" local_id="change_x_axis_script">
          <script>
def self.clicked
  max_x = $datacollector1.xdata_axis.max
  $datacollector1.xdata_axis.max = max_x/2.0
end
          </script>
        </OTJRuby>
        <OTScriptButton local_id="change_y_axis" name="JRuby Button" script="${change_y_axis_script}">
          <text>change Y axis</text>
          <scriptVariables>
            <OTScriptVariable name="datacollector1">
              <reference>
                <object refid="${datacollector1}" />
              </reference>
            </OTScriptVariable>
          </scriptVariables>
        </OTScriptButton>     
        <OTJRuby name="JRuby Button Script" local_id="change_y_axis_script">
          <script>
def self.clicked
  max_y = $datacollector1.ydata_axis.max
  $datacollector1.ydata_axis.max = max_y/2.0
end
          </script>
        </OTJRuby>
        <OTScriptButton local_id="change_color" name="JRuby Button" script="${change_color_script}">
          <text>change color</text>
          <scriptVariables>
            <OTScriptVariable name="datacollector1">
              <reference>
                <object refid="${datacollector1}" />
              </reference>
            </OTScriptVariable>
          </scriptVariables>
        </OTScriptButton>     
        <OTJRuby name="JRuby Button Script" local_id="change_color_script">
          <script>
LINE_COLORS = %w{65AE24 E08024 905BF5 568AD8 B03A7F 99A62A}
LINE_COLORS_LENGTH = LINE_COLORS.length
@color_index = 0

def next_color
  @color_index += 1
  color = LINE_COLORS[@color_index % LINE_COLORS_LENGTH].hex
end

def self.clicked
  $datacollector1.source.color = next_color
end
          </script>
        </OTJRuby>
        <OTScriptButton local_id="toggle_markers" name="JRuby Button" script="${toggle_markers_script}">
          <text>toggle markers</text>
          <scriptVariables>
            <OTScriptVariable name="datacollector1">
              <reference>
                <object refid="${datacollector1}" />
              </reference>
            </OTScriptVariable>
          </scriptVariables>
        </OTScriptButton>     
        <OTJRuby name="JRuby Button Script" local_id="toggle_markers_script">
          <script>
def self.clicked
  $datacollector1.source.draw_marks = $datacollector1.source.draw_marks ? false: true
end
          </script>
        </OTJRuby>    
        <OTScriptButton local_id="toggle_lines" name="JRuby Button" script="${toggle_lines_script}">
          <text>toggle lines</text>
          <scriptVariables>
            <OTScriptVariable name="datacollector1">
              <reference>
                <object refid="${datacollector1}" />
              </reference>
            </OTScriptVariable>
          </scriptVariables>
        </OTScriptButton>     
        <OTJRuby name="JRuby Button Script" local_id="toggle_lines_script">
          <script>
def self.clicked
  $datacollector1.source.connect_points = $datacollector1.source.connect_points ? false: true
end
          </script>
        </OTJRuby>
        <OTScriptButton local_id="toggle_autoscale" name="JRuby Button" script="${toggle_autoscale_script}">
          <text>toggle autoscale</text>
          <scriptVariables>
            <OTScriptVariable name="datacollector1">
              <reference>
                <object refid="${datacollector1}" />
              </reference>
            </OTScriptVariable>
          </scriptVariables>
        </OTScriptButton>     
        <OTJRuby name="JRuby Button Script" local_id="toggle_autoscale_script">
          <script>
def self.clicked
  $datacollector1.auto_scale_enabled = $datacollector1.auto_scale_enabled ? false: true
end
          </script>
        </OTJRuby>
        <OTScriptButton local_id="toggle_ruler" name="JRuby Button" script="${toggle_ruler_script}">
          <text>toggle ruler</text>
          <scriptVariables>
            <OTScriptVariable name="datacollector1">
              <reference>
                <object refid="${datacollector1}" />
              </reference>
            </OTScriptVariable>
          </scriptVariables>
        </OTScriptButton>     
        <OTJRuby name="JRuby Button Script" local_id="toggle_ruler_script">
          <script>
def self.clicked
  $datacollector1.ruler_enabled = $datacollector1.ruler_enabled ? false: true
end
          </script>
        </OTJRuby>    
        <OTScriptButton local_id="toggle_multiple_graphs" name="JRuby Button" script="${toggle_multiple_graphs_script}">
          <text>toggle multidata</text>
          <scriptVariables>
            <OTScriptVariable name="datacollector1">
              <reference>
                <object refid="${datacollector1}" />
              </reference>
            </OTScriptVariable>
          </scriptVariables>
        </OTScriptButton>     
        <OTJRuby name="JRuby Button Script" local_id="toggle_multiple_graphs_script">
          <script>
def self.clicked
  $datacollector1.multiple_graphable_enabled = $datacollector1.multiple_graphable_enabled ? false: true
end
          </script>
        </OTJRuby>
        <OTMultiDataGraph local_id="multidatacollector" name="Multiple Graphs" rows="2" columns="1">
          <graphs>
            <OTDataCollector local_id="datacollector2" name="position_data_graph" title="Position data graph" autoScaleEnabled="false">
              <source>
                
                <OTDataGraphable name="position data" connectPoints="true" controllable="true" yColumn="1" drawMarks="true" color="16711680" xColumn="0" lineWidth="4.0">
                  <dataProducer>
                    <OTSensorDataProxy local_id="position_data_sensor_proxy" name="dataproducer">
                      <request>
                        <OTExperimentRequest period="0.1">
                          <sensorRequests>
                            <OTSensorRequest stepSize="0.1" type="13" unit="m" port="0" requiredMax="4.0" displayPrecision="-2" requiredMin="-4.0" />
                          </sensorRequests>
                        </OTExperimentRequest>
                      </request>
                    </OTSensorDataProxy>
                  </dataProducer>
                  <dataStore>
                    <OTDataStore id="position_data_datastore" dt="1.0" numberChannels="1">
                      <channelDescriptions>
                        <OTDataChannelDescription name="dt" precision="2" numericData="true" />
                        <OTDataChannelDescription name="" numericData="true" />
                      </channelDescriptions>
                    </OTDataStore>
                    <values>
                      <float>0.5</float>
                      <float>0.7</float>
                      <float>0.9</float>
                      <float>1.1</float>
                      <float>1.3</float>
                      <float>1.5</float>
                      <float>1.7</float>
                      <float>1.9</float>
                      <float>2.1</float>
                      <float>2.3</float>
                    </values>
                  </dataStore>                  
                </OTDataGraphable>
              </source>
              <xDataAxis>
                <OTDataAxis  local_id="motion_xaxis" max="20.0" units="s" min="0.0" label="Time" labelFormat="Engineering"/>
              </xDataAxis>
              <yDataAxis>
                <OTDataAxis max="3.25" units="m" min="-0.0" label="Distance" labelFormat="Engineering"/>
              </yDataAxis>
            </OTDataCollector>
            <OTDataCollector local_id="datacollector3" name="velocity_data_graph" title="Velocity data graph" autoScaleEnabled="false" xDataAxis="${motion_xaxis}">
              <source>
                <OTDataGraphable name="Data Graph" connectPoints="true" controllable="true" yColumn="1" drawMarks="false" color="16711680" xColumn="0" lineWidth="2.0">
                  <dataStore>
                    <OTDataStore />
                  </dataStore>
                </OTDataGraphable>
              </source>
              
              <yDataAxis>
                <OTDataAxis max="3.25" units="m/s" min="-0.0" label="Velocity" />
              </yDataAxis>
            </OTDataCollector>
          </graphs>
        </OTMultiDataGraph>
        <OTScriptButton local_id="change_multigraph_x_axes" name="JRuby Button" script="${change_multigraph_x_axes_script}">
          <text>change X axes</text>
          <scriptVariables>
            <OTScriptVariable name="multidatacollector">
              <reference>
                <object refid="${multidatacollector}" />
              </reference>
            </OTScriptVariable>
          </scriptVariables>
        </OTScriptButton>     
        <OTJRuby name="JRuby Button Script" local_id="change_multigraph_x_axes_script">
          <script>
def self.clicked
  $multidatacollector.graphs.vector.each do |dc|
    max_x = dc.xdata_axis.max
    dc.xdata_axis.max = max_x/2.0
  end
end
          </script>
        </OTJRuby>
        <OTScriptButton local_id="change_multigraph_y_axes" name="JRuby Button" script="${change_multigraph_y_axes_script}">
          <text>change Y axes</text>
          <scriptVariables>
            <OTScriptVariable name="multidatacollector">
              <reference>
                <object refid="${multidatacollector}" />
              </reference>
            </OTScriptVariable>
          </scriptVariables>
        </OTScriptButton>     
        <OTJRuby name="JRuby Button Script" local_id="change_multigraph_y_axes_script">
          <script>
def self.clicked
  $multidatacollector.graphs.vector.each do |dc|
    max_y = dc.ydata_axis.max
    dc.ydata_axis.max = max_y/2.0
  end
end
          </script>
        </OTJRuby>
        <OTScriptButton local_id="change_multigraph_colors" name="JRuby Button" script="${change_multigraph_colors_script}">
          <text>change colors</text>
          <scriptVariables>
            <OTScriptVariable name="multidatacollector">
              <reference>
                <object refid="${multidatacollector}" />
              </reference>
            </OTScriptVariable>
          </scriptVariables>
        </OTScriptButton>     
        <OTJRuby name="JRuby Button Script" local_id="change_multigraph_colors_script">
          <script>
LINE_COLORS = %w{65AE24 E08024 905BF5 568AD8 B03A7F 99A62A}
LINE_COLORS_LENGTH = LINE_COLORS.length
@color_index = 0

def next_color
  @color_index += 1
  color = LINE_COLORS[@color_index % LINE_COLORS_LENGTH].hex
end

def self.clicked
  new_color = next_color
  $multidatacollector.graphs.vector.each do |dc|
    dc.source.color = new_color
  end
end
          </script>
        </OTJRuby>
        <OTScriptButton local_id="toggle_multigraph_markers" name="JRuby Button" script="${toggle_multigraph_markers_script}">
          <text>toggle markers</text>
          <scriptVariables>
            <OTScriptVariable name="multidatacollector">
              <reference>
                <object refid="${multidatacollector}" />
              </reference>
            </OTScriptVariable>
          </scriptVariables>
        </OTScriptButton>     
        <OTJRuby name="JRuby Button Script" local_id="toggle_multigraph_markers_script">
          <script>
def self.clicked
  $multidatacollector.graphs.vector.each do |dc|
    dc.source.draw_marks = dc.source.draw_marks ? false: true
  end
end
          </script>
        </OTJRuby>
        <OTScriptButton local_id="toggle_multigraph_lines" name="JRuby Button" script="${toggle_multigraph_lines_script}">
          <text>toggle lines</text>
          <scriptVariables>
            <OTScriptVariable name="multidatacollector">
              <reference>
                <object refid="${multidatacollector}" />
              </reference>
            </OTScriptVariable>
          </scriptVariables>
        </OTScriptButton>     
        <OTJRuby name="JRuby Button Script" local_id="toggle_multigraph_lines_script">
          <script>
def self.clicked
  $multidatacollector.graphs.vector.each do |dc|
    dc.source.connect_points = dc.source.connect_points ? false: true
  end
end
          </script>
        </OTJRuby>
        <OTScriptButton local_id="toggle_multigraph_multidata" name="JRuby Button" script="${toggle_multigraph_multidata_script}">
          <text>toggle multidata</text>
          <scriptVariables>
            <OTScriptVariable name="multidatacollector">
              <reference>
                <object refid="${multidatacollector}" />
              </reference>
            </OTScriptVariable>
          </scriptVariables>
        </OTScriptButton>     
        <OTJRuby name="JRuby Button Script" local_id="toggle_multigraph_multidata_script">
          <script>
def self.clicked
  $multidatacollector.graphs.vector.each do |dc|
    dc.multiple_graphable_enabled = dc.multiple_graphable_enabled ? false: true
  end
end
          </script>
        </OTJRuby>
      </library>
    </OTSystem>
  </objects>
</otrunk>
