[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 5993 - (download) (as text) (annotate)
Sat Feb 7 22:27:29 2009 UTC (10 years, 7 months ago) by gage
File size: 9567 byte(s)
Reworked applet support code to use more object oriented approach.

    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.12 2009/01/17 03:25:31 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 
   45 main::HEADER_TEXT(<<'END_HEADER_TEXT');
   46   <script language="javascript">AC_FL_RunContent = 0;</script>
   47     <script src="/webwork2_files/applets/AC_RunActiveContent.js" language="javascript">
   48     </script>
   49     <script src="/webwork2_files/js/Base64.js" language="javascript">
   50     </script>
   51     <script src="/webwork2_files/js/ww_applet_support.js">
   52         //upload functions stored in /opt/webwork/webwork2/htdocs/js ...
   53      </script>
   54 
   55 END_HEADER_TEXT
   56 
   57 };
   58 
   59 =head3
   60   FlashApplet
   61 
   62   Useage:    $applet = FlashApplet();
   63 
   64 =cut
   65 
   66 sub FlashApplet {
   67   return new FlashApplet(@_);
   68 
   69 }
   70 
   71 sub JavaApplet {
   72   return new JavaApplet(@_);
   73 
   74 }
   75 
   76 package Applet;
   77 
   78 
   79 
   80 =head2 Methods
   81 
   82 =cut
   83 
   84 ## this method is defined in this file
   85 ## because the main subroutines HEADER_TEXT and MODES are
   86 ## not available to the module FlashApplet when that file
   87 ## is compiled (at the time the apache child process is first initialized)
   88 
   89 =head3  insertAll
   90 
   91   Useage:   TEXT( $applet->insertAll() );
   92             \{ $applet->insertAll() \}     (used within BEGIN_TEXT/END_TEXT blocks)
   93 
   94 =cut
   95 
   96 =pod
   97 
   98 Inserts applet at this point in the HTML code.  (In TeX mode a message "Applet" is written.)  This method
   99 also adds the applets header material into the header portion of the HTML page. It effectively inserts
  100 the outputs of both C<$applet-E<gt>insertHeader> and C<$applet-E<gt>insertObject> (defined in L<Applet.pm> )
  101 in the appropriate places.
  102 
  103 Note: This method is defined here rather than in Applet.pl because it
  104       requires access to the RECORD_FORM_LABEL subroutine
  105       and to the routine accessing the stored values of the answers.  These are defined in main::.
  106 
  107 =cut
  108 
  109 sub insertAll {  ## inserts both header text and object text
  110   my $self = shift;
  111   my %options = @_;
  112   $self->debug( (defined($options{debug}) and $options{debug}==1) ? 1 : 0 );
  113   my $reset_button = $options{reset_button} || 0;
  114   # prepare html code for storing state
  115   my $appletName      = $self->appletName;
  116   my $appletStateName = "${appletName}_state";
  117   my $getState        = $self->getStateAlias;
  118   my $setState        = $self->setStateAlias;
  119   my $base64_initialState     = $self->base64_state;
  120   main::RECORD_FORM_LABEL($appletStateName);            #this insures that they'll be saved from one invocation to the next
  121   #main::RECORD_FORM_LABEL("previous_$appletStateName");
  122     my $answer_value = '';
  123 
  124     if ( defined( ${$main::inputs_ref}{$appletStateName} ) and ${$main::inputs_ref}{$appletStateName} =~ /\S/ ) {
  125     $answer_value = ${$main::inputs_ref}{$appletStateName};
  126   } elsif ( defined( $main::rh_sticky_answers->{$appletStateName} )  ) {
  127       warn "type of sticky answers is ", ref( $main::rh_sticky_answers->{$appletStateName} );
  128     $answer_value = shift( @{ $main::rh_sticky_answers->{$appletStateName} });
  129   }
  130   $answer_value =~ tr/\\$@`//d;   #`## make sure student answers can not be interpolated by e.g. EV3
  131   $answer_value =~ s/\s+/ /g;     ## remove excessive whitespace from student answer
  132   #######
  133   # insert a hidden variable to hold the applet's state (debug =>1 makes it visible for debugging and provides debugging buttons)
  134   #######
  135   my $base_64_encoded_answer_value;
  136   my $decoded_answer_value;
  137   if ( $answer_value =~/<XML|<?xml/i) {
  138     $base_64_encoded_answer_value = encode_base64($answer_value);
  139     $decoded_answer_value = $answer_value;
  140   } else {
  141     $decoded_answer_value = decode_base64($answer_value);
  142     if ( $decoded_answer_value =~/<XML|<?xml/i) {  # great, we've decoded the answer to obtain an xml string
  143       $base_64_encoded_answer_value = $answer_value;
  144     } else {    #WTF??  apparently we don't have XML tags
  145       $answer_value = "<xml>$answer_value</xml>";
  146       $base_64_encoded_answer_value = encode_base64($answer_value);
  147       $decoded_answer_value = $answer_value;
  148     }
  149   }
  150   $base_64_encoded_answer_value =~ s/\r|\n//g;    # get rid of line returns
  151     # debug version of the applet state answerBox and controls
  152     my $debug_input_element  = qq!\n<textarea  rows="4" cols="80"
  153      name = "$appletStateName">$decoded_answer_value</textarea><br/>
  154           <input type="button"  value="$getState"
  155                  onClick="debugText='';
  156                           ww_applet_list['$appletName'].getState();
  157                           alert(debugText);"
  158           >
  159           <input type="button"  value="$setState"
  160                  onClick="debugText='';
  161                           ww_applet_list['$appletName'].setState();
  162                           alert(debugText);"
  163           >
  164     !;
  165   my $state_input_element = ($self->debug == 1) ? $debug_input_element :
  166         qq!\n<input type="hidden" name = "$appletStateName" value ="$base_64_encoded_answer_value">!;
  167     my $reset_button_str = ($reset_button) ?
  168             qq!<br/><input type='button' value='set applet state empty' onClick="setEmptyState('$appletName')">
  169                     <input type="button" value="reinitialize applet" onClick="getQE('$appletStateName').value='$base64_initialState'"/>!
  170             : ''
  171     ;
  172   # always base64 encode the hidden answer value to prevent problems with quotes.
  173     #
  174   $state_storage_html_code =
  175                       $reset_button_str.
  176                       $state_input_element.
  177                         qq!<input type="hidden"  name="previous_$appletStateName" value = "$base_64_encoded_answer_value">!;
  178     $state_storage_html_code = qq!<input type="hidden"  name="previous_$appletStateName" value = "$base_64_encoded_answer_value">!
  179                               . $reset_button_str
  180                               . $state_input_element
  181                              ;
  182     #######
  183     # insert header material
  184     #######
  185   main::HEADER_TEXT($self->insertHeader());
  186     return main::MODES(TeX=>' {\bf  applet } ', HTML=>$self->insertObject.$main::BR.$state_storage_html_code);
  187 }
  188 
  189 =head3 Example problem
  190 
  191 
  192 =cut
  193 
  194 
  195 
  196 =pod
  197 
  198 
  199   DOCUMENT();
  200 
  201   # Load whatever macros you need for the problem
  202   loadMacros("PG.pl",
  203          "PGbasicmacros.pl",
  204          "PGchoicemacros.pl",
  205          "PGanswermacros.pl",
  206          "AppletObjects.pl",
  207          "MathObjects.pl",
  208          "source.pl"
  209         );
  210 
  211   ## Do NOT show partial correct answers
  212   $showPartialCorrectAnswers = 0;
  213 
  214 
  215 
  216   ###################################
  217   # Create  link to applet
  218   ###################################
  219 
  220   $applet = FlashApplet();
  221   my $appletName = "ExternalInterface";
  222   $applet->codebase(findAppletCodebase("$appletName.swf"));
  223   $applet->appletName($appletName);
  224   $applet->appletId($appletName);
  225 
  226   # findAppletCodebase looks for the applet in a list
  227   # of locations specified in global.conf
  228 
  229   ###################################
  230   # Add additional javaScript functions to header section of HTML to
  231   # communicate with the "ExternalInterface" applet.
  232   ###################################
  233 
  234   $applet->header(<<'END_HEADER');
  235   <script type="text/javascript" src="https://devel.webwork.rochester.edu:8002/webwork2_files/js/BrowserSniffer.js">
  236   </script>
  237 
  238 
  239   <script language="JavaScript">
  240     function getBrowser() {
  241         //alert("look for sniffer");
  242       var sniffer = new BrowserSniffer();
  243       //alert("found sniffer" +sniffer);
  244       return sniffer;
  245     }
  246 
  247     function updateStatus(sMessage) {
  248         getQE("playbackStatus").value = sMessage;
  249     }
  250 
  251     function newColor() {
  252 
  253       getApplet("ExternalInterface").updateColor(Math.round(Math.random() * 0xFFFFFF));
  254     }
  255 
  256   </script>
  257   END_HEADER
  258 
  259   ###################################
  260   # Configure applet
  261   ###################################
  262 
  263   # not used here.  Allows for uploading an xml string for the applet
  264 
  265 
  266 
  267 
  268   ###################################
  269   # write the text for the problem
  270   ###################################
  271 
  272   TEXT(beginproblem());
  273 
  274 
  275 
  276   BEGIN_TEXT
  277   \{ $applet->insertAll() \}
  278     $PAR
  279 
  280     The Flash object operates above this line.  The box and button below this line are part of
  281     the WeBWorK problem.  They communicate with the Flash object.
  282     $HR
  283     Status <input type="text" id="playbackStatus" value="started" /><br />
  284     Color <input type="button" value="new color" name="newColorButton" onClick="newColor()" />
  285      $PAR $HR
  286      This flash applet was created by Barbara Kaskosz.
  287 
  288   END_TEXT
  289 
  290   ENDDOCUMENT();
  291 
  292 
  293 
  294 
  295 =cut

aubreyja at gmail dot com
ViewVC Help
Powered by ViewVC 1.0.9