[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 6079 - (download) (as text) (annotate)
Sun Jul 12 23:38:12 2009 UTC (10 years, 4 months ago) by gage
File size: 10854 byte(s)
Changed how errors are caught in methodDefined() to prevent unneeded error messages in firefox
Made cosmetic corrections to how error messages are reported.

    1 ################################################################################
    2 # WeBWorK Online Homework Delivery System
    3 # Copyright  2000-2007 The WeBWorK Project, http://openwebwork.sf.net/
    4 # $CVSHeader$
    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                           if (debugText) {alert(debugText)};"
  167           >
  168           <input type="button"  value="$setState"
  169                  onClick="debugText='';
  170                           ww_applet_list['$appletName'].setState();
  171                           if (debugText) {alert(debugText)};"
  172           >
  173           <input type="button"  value="$getConfig"
  174                  onClick="debugText='';
  175                           ww_applet_list['$appletName'].getConfig();
  176                           if (debugText) {alert(debugText)};"
  177           >
  178         <input type="button"  value="$setConfig"
  179                  onClick="debugText='';
  180                           ww_applet_list['$appletName'].setConfig();
  181                           if (debugText) {alert(debugText)};"
  182             >
  183     !;
  184 
  185   my $state_input_element = ($debugMode) ? $debug_input_element :
  186         qq!\n<input type="hidden" name = "$appletStateName" value ="$base_64_encoded_answer_value">!;
  187     my $reset_button_str = ($reset_button) ?
  188             qq!<input type='submit' name='previewAnswers' value='return this question to its initial state' onClick="setAppletStateToRestart('$appletName')"><br/>!
  189             : ''  ;
  190             # <input type="button" value="reinitialize applet" onClick="getQE('$appletStateName').value='$base64_initialState'"/><br/>
  191   # always base64 encode the hidden answer value to prevent problems with quotes.
  192     #
  193     $state_storage_html_code = qq!<input type="hidden"  name="previous_$appletStateName" value = "$base_64_encoded_answer_value">!
  194                               . $state_input_element. $reset_button_str
  195                              ;
  196     my $answerBox_code ='';
  197     if ($includeAnswerBox) {
  198     if ($debugMode) {
  199 
  200       $answerBox_code = $main::BR . main::NAMED_ANS_RULE('answerBox', 50 );
  201       $answerBox_code .= qq!
  202                <br/><input type="button" value="get Answer from applet" onClick="eval(ww_applet_list['$appletName'].submitActionScript )"/>
  203                <br/>
  204               !;
  205     } else {
  206       $answerBox_code = main::NAMED_HIDDEN_ANS_RULE('answerBox', 50 );
  207     }
  208   }
  209     #######
  210     # insert header material
  211     #######
  212   main::HEADER_TEXT($self->insertHeader());
  213   # update the debug mode for this applet.
  214     main::HEADER_TEXT(qq!<script> ww_applet_list["$appletName"].debugMode = $debugMode;\n</script>!);
  215     return main::MODES(TeX=>' {\bf  applet } ', HTML=>$self->insertObject.$main::BR.$state_storage_html_code.$answerBox_code);
  216 }
  217 
  218 =head3 Example problem
  219 
  220 
  221 =cut
  222 
  223 
  224 
  225 =pod
  226 
  227 
  228   DOCUMENT();
  229 
  230   # Load whatever macros you need for the problem
  231   loadMacros("PG.pl",
  232          "PGbasicmacros.pl",
  233          "PGchoicemacros.pl",
  234          "PGanswermacros.pl",
  235          "AppletObjects.pl",
  236          "MathObjects.pl",
  237          "source.pl"
  238         );
  239 
  240   ## Do NOT show partial correct answers
  241   $showPartialCorrectAnswers = 0;
  242 
  243 
  244 
  245   ###################################
  246   # Create  link to applet
  247   ###################################
  248 
  249   $applet = FlashApplet();
  250   my $appletName = "ExternalInterface";
  251   $applet->codebase(findAppletCodebase("$appletName.swf"));
  252   $applet->appletName($appletName);
  253   $applet->appletId($appletName);
  254 
  255   # findAppletCodebase looks for the applet in a list
  256   # of locations specified in global.conf
  257 
  258   ###################################
  259   # Add additional javaScript functions to header section of HTML to
  260   # communicate with the "ExternalInterface" applet.
  261   ###################################
  262 
  263   $applet->header(<<'END_HEADER');
  264   <script type="text/javascript" src="https://devel.webwork.rochester.edu:8002/webwork2_files/js/BrowserSniffer.js">
  265   </script>
  266 
  267 
  268   <script language="JavaScript">
  269     function getBrowser() {
  270         //alert("look for sniffer");
  271       var sniffer = new BrowserSniffer();
  272       //alert("found sniffer" +sniffer);
  273       return sniffer;
  274     }
  275 
  276     function updateStatus(sMessage) {
  277         getQE("playbackStatus").value = sMessage;
  278     }
  279 
  280     function newColor() {
  281 
  282       getApplet("ExternalInterface").updateColor(Math.round(Math.random() * 0xFFFFFF));
  283     }
  284 
  285   </script>
  286   END_HEADER
  287 
  288   ###################################
  289   # Configure applet
  290   ###################################
  291 
  292   # not used here.  Allows for uploading an xml string for the applet
  293 
  294 
  295 
  296 
  297   ###################################
  298   # write the text for the problem
  299   ###################################
  300 
  301   TEXT(beginproblem());
  302 
  303 
  304 
  305   BEGIN_TEXT
  306   \{ $applet->insertAll() \}
  307     $PAR
  308 
  309     The Flash object operates above this line.  The box and button below this line are part of
  310     the WeBWorK problem.  They communicate with the Flash object.
  311     $HR
  312     Status <input type="text" id="playbackStatus" value="started" /><br />
  313     Color <input type="button" value="new color" name="newColorButton" onClick="newColor()" />
  314      $PAR $HR
  315      This flash applet was created by Barbara Kaskosz.
  316 
  317   END_TEXT
  318 
  319   ENDDOCUMENT();
  320 
  321 
  322 
  323 
  324 =cut

aubreyja at gmail dot com
ViewVC Help
Powered by ViewVC 1.0.9