[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 6030 - (download) (as text) (annotate)
Sun Mar 22 18:33:06 2009 UTC (10 years, 7 months ago) by gage
File size: 10811 byte(s)
minor changes to refine the applet interface and to make
it work smoothly in both debuMode and non-debugMode

Also changed the name of the reset_button to the reinitialize_button
and the title the button carries

    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.19 2009/03/15 19:25:03 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   my $includeAnswerBox = (defined($options{includeAnswerBox}) and $options{includeAnswerBox}==1) ? 1 : 0;
  115   $debugMode = $debugMode || $self->debugMode;
  116     $self->debugMode( $debugMode);
  117 
  118 
  119   my $reset_button = $options{reinitialize_button} || 0;
  120   warn qq! please change  "reset_button=>1" to "reinitialize_button=>1" in the applet->installAll() command ! if defined($options{reset_button});
  121   # prepare html code for storing state
  122   my $appletName      = $self->appletName;
  123   my $appletStateName = "${appletName}_state";
  124   my $getState        = $self->getStateAlias;
  125   my $setState        = $self->setStateAlias;
  126   my $getConfig       = $self->getConfigAlias;
  127   my $setConfig       = $self->setConfigAlias;
  128 
  129   my $base64_initialState     = encode_base64($self->initialState);
  130   main::RECORD_FORM_LABEL($appletStateName);            #this insures that they'll be saved from one invocation to the next
  131     my $answer_value = '';
  132 
  133     if ( defined( ${$main::inputs_ref}{$appletStateName} ) and ${$main::inputs_ref}{$appletStateName} =~ /\S/ ) {
  134     $answer_value = ${$main::inputs_ref}{$appletStateName};
  135   } elsif ( defined( $main::rh_sticky_answers->{$appletStateName} )  ) {
  136       warn "type of sticky answers is ", ref( $main::rh_sticky_answers->{$appletStateName} );
  137     $answer_value = shift( @{ $main::rh_sticky_answers->{$appletStateName} });
  138   }
  139   $answer_value =~ tr/\\$@`//d;   #`## make sure student answers can not be interpolated by e.g. EV3
  140   $answer_value =~ s/\s+/ /g;     ## remove excessive whitespace from student answer
  141   #######
  142   # insert a hidden variable to hold the applet's state (debug =>1 makes it visible for debugging and provides debugging buttons)
  143   #######
  144   my $base_64_encoded_answer_value;
  145   my $decoded_answer_value;
  146   if ( $answer_value =~/<XML|<?xml/i) {
  147     $base_64_encoded_answer_value = encode_base64($answer_value);
  148     $decoded_answer_value = $answer_value;
  149   } else {
  150     $decoded_answer_value = decode_base64($answer_value);
  151     if ( $decoded_answer_value =~/<XML|<?xml/i) {  # great, we've decoded the answer to obtain an xml string
  152       $base_64_encoded_answer_value = $answer_value;
  153     } else {    #WTF??  apparently we don't have XML tags
  154       $answer_value = "<xml>$answer_value</xml>";
  155       $base_64_encoded_answer_value = encode_base64($answer_value);
  156       $decoded_answer_value = $answer_value;
  157     }
  158   }
  159   $base_64_encoded_answer_value =~ s/\r|\n//g;    # get rid of line returns
  160     # debug version of the applet state answerBox and controls
  161     my $debug_input_element  = qq!\n<textarea  rows="4" cols="80"
  162      name = "$appletStateName">$decoded_answer_value</textarea><br/>
  163           <input type="button"  value="$getState"
  164                  onClick="debugText='';
  165                           ww_applet_list['$appletName'].getState();
  166                           alert(debugText);"
  167           >
  168           <input type="button"  value="$setState"
  169                  onClick="debugText='';
  170                           ww_applet_list['$appletName'].setState();
  171                           alert(debugText);"
  172           >
  173           <input type="button"  value="$getConfig"
  174                  onClick="debugText='';
  175                           ww_applet_list['$appletName'].getConfig()";                        "
  176           >
  177         <input type="button"  value="$setConfig"
  178                  onClick="debugText='';
  179                           ww_applet_list['$appletName'].setConfig();
  180                           alert(debugText);"
  181             >
  182     !;
  183 
  184   my $state_input_element = ($debugMode) ? $debug_input_element :
  185         qq!\n<input type="hidden" name = "$appletStateName" value ="$base_64_encoded_answer_value">!;
  186     my $reset_button_str = ($reset_button) ?
  187             qq!<input type='button' value='return this question to its initial state' onClick="setAppletStateToRestart('$appletName')"><br/>!
  188             : ''  ;
  189             # <input type="button" value="reinitialize applet" onClick="getQE('$appletStateName').value='$base64_initialState'"/><br/>
  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                               . $state_input_element. $reset_button_str
  194                              ;
  195     my $answerBox_code ='';
  196     if ($includeAnswerBox) {
  197     if ($debugMode) {
  198 
  199       $answerBox_code = $main::BR . main::NAMED_ANS_RULE('answerBox', 50 );
  200       $answerBox_code .= qq!
  201                <br/><input type="button" value="get Answer from applet" onClick="eval(ww_applet_list['$appletName'].submitActionScript )"/>
  202                <br/>
  203               !;
  204     } else {
  205       $answerBox_code = main::NAMED_HIDDEN_ANS_RULE('answerBox', 50 );
  206     }
  207   }
  208     #######
  209     # insert header material
  210     #######
  211   main::HEADER_TEXT($self->insertHeader());
  212   # update the debug mode for this applet.
  213     main::HEADER_TEXT(qq!<script> ww_applet_list["$appletName"].debugMode = $debugMode;\n</script>!);
  214     return main::MODES(TeX=>' {\bf  applet } ', HTML=>$self->insertObject.$main::BR.$state_storage_html_code.$answerBox_code);
  215 }
  216 
  217 =head3 Example problem
  218 
  219 
  220 =cut
  221 
  222 
  223 
  224 =pod
  225 
  226 
  227   DOCUMENT();
  228 
  229   # Load whatever macros you need for the problem
  230   loadMacros("PG.pl",
  231          "PGbasicmacros.pl",
  232          "PGchoicemacros.pl",
  233          "PGanswermacros.pl",
  234          "AppletObjects.pl",
  235          "MathObjects.pl",
  236          "source.pl"
  237         );
  238 
  239   ## Do NOT show partial correct answers
  240   $showPartialCorrectAnswers = 0;
  241 
  242 
  243 
  244   ###################################
  245   # Create  link to applet
  246   ###################################
  247 
  248   $applet = FlashApplet();
  249   my $appletName = "ExternalInterface";
  250   $applet->codebase(findAppletCodebase("$appletName.swf"));
  251   $applet->appletName($appletName);
  252   $applet->appletId($appletName);
  253 
  254   # findAppletCodebase looks for the applet in a list
  255   # of locations specified in global.conf
  256 
  257   ###################################
  258   # Add additional javaScript functions to header section of HTML to
  259   # communicate with the "ExternalInterface" applet.
  260   ###################################
  261 
  262   $applet->header(<<'END_HEADER');
  263   <script type="text/javascript" src="https://devel.webwork.rochester.edu:8002/webwork2_files/js/BrowserSniffer.js">
  264   </script>
  265 
  266 
  267   <script language="JavaScript">
  268     function getBrowser() {
  269         //alert("look for sniffer");
  270       var sniffer = new BrowserSniffer();
  271       //alert("found sniffer" +sniffer);
  272       return sniffer;
  273     }
  274 
  275     function updateStatus(sMessage) {
  276         getQE("playbackStatus").value = sMessage;
  277     }
  278 
  279     function newColor() {
  280 
  281       getApplet("ExternalInterface").updateColor(Math.round(Math.random() * 0xFFFFFF));
  282     }
  283 
  284   </script>
  285   END_HEADER
  286 
  287   ###################################
  288   # Configure applet
  289   ###################################
  290 
  291   # not used here.  Allows for uploading an xml string for the applet
  292 
  293 
  294 
  295 
  296   ###################################
  297   # write the text for the problem
  298   ###################################
  299 
  300   TEXT(beginproblem());
  301 
  302 
  303 
  304   BEGIN_TEXT
  305   \{ $applet->insertAll() \}
  306     $PAR
  307 
  308     The Flash object operates above this line.  The box and button below this line are part of
  309     the WeBWorK problem.  They communicate with the Flash object.
  310     $HR
  311     Status <input type="text" id="playbackStatus" value="started" /><br />
  312     Color <input type="button" value="new color" name="newColorButton" onClick="newColor()" />
  313      $PAR $HR
  314      This flash applet was created by Barbara Kaskosz.
  315 
  316   END_TEXT
  317 
  318   ENDDOCUMENT();
  319 
  320 
  321 
  322 
  323 =cut

aubreyja at gmail dot com
ViewVC Help
Powered by ViewVC 1.0.9