[system] / trunk / pg / macros / AppletObjects.pl Repository:
ViewVC logotype

View of /trunk/pg/macros/AppletObjects.pl

Parent Directory Parent Directory | Revision Log Revision Log


Revision 6026 - (download) (as text) (annotate)
Sun Mar 15 19:25:03 2009 UTC (10 years, 6 months ago) by gage
File size: 10596 byte(s)
Added documentation for applet API

added initialState to the instance variables

    1 ################################################################################
    2 # WeBWorK Online Homework Delivery System
    3 # Copyright  2000-2007 The WeBWorK Project, http://openwebwork.sf.net/
    4 # $CVSHeader: pg/macros/AppletObjects.pl,v 1.18 2009/03/10 12:07:47 gage Exp $
    5 #
    6 # This program is free software; you can redistribute it and/or modify it under
    7 # the terms of either: (a) the GNU General Public License as published by the
    8 # Free Software Foundation; either version 2, or (at your option) any later
    9 # version, or (b) the "Artistic License" which comes with this package.
   10 #
   11 # This program is distributed in the hope that it will be useful, but WITHOUT
   12 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
   13 # FOR A PARTICULAR PURPOSE.  See either the GNU General Public License or the
   14 # Artistic License for more details.
   15 ################################################################################
   16 
   17 =head1 NAME
   18 
   19 AppletObjects.pl - Macro-based front end for the Applet.pm module.
   20 
   21 
   22 =head1 DESCRIPTION
   23 
   24 This subroutines in this
   25 file provide mechanisms to insert Flash applets (and  Java applets)
   26 into a WeBWorK problem.
   27 
   28 
   29 =head1 SEE ALSO
   30 
   31 L<Applets.pm>.
   32 
   33 =cut
   34 
   35 #########################################################################
   36 #
   37 # Add basic functionality to the header of the question
   38 #
   39 # don't reload this file
   40 #########################################################################
   41 
   42 sub _AppletObjects_init{
   43 
   44 main::HEADER_TEXT(<<'END_HEADER_TEXT');
   45   <script language="javascript">AC_FL_RunContent = 0;</script>
   46     <script src="/webwork2_files/applets/AC_RunActiveContent.js" language="javascript">
   47     </script>
   48     <script src="/webwork2_files/js/Base64.js" language="javascript">
   49     </script>
   50     <script src="/webwork2_files/js/ww_applet_support.js">
   51         //upload functions stored in /opt/webwork/webwork2/htdocs/js ...
   52 
   53     </script>
   54 END_HEADER_TEXT
   55 
   56 };
   57 
   58 =head3
   59   FlashApplet
   60 
   61   Useage:    $applet = FlashApplet();
   62 
   63 =cut
   64 
   65 sub FlashApplet {
   66   return new FlashApplet(@_);
   67 
   68 }
   69 
   70 sub JavaApplet {
   71   return new JavaApplet(@_);
   72 
   73 }
   74 
   75 package Applet;
   76 
   77 
   78 
   79 =head2 Methods
   80 
   81 =cut
   82 
   83 ## this method is defined in this file
   84 ## because the main subroutines HEADER_TEXT and MODES are
   85 ## not available to the module FlashApplet when that file
   86 ## is compiled (at the time the apache child process is first initialized)
   87 
   88 =head3  insertAll
   89 
   90   Useage:   TEXT( $applet->insertAll() );
   91             \{ $applet->insertAll() \}     (used within BEGIN_TEXT/END_TEXT blocks)
   92 
   93 =cut
   94 
   95 =pod
   96 
   97 Inserts applet at this point in the HTML code.  (In TeX mode a message "Applet" is written.)  This method
   98 also adds the applets header material into the header portion of the HTML page. It effectively inserts
   99 the outputs of both C<$applet-E<gt>insertHeader> and C<$applet-E<gt>insertObject> (defined in L<Applet.pm> )
  100 in the appropriate places.
  101 
  102 Note: This method is defined here rather than in Applet.pl because it
  103       requires access to the RECORD_FORM_LABEL subroutine
  104       and to the routine accessing the stored values of the answers.  These are defined in main::.
  105 
  106 =cut
  107 
  108 sub insertAll {  ## inserts both header text and object text
  109   my $self = shift;
  110   my %options = @_;
  111 
  112   # debugMode can be turned on by setting it to 1 in either the applet definition or at insertAll time
  113   my $debugMode = (defined($options{debug}) and $options{debug}==1) ? 1 : 0;
  114   $debugMode = $debugMode || $self->debugMode;
  115     $self->debugMode( $debugMode);
  116 
  117 
  118   my $reset_button = $options{reset_button} || 0;
  119   # prepare html code for storing state
  120   my $appletName      = $self->appletName;
  121   my $appletStateName = "${appletName}_state";
  122   my $getState        = $self->getStateAlias;
  123   my $setState        = $self->setStateAlias;
  124   my $getConfig       = $self->getConfigAlias;
  125   my $setConfig       = $self->setConfigAlias;
  126 
  127   my $base64_initialState     = $self->base64_state;
  128   main::RECORD_FORM_LABEL($appletStateName);            #this insures that they'll be saved from one invocation to the next
  129   #main::RECORD_FORM_LABEL("previous_$appletStateName");
  130     my $answer_value = '';
  131 
  132     if ( defined( ${$main::inputs_ref}{$appletStateName} ) and ${$main::inputs_ref}{$appletStateName} =~ /\S/ ) {
  133     $answer_value = ${$main::inputs_ref}{$appletStateName};
  134   } elsif ( defined( $main::rh_sticky_answers->{$appletStateName} )  ) {
  135       warn "type of sticky answers is ", ref( $main::rh_sticky_answers->{$appletStateName} );
  136     $answer_value = shift( @{ $main::rh_sticky_answers->{$appletStateName} });
  137   }
  138   $answer_value =~ tr/\\$@`//d;   #`## make sure student answers can not be interpolated by e.g. EV3
  139   $answer_value =~ s/\s+/ /g;     ## remove excessive whitespace from student answer
  140   #######
  141   # insert a hidden variable to hold the applet's state (debug =>1 makes it visible for debugging and provides debugging buttons)
  142   #######
  143   my $base_64_encoded_answer_value;
  144   my $decoded_answer_value;
  145   if ( $answer_value =~/<XML|<?xml/i) {
  146     $base_64_encoded_answer_value = encode_base64($answer_value);
  147     $decoded_answer_value = $answer_value;
  148   } else {
  149     $decoded_answer_value = decode_base64($answer_value);
  150     if ( $decoded_answer_value =~/<XML|<?xml/i) {  # great, we've decoded the answer to obtain an xml string
  151       $base_64_encoded_answer_value = $answer_value;
  152     } else {    #WTF??  apparently we don't have XML tags
  153       $answer_value = "<xml>$answer_value</xml>";
  154       $base_64_encoded_answer_value = encode_base64($answer_value);
  155       $decoded_answer_value = $answer_value;
  156     }
  157   }
  158   $base_64_encoded_answer_value =~ s/\r|\n//g;    # get rid of line returns
  159     # debug version of the applet state answerBox and controls
  160     my $debug_input_element  = qq!\n<textarea  rows="4" cols="80"
  161      name = "$appletStateName">$decoded_answer_value</textarea><br/>
  162           <input type="button"  value="$getState"
  163                  onClick="debugText='';
  164                           ww_applet_list['$appletName'].getState();
  165                           alert(debugText);"
  166           >
  167           <input type="button"  value="$setState"
  168                  onClick="debugText='';
  169                           ww_applet_list['$appletName'].setState();
  170                           alert(debugText);"
  171           >
  172           <input type="button"  value="$getConfig"
  173                  onClick="debugText='';
  174                           ww_applet_list['$appletName'].getConfig()";                        "
  175           >
  176         <input type="button"  value="$setConfig"
  177                  onClick="debugText='';
  178                           ww_applet_list['$appletName'].setConfig();
  179                           alert(debugText);"
  180             >
  181     !;
  182 
  183   my $state_input_element = ($debugMode) ? $debug_input_element :
  184         qq!\n<input type="hidden" name = "$appletStateName" value ="$base_64_encoded_answer_value">!;
  185     my $reset_button_str = ($reset_button) ?
  186             qq!<br/><input type='button' value='set applet state to restart' onClick="setAppletStateToRestart('$appletName')">
  187                     <input type="button" value="reinitialize applet" onClick="getQE('$appletStateName').value='$base64_initialState'"/><br/>!
  188             : ''
  189     ;
  190   # always base64 encode the hidden answer value to prevent problems with quotes.
  191     #
  192     $state_storage_html_code = qq!<input type="hidden"  name="previous_$appletStateName" value = "$base_64_encoded_answer_value">!
  193                               . $reset_button_str
  194                               . $state_input_element
  195                              ;
  196     $answerBox_code = qq!<br/><input type="input" name="answerBox" value="" size =50><br/>
  197                          <input type="button" value="get Answer from applet" onClick="eval(ww_applet_list['$appletName'].submitActionScript )"/>
  198                          <br/>
  199                         !;
  200     $answerBox_code = ($debugMode) ? $answerBox_code : q!<input type="hidden" name="answerBox" value="" size =50>!;
  201     #######
  202     # insert header material
  203     #######
  204   main::HEADER_TEXT($self->insertHeader());
  205   # update the debug mode for this applet.
  206     main::HEADER_TEXT(qq!<script> ww_applet_list["$appletName"].debugMode = $debugMode;\n</script>!);
  207     return main::MODES(TeX=>' {\bf  applet } ', HTML=>$self->insertObject.$main::BR.$state_storage_html_code.$answerBox_code);
  208 }
  209 
  210 =head3 Example problem
  211 
  212 
  213 =cut
  214 
  215 
  216 
  217 =pod
  218 
  219 
  220   DOCUMENT();
  221 
  222   # Load whatever macros you need for the problem
  223   loadMacros("PG.pl",
  224          "PGbasicmacros.pl",
  225          "PGchoicemacros.pl",
  226          "PGanswermacros.pl",
  227          "AppletObjects.pl",
  228          "MathObjects.pl",
  229          "source.pl"
  230         );
  231 
  232   ## Do NOT show partial correct answers
  233   $showPartialCorrectAnswers = 0;
  234 
  235 
  236 
  237   ###################################
  238   # Create  link to applet
  239   ###################################
  240 
  241   $applet = FlashApplet();
  242   my $appletName = "ExternalInterface";
  243   $applet->codebase(findAppletCodebase("$appletName.swf"));
  244   $applet->appletName($appletName);
  245   $applet->appletId($appletName);
  246 
  247   # findAppletCodebase looks for the applet in a list
  248   # of locations specified in global.conf
  249 
  250   ###################################
  251   # Add additional javaScript functions to header section of HTML to
  252   # communicate with the "ExternalInterface" applet.
  253   ###################################
  254 
  255   $applet->header(<<'END_HEADER');
  256   <script type="text/javascript" src="https://devel.webwork.rochester.edu:8002/webwork2_files/js/BrowserSniffer.js">
  257   </script>
  258 
  259 
  260   <script language="JavaScript">
  261     function getBrowser() {
  262         //alert("look for sniffer");
  263       var sniffer = new BrowserSniffer();
  264       //alert("found sniffer" +sniffer);
  265       return sniffer;
  266     }
  267 
  268     function updateStatus(sMessage) {
  269         getQE("playbackStatus").value = sMessage;
  270     }
  271 
  272     function newColor() {
  273 
  274       getApplet("ExternalInterface").updateColor(Math.round(Math.random() * 0xFFFFFF));
  275     }
  276 
  277   </script>
  278   END_HEADER
  279 
  280   ###################################
  281   # Configure applet
  282   ###################################
  283 
  284   # not used here.  Allows for uploading an xml string for the applet
  285 
  286 
  287 
  288 
  289   ###################################
  290   # write the text for the problem
  291   ###################################
  292 
  293   TEXT(beginproblem());
  294 
  295 
  296 
  297   BEGIN_TEXT
  298   \{ $applet->insertAll() \}
  299     $PAR
  300 
  301     The Flash object operates above this line.  The box and button below this line are part of
  302     the WeBWorK problem.  They communicate with the Flash object.
  303     $HR
  304     Status <input type="text" id="playbackStatus" value="started" /><br />
  305     Color <input type="button" value="new color" name="newColorButton" onClick="newColor()" />
  306      $PAR $HR
  307      This flash applet was created by Barbara Kaskosz.
  308 
  309   END_TEXT
  310 
  311   ENDDOCUMENT();
  312 
  313 
  314 
  315 
  316 =cut

aubreyja at gmail dot com
ViewVC Help
Powered by ViewVC 1.0.9