<?xml version="1.0" encoding="UTF-8"?>
<otrunk id="fba5ef80-db43-11dc-95ff-0800200c9a66">
  <imports>
    <import class="org.concord.data.state.OTDataChannelDescription" />
    <import class="org.concord.data.state.OTDataColumnDescription" />
    <import class="org.concord.data.state.OTDataColumnDescription"/>
    <import class="org.concord.data.state.OTDataField" />
    <import class="org.concord.data.state.OTDataStore" />
    <import class="org.concord.data.state.OTDataTable" />
    <import class="org.concord.data.state.OTDataTable"/>
    <import class="org.concord.data.state.OTPropertyDataProducer" />
    <import class="org.concord.data.state.OTWaveGenerator" />
    <import class="org.concord.datagraph.state.OTDataAxis" />
    <import class="org.concord.datagraph.state.OTDataBarGraphable" />
    <import class="org.concord.datagraph.state.OTDataCollector" />
    <import class="org.concord.datagraph.state.OTDataGraph" />
    <import class="org.concord.datagraph.state.OTDataGraphable" />
    <import class="org.concord.datagraph.state.OTDataPointLabel" />
    <import class="org.concord.datagraph.state.OTDataPointRuler" />
    <import class="org.concord.datagraph.state.OTMultiDataGraph" />
    <import class="org.concord.datagraph.state.OTPluginView" />
    <import class="org.concord.examples.smartgraph.OTDataFilterScript" />
    <import class="org.concord.framework.otrunk.view.OTFrame" />
    <import class="org.concord.graph.util.state.OTDrawingImageIcon" />
    <import class="org.concord.graph.util.state.OTDrawingShape" />
    <import class="org.concord.graph.util.state.OTDrawingStamp" />
    <import class="org.concord.graph.util.state.OTDrawingTool" />
    <import class="org.concord.graph.util.state.OTDrawingTool2" />
    <import class="org.concord.graph.util.state.OTPointTextLabel" />
    <import class="org.concord.otrunk.browser.mozswing.OTMozSwing" />
    <import class="org.concord.otrunk.graph.OTDataCollectorViewConfig" />
    <import class="org.concord.otrunk.OTInclude" />
    <import class="org.concord.otrunk.OTProperty" />
    <import class="org.concord.otrunk.OTProperty"/>
    <import class="org.concord.otrunk.OTSystem" />
    <import class="org.concord.otrunk.script.jruby.OTJRuby" />
    <import class="org.concord.otrunk.script.js.OTJavascript" />
    <import class="org.concord.otrunk.script.OTScript" />
    <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.ui.OTButton" />
    <import class="org.concord.otrunk.ui.OTCardContainer" />
    <import class="org.concord.otrunk.ui.OTChoice" />
    <import class="org.concord.otrunk.ui.OTChoiceMultiple" />
    <import class="org.concord.otrunk.ui.OTImage" />
    <import class="org.concord.otrunk.ui.OTModeSwitcher" />
    <import class="org.concord.otrunk.ui.OTSoundPlayer" />
    <import class="org.concord.otrunk.ui.OTText" />
    <import class="org.concord.otrunk.ui.snapshot.OTSnapshot" />
    <import class="org.concord.otrunk.ui.snapshot.OTSnapshotAlbum" />
    <import class="org.concord.otrunk.ui.snapshot.OTSnapshotButton" />
    <import class="org.concord.otrunk.ui.snapshot.OTSnapshotChooser" />
    <import class="org.concord.otrunk.ui.swing.OTChoiceViewConfig" />
    <import class="org.concord.otrunk.util.OTSharingBundle" />
    <import class="org.concord.otrunk.view.document.edit.OTDocumentEditViewConfig" />
    <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.OTFolderObject" />
    <import class="org.concord.otrunk.view.OTViewBundle" />
    <import class="org.concord.otrunk.view.OTViewChild" />
    <import class="org.concord.otrunk.view.OTViewEntry" />
    <import class="org.concord.otrunk.view.OTViewMode" />
    <import class="org.concord.otrunk.view.OTViewService" />
    <import class="org.concord.otrunk.view.prototype.OTPrototypeEventController" />
    <import class="org.concord.otrunk.view.prototype.OTPrototypeMapEntry" />
    <import class="org.concord.otrunk.view.prototype.OTPrototypeViewEntry" />
    <import class="org.concord.otrunkmw.OTModelerPage" />
    <import class="org.concord.otrunknl4.OTNLogoModel" />
    <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.sensor.state.OTZeroSensor" />
    <import class="org.concord.smartgraph.OTDataStoreFilter" />
    <import class="org.concord.smartgraph.OTDataStoreFilter"/>
    <import class="org.concord.smartgraph.OTDataStoreFilterDescription" />
    <import class="org.concord.smartgraph.OTDataStoreFilterDescription"/>

  </imports>
  <objects>
    <OTSystem local_id="system">
      <includes>
        <OTInclude href="../UDL/global-imports/predefined-sensor-graphs.otml" />
      </includes>
      <bundles>
        <OTViewBundle id="8d880970-c22a-11dc-95ff-0800200c9a66" showLeftPanel="false" currentMode="authoring">
          <modes>
            <OTViewMode name="authoring">
              <map>
                <entry key="${moz-swing-view}">
                  <OTViewEntry objectClass="org.concord.otrunk.browser.mozswing.OTMozSwing" viewClass="org.concord.otrunk.browser.mozswing.OTMozSwingEditView" />
                </entry>
                <entry key="${snapshot_button_view}">
                  <OTViewEntry objectClass="org.concord.otrunk.ui.snapshot.OTSnapshotButton" viewClass="org.concord.otrunk.ui.snapshot.OTSnapshotButtonEditView" />
                </entry>
                <entry key="${choice-radio-view}">
                  <OTChoiceViewConfig objectClass="org.concord.otrunk.ui.OTChoice" viewClass="org.concord.otrunk.ui.swing.OTChoiceComboBoxEditView" useViewsAsChoices="true" />
                </entry>
                <entry key="${choice-checkbox-view}">
                  <OTChoiceViewConfig objectClass="org.concord.otrunk.ui.OTChoiceMultiple" viewClass="org.concord.otrunk.ui.swing.OTChoiceComboBoxEditView" useViewsAsChoices="true" />
                </entry>
                <entry key="${data-table-view}">
                  <OTViewEntry objectClass="org.concord.data.state.OTDataTable" viewClass="org.concord.data.state.OTDataTableEditView" />
                </entry>
                <entry key="${netlogo-view}">
                  <OTViewEntry viewClass="org.concord.otrunknl4.OTNLogoModelEditView" objectClass="org.concord.otrunknl4.OTNLogoModel" />
                </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 field" />
                      <OTDrawingTool2 name="Draw tool" />
                      <OTChoice name="Multiple-choice (single answer)" />
                      <OTChoiceMultiple name="Multiple-choice (check boxes)" />
                      <OTDataTable name="Data table" showLastRowForAddingNew="true">
                        <dataStore>
                          <OTDataStore numberChannels="2" />
                        </dataStore>
                      </OTDataTable>
                      <OTDataCollector name="Data graph" title="Data graph">
                        <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>
                        <xDataAxis>
                          <OTDataAxis max="60.0" units="s" min="0.0" label="Time" />
                        </xDataAxis>
                        <yDataAxis>
                          <OTDataAxis max="40.0" units="" min="-0.0" label="" />
                        </yDataAxis>
                      </OTDataCollector>
                      <OTSnapshotButton name="Snapshot button" />
                      <OTSnapshotChooser name="Snapshot chooser" />
                      <OTMozSwing name="Web browser" />
                      <OTSoundPlayer name="Sound player" />
                      <OTModelerPage name="Molecular workbench" authoredDataURL="http://mw2.concord.org/public/student/classic/motion/undershotwaterwheel.cml" />
                      <OTNLogoModel name="NetLogo model" />
                    </objectsToInsert>
                  </OTDocumentEditViewConfig>
                </entry>
                <entry key="${data-collector-view}">
                  <OTDataCollectorViewConfig viewClass="org.concord.otrunk.graph.OTDataCollectorEditView" objectClass="org.concord.datagraph.state.OTDataCollector">
                    <predefinedGraphs>
                      <object refid="088786c2-8719-11dc-8314-0800200c9a66" />
                    </predefinedGraphs>
                  </OTDataCollectorViewConfig>
                </entry>
                <entry key="${drawing-view}">
                  <OTViewEntry viewClass="org.concord.datagraph.state.OTDataDrawingToolEditView" objectClass="org.concord.graph.util.state.OTDrawingTool" />
                </entry>
                <entry key="${text-edit}">
                  <OTViewEntry objectClass="org.concord.otrunk.ui.OTText" viewClass="org.concord.otrunk.ui.swing.OTTextEditEditView" />
                </entry>
                <entry key="${sound-player-view}">
                  <OTViewEntry objectClass="org.concord.otrunk.ui.OTSoundPlayer" viewClass="org.concord.otrunk.ui.swing.OTSoundPlayerEditView" />
                </entry>
                <entry key="${mw-view}">
                  <OTViewEntry objectClass="org.concord.otrunkmw.OTModelerPage" viewClass="org.concord.otrunkmw.OTModelerPageEditView" />
                </entry>
              </map>
            </OTViewMode>
            <OTViewMode name="student">
              <map />
            </OTViewMode>
          </modes>
          <frame>
            <OTFrame useScrollPane="false" width="850" height="600" />
          </frame>
          <views>
            <OTViewEntry objectClass="org.concord.otrunk.script.ui.OTScriptObject" viewClass="org.concord.otrunk.script.ui.OTScriptObjectView"/>
            <OTViewEntry local_id="mw-view" objectClass="org.concord.otrunkmw.OTModelerPage" viewClass="org.concord.otrunkmw.OTModelerPageView" />
            <OTViewEntry objectClass="org.concord.otrunk.OTIncludeRootObject" viewClass="org.concord.otrunk.OTIncludeRootObjectView" />
            <OTViewEntry local_id="moz-swing-view" objectClass="org.concord.otrunk.browser.mozswing.OTMozSwing" viewClass="org.concord.otrunk.browser.mozswing.OTMozSwingView" />
            <OTViewEntry objectClass="org.concord.otrunk.ui.OTModeSwitcher" viewClass="org.concord.otrunk.ui.swing.OTModeSwitcherView" />
            <OTViewEntry objectClass="org.concord.otrunk.ui.OTImage" viewClass="org.concord.otrunk.ui.swing.OTImageView" />
            <OTViewEntry objectClass="org.concord.otrunk.ui.OTModeSwitcher" viewClass="org.concord.otrunk.ui.swing.OTModeSwitcherView" />
            <OTViewEntry local_id="snapshot_button_view" objectClass="org.concord.otrunk.ui.snapshot.OTSnapshotButton" viewClass="org.concord.otrunk.ui.snapshot.OTSnapshotButtonView" />
            <OTViewEntry local_id="snapshot-chooser-view" objectClass="org.concord.otrunk.ui.snapshot.OTSnapshotChooser" viewClass="org.concord.otrunk.ui.snapshot.OTSnapshotChooserView" />
            <OTViewEntry objectClass="org.concord.otrunk.ui.snapshot.OTSnapshotAlbum" viewClass="org.concord.otrunk.ui.snapshot.OTSnapshotAlbumView" />
            <OTViewEntry objectClass="org.concord.otrunk.ui.OTButton" viewClass="org.concord.otrunk.ui.swing.OTButtonView" />
            <OTChoiceViewConfig local_id="choice-checkbox-view" objectClass="org.concord.otrunk.ui.OTChoiceMultiple" viewClass="org.concord.otrunk.ui.swing.OTChoiceCheckBoxView" useViewsAsChoices="true" />
            <OTChoiceViewConfig local_id="choice-radio-view" objectClass="org.concord.otrunk.ui.OTChoice" viewClass="org.concord.otrunk.ui.swing.OTChoiceRadioButtonView" useViewsAsChoices="true" />
            <OTViewEntry id="453a61b0-e18b-11dc-95ff-0800200c9a66" objectClass="org.concord.otrunk.ui.OTChoice" viewClass="org.concord.otrunk.ui.swing.OTChoiceComboBoxView" />
            <OTViewEntry objectClass="org.concord.otrunk.ui.OTCardContainer" viewClass="org.concord.otrunk.ui.swing.OTCardContainerView" />
            <OTViewEntry objectClass="org.concord.otrunk.ui.OTBorderContainer" viewClass="org.concord.otrunk.ui.swing.OTBorderContainerView" />
            <OTViewEntry objectClass="org.concord.otrunk.ui.OTPlacementContainer" viewClass="org.concord.otrunk.ui.swing.OTPlacementContainerView" />
            <OTViewEntry local_id="text-edit" objectClass="org.concord.otrunk.ui.OTText" viewClass="org.concord.otrunk.ui.swing.OTTextEditView" />
            <OTViewEntry objectClass="org.concord.otrunk.ui.OTText" viewClass="org.concord.otrunk.ui.swing.OTTextView" />
            <OTViewEntry local_id="data-collector-view" viewClass="org.concord.datagraph.state.OTDataCollectorView" objectClass="org.concord.datagraph.state.OTDataCollector" />
            <OTViewEntry viewClass="org.concord.datagraph.state.OTDataGraphView" objectClass="org.concord.datagraph.state.OTDataGraph" />
            <OTViewEntry viewClass="org.concord.data.state.OTDataFieldView" objectClass="org.concord.data.state.OTDataField" />
            <OTViewEntry local_id="drawing-view" viewClass="org.concord.datagraph.state.OTDataDrawingToolView" objectClass="org.concord.graph.util.state.OTDrawingTool" />
            <OTViewEntry viewClass="org.concord.datagraph.state.OTMultiDataGraphView" objectClass="org.concord.datagraph.state.OTMultiDataGraph" />
            <OTViewEntry local_id="data-table-view" objectClass="org.concord.data.state.OTDataTable" viewClass="org.concord.data.state.OTDataTableView" />
            <OTViewEntry local_id="netlogo-view" viewClass="org.concord.otrunknl4.OTNLogoModelView" objectClass="org.concord.otrunknl4.OTNLogoModel" />
            <OTViewEntry local_id="sound-player-view" objectClass="org.concord.otrunk.ui.OTSoundPlayer" viewClass="org.concord.otrunk.ui.swing.OTSoundPlayerView" />
            <OTDocumentViewConfig local_id="compound-doc-view" objectClass="org.concord.otrunk.view.document.OTCompoundDoc" viewClass="org.concord.otrunk.view.document.OTDocumentView">
              <cssBlocks>
                <OTCssText cssText="                 body {        font-size: 18;        FONT-STYLE: normal;        FONT-FAMILY: Verdana, Arial;        FONT-VARIANT: normal;       TEXT-DECORATION: none     }" />
              </cssBlocks>
            </OTDocumentViewConfig>
            <OTViewEntry objectClass="org.concord.graph.util.state.OTDrawingTool2" viewClass="org.concord.datagraph.state.OTDataDrawingToolView" />
          </views>
        </OTViewBundle>
        <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" />
          </engines>
        </OTScriptEngineBundle>
        <OTSharingBundle />
        <OTInterfaceManager>
          <deviceConfigs>
            <OTDeviceConfig configString="none" deviceId="10" />
          </deviceConfigs>
        </OTInterfaceManager>
      </bundles>
      <root>
        <OTModeSwitcher>
          <otObject>
            <OTCompoundDoc>
              <bodyText>
                The response from JRuby script_03:
                <p>
                  <object refid="${script_03_text_object}" />
                </p>
                The graph below shows the movement of an object at several points in time.
                <br />
                <br />
                <object refid="b9f16067-204c-11dd-b9fc-a3ab42a2d8df" />
                <br />
                <br />
                A second graph:
                <br />
                <br />
                <object refid="b1b9efd4-2053-11dd-b9fc-a3ab42a2d8de" />
                <br />
                <object refid="${script_03}" />
              </bodyText>
              <documentRefs>
                <OTDataCollector id="b9f16067-204c-11dd-b9fc-a3ab42a2d8df" name="Data graph" title="Data graph">
                  <source>
                    <OTDataGraphable name="Data Graph" connectPoints="true" controllable="true" yColumn="1" drawMarks="true" color="16711680" xColumn="0" lineWidth="2.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>
                <OTDataCollector id="b1b9efd4-2053-11dd-b9fc-a3ab42a2d8de" name="Data graph" title="Data graph">
                  <source>
                    <OTDataGraphable name="Data Graph" connectPoints="true" controllable="true" yColumn="1" drawMarks="true" color="16711680" xColumn="0" lineWidth="2.0">
                      <dataStore>
                        <OTDataStore local_id="datastore_02" 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>
                  <graphables>
                    <object refid="${graphable_01}" />
                  </graphables>
                  <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>
                <OTDataGraphable local_id="graphable_01" name="modified" connectPoints="true" color="16711935" drawMarks="false" xColumn="0" yColumn="1" lineWidth="2.0">
                  <dataStore>
                    <object refid="${datafilter_01}" />
                  </dataStore>
                </OTDataGraphable>
                <OTDataFilterScript local_id="datafilter_01">
                  <description>
                    <OTDataStoreFilterDescription operation="custom script" />
                  </description>
                  <filterScript>
                    <object refid="${script_02}" />
                  </filterScript>
                  <inputDataStore>
                    <object refid="${datastore_01}" />
                  </inputDataStore>
                </OTDataFilterScript>
                <OTJavascript local_id="script_01">
                  <script>importClass(Packages.java.lang.System);
                    importClass(Packages.java.lang.Float);

                    /**
                     * This function returns the y value of the filter 
                     */
                    function filterYValue(x, y)
                    {
                      return y + 1;
                      //return y + 10;    // original y value + 10
                      //return y - y/2; 
                    }</script>
                </OTJavascript>
                <OTJRuby local_id="script_02">
                  <script># 
                    # This function returns the y value of the filter 
                    # 
                    require 'java' 
                    def self.filterYValue(x, y)
                      y + 1
                    end</script>
                </OTJRuby>
                <OTScriptObject local_id="script_03">
                  <variables>
                    <OTScriptVariable name="datastore_02">
                      <reference>
                        <object refid="${datastore_02}" />
                      </reference>
                    </OTScriptVariable>
                    <OTScriptVariable name="displayText">
                      <reference>
                        <object refid="${script_03_text_object}" />
                      </reference>
                    </OTScriptVariable>
                  </variables>
                  <script>
                    <OTJRuby>
                      <script># 
                        # This is intended to subtract 0.25 from the Y values of datastore_02 ... someday
                        # The variables passed in are referenced in JRuby as global variables.
                        # That's why they are prefixed with the '$' character below.
                        require 'java' 
                        
                        def self.init
                          require 'rbconfig'
                          display = ""
                          display += "Ruby version: JRuby #{RUBY_VERSION} (#{RUBY_RELEASE_DATE} [i386-jruby#{JRUBY_VERSION}]"
                          display += ", platform: Java, version #{java.lang.System.getProperty('java.version')}" + "\n\n"
                          display += "self.methods: " + self.methods.join(', ') + "\n\n"
                          display += "$datastore_02.inspect: " + $datastore_02.inspect + "\n\n"
                          display += "getNumberChannels: " + $datastore_02.getNumberChannels.to_s + "\n\n"
                          display += "getValues.get(0): " + $datastore_02.getValues.get(0).to_s + "\n\n"
                          display += "getValues.get(1): " + $datastore_02.getValues.get(1).to_s + "\n\n"
                          display += "getValues.set(1, java.lang.Float.new(0.75)): " + $datastore_02.getValues.set(1, java.lang.Float.new(0.75)) + "\n\n"
                         
                          $displayText.setText(display)
                          # puts self.methods.join(', ')
                        end
                      </script>
                    </OTJRuby>
                  </script>
                </OTScriptObject>
                <OTText local_id="script_03_text_object" />
              </documentRefs>
            </OTCompoundDoc>
          </otObject>
        </OTModeSwitcher>
      </root>
    </OTSystem>
  </objects>
</otrunk>
