[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 6210 - (download) (as text) (annotate)
Sat Mar 20 00:46:38 2010 UTC (9 years, 8 months ago) by gage
File size: 11450 byte(s)
added id tags as well as name tags to input items

    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.24 2010/01/03 17:13:46 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     </script>
   53 END_HEADER_TEXT
   54 
   55 };
   56 
   57 =head3
   58   FlashApplet
   59 
   60   Useage:    $applet = FlashApplet();
   61 
   62 =cut
   63 
   64 sub FlashApplet {
   65   return new FlashApplet(@_);
   66 
   67 }
   68 
   69 sub JavaApplet {
   70   return new JavaApplet(@_);
   71 
   72 }
   73 
   74 package Applet;
   75 
   76 
   77 
   78 =head2 Methods
   79 
   80 =cut
   81 
   82 ## this method is defined in this file
   83 ## because the main subroutines HEADER_TEXT and MODES are
   84 ## not available to the module FlashApplet when that file
   85 ## is compiled (at the time the apache child process is first initialized)
   86 
   87 =head3  insertAll
   88 
   89   Useage:   TEXT( $applet->insertAll() );
   90             \{ $applet->insertAll() \}     (used within BEGIN_TEXT/END_TEXT blocks)
   91 
   92 =cut
   93 
   94 =pod
   95 
   96 Inserts applet at this point in the HTML code.  (In TeX mode a message "Applet" is written.)  This method
   97 also adds the applets header material into the header portion of the HTML page. It effectively inserts
   98 the outputs of both C<$applet-E<gt>insertHeader> and C<$applet-E<gt>insertObject> (defined in L<Applet.pm> )
   99 in the appropriate places.
  100 
  101 Note: This method is defined here rather than in Applet.pl because it
  102       requires access to the RECORD_FORM_LABEL subroutine
  103       and to the routine accessing the stored values of the answers.  These are defined in main::.
  104 
  105 =cut
  106 
  107 sub insertAll {  ## inserts both header text and object text
  108   my $self = shift;
  109   my %options = @_;
  110 
  111   # debugMode can be turned on by setting it to 1 in either the applet definition or at insertAll time
  112   my $debugMode = (defined($options{debug}) and $options{debug}>0) ? $options{debug} : 0;
  113   my $includeAnswerBox = (defined($options{includeAnswerBox}) and $options{includeAnswerBox}==1) ? 1 : 0;
  114   $debugMode = $debugMode || $self->debugMode;
  115     $self->debugMode( $debugMode);
  116 
  117 
  118   my $reset_button = $options{reinitialize_button} || 0;
  119   warn qq! please change  "reset_button=>1" to "reinitialize_button=>1" in the applet->installAll() command \n! if defined($options{reset_button});
  120   # prepare html code for storing state
  121   my $appletName      = $self->appletName;
  122   my $appletStateName = "${appletName}_state";
  123   my $getState        = $self->getStateAlias;
  124   my $setState        = $self->setStateAlias;
  125   my $getConfig       = $self->getConfigAlias;
  126   my $setConfig       = $self->setConfigAlias;
  127 
  128   my $base64_initialState     = encode_base64($self->initialState);
  129   main::RECORD_FORM_LABEL($appletStateName);            #this insures that they'll be saved from one invocation to the next
  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" id = "$appletStateName">$decoded_answer_value</textarea><br/>!;
  162   if ($getState=~/\S/) {   # if getStateAlias is not an empty string
  163     $debug_input_element .= qq!
  164           <input type="button"  value="$getState"
  165                  onClick="debugText='';
  166                           ww_applet_list['$appletName'].getState();
  167                           if (debugText) {alert(debugText)};"
  168           >!;
  169   }
  170   if ($setState=~/\S/) {   # if setStateAlias is not an empty string
  171     $debug_input_element .= qq!
  172           <input type="button"  value="$setState"
  173                  onClick="debugText='';
  174                           ww_applet_list['$appletName'].setState();
  175                           if (debugText) {alert(debugText)};"
  176           >!;
  177   }
  178   if ($getConfig=~/\S/) {   # if getConfigAlias is not an empty string
  179     $debug_input_element .= qq!
  180           <input type="button"  value="$getConfig"
  181                  onClick="debugText='';
  182                           ww_applet_list['$appletName'].getConfig();
  183                           if (debugText) {alert(debugText)};"
  184           >!;
  185   }
  186   if ($setConfig=~/\S/) {   # if setConfigAlias is not an empty string
  187     $debug_input_element .= qq!
  188         <input type="button"  value="$setConfig"
  189                  onClick="debugText='';
  190                           ww_applet_list['$appletName'].setConfig();
  191                           if (debugText) {alert(debugText)};"
  192             >!;
  193     }
  194 
  195   my $state_input_element = ($debugMode) ? $debug_input_element :
  196         qq!\n<input type="hidden" name = "$appletStateName" id = "$appletStateName"  value ="$base_64_encoded_answer_value">!;
  197     my $reset_button_str = ($reset_button) ?
  198             qq!<input type='submit' name='previewAnswers' id ='previewAnswers' value='return this question to its initial state' onClick="setAppletStateToRestart('$appletName')"><br/>!
  199             : ''  ;
  200             # <input type="button" value="reinitialize applet" onClick="getQE('$appletStateName').value='$base64_initialState'"/><br/>
  201   # always base64 encode the hidden answer value to prevent problems with quotes.
  202     #
  203     $state_storage_html_code = qq!<input type="hidden"  name="previous_$appletStateName" id = "previous_$appletStateName"  value = "$base_64_encoded_answer_value">!
  204                               . $state_input_element. $reset_button_str
  205                              ;
  206     my $answerBox_code ='';
  207     if ($includeAnswerBox) {
  208     if ($debugMode) {
  209 
  210       $answerBox_code = $main::BR . main::NAMED_ANS_RULE('answerBox', 50 );
  211       $answerBox_code .= qq!
  212                <br/><input type="button" value="get Answer from applet" onClick="eval(ww_applet_list['$appletName'].submitActionScript )"/>
  213                <br/>
  214               !;
  215     } else {
  216       $answerBox_code = main::NAMED_HIDDEN_ANS_RULE('answerBox', 50 );
  217     }
  218   }
  219     #######
  220     # insert header material
  221     #######
  222   main::HEADER_TEXT($self->insertHeader());
  223   # update the debug mode for this applet.
  224     main::HEADER_TEXT(qq!<script> ww_applet_list["$appletName"].debugMode = $debugMode;\n</script>!);
  225     return main::MODES(TeX=>' {\bf  applet } ', HTML=>$self->insertObject.$main::BR.$state_storage_html_code.$answerBox_code);
  226 }
  227 
  228 =head3 Example problem
  229 
  230 
  231 =cut
  232 
  233 
  234 
  235 =pod
  236 
  237 
  238   DOCUMENT();
  239 
  240   # Load whatever macros you need for the problem
  241   loadMacros("PG.pl",
  242          "PGbasicmacros.pl",
  243          "PGchoicemacros.pl",
  244          "PGanswermacros.pl",
  245          "AppletObjects.pl",
  246          "MathObjects.pl",
  247          "source.pl"
  248         );
  249 
  250   ## Do NOT show partial correct answers
  251   $showPartialCorrectAnswers = 0;
  252 
  253 
  254 
  255   ###################################
  256   # Create  link to applet
  257   ###################################
  258 
  259   $applet = FlashApplet();
  260   my $appletName = "ExternalInterface";
  261   $applet->codebase(findAppletCodebase("$appletName.swf"));
  262   $applet->appletName($appletName);
  263   $applet->appletId($appletName);
  264 
  265   # findAppletCodebase looks for the applet in a list
  266   # of locations specified in global.conf
  267 
  268   ###################################
  269   # Add additional javaScript functions to header section of HTML to
  270   # communicate with the "ExternalInterface" applet.
  271   ###################################
  272 
  273   $applet->header(<<'END_HEADER');
  274   <script type="text/javascript" src="https://devel.webwork.rochester.edu:8002/webwork2_files/js/BrowserSniffer.js">
  275   </script>
  276 
  277 
  278   <script language="JavaScript">
  279     function getBrowser() {
  280         //alert("look for sniffer");
  281       var sniffer = new BrowserSniffer();
  282       //alert("found sniffer" +sniffer);
  283       return sniffer;
  284     }
  285 
  286     function updateStatus(sMessage) {
  287         getQE("playbackStatus").value = sMessage;
  288     }
  289 
  290     function newColor() {
  291 
  292       getApplet("ExternalInterface").updateColor(Math.round(Math.random() * 0xFFFFFF));
  293     }
  294 
  295   </script>
  296   END_HEADER
  297 
  298   ###################################
  299   # Configure applet
  300   ###################################
  301 
  302   # not used here.  Allows for uploading an xml string for the applet
  303 
  304 
  305 
  306 
  307   ###################################
  308   # write the text for the problem
  309   ###################################
  310 
  311   TEXT(beginproblem());
  312 
  313 
  314 
  315   BEGIN_TEXT
  316   \{ $applet->insertAll() \}
  317     $PAR
  318 
  319     The Flash object operates above this line.  The box and button below this line are part of
  320     the WeBWorK problem.  They communicate with the Flash object.
  321     $HR
  322     Status <input type="text" id="playbackStatus" value="started" /><br />
  323     Color <input type="button" value="new color" name="newColorButton" onClick="newColor()" />
  324      $PAR $HR
  325      This flash applet was created by Barbara Kaskosz.
  326 
  327   END_TEXT
  328 
  329   ENDDOCUMENT();
  330 
  331 
  332 
  333 
  334 =cut

aubreyja at gmail dot com
ViewVC Help
Powered by ViewVC 1.0.9