[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 6019 - (download) (as text) (annotate)
Tue Mar 10 12:07:47 2009 UTC (10 years, 6 months ago) by gage
File size: 10457 byte(s)
refactored code using methodDefined()
converted configAlias to setConfigAlias
replaced debug by jsDebugMode (for now -- eventually we'll have a debug mode for each applet)

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

aubreyja at gmail dot com
ViewVC Help
Powered by ViewVC 1.0.9