[LON-CAPA-cvs] cvs: loncom /interface lonnavmaps.pm lonprintout.pm

foxr foxr@source.lon-capa.org
Mon, 26 Oct 2009 10:16:57 -0000


This is a MIME encoded message

--foxr1256552217
Content-Type: text/plain

foxr		Mon Oct 26 10:16:57 2009 EDT

  Modified files:              
    /loncom/interface	lonnavmaps.pm lonprintout.pm 
  Log:
  Merge in branch that fixes BZ 2851
  
  
--foxr1256552217
Content-Type: text/plain
Content-Disposition: attachment; filename="foxr-20091026101657.txt"

Index: loncom/interface/lonnavmaps.pm
diff -u loncom/interface/lonnavmaps.pm:1.436 loncom/interface/lonnavmaps.pm:1.437
--- loncom/interface/lonnavmaps.pm:1.436	Thu Oct 22 03:04:21 2009
+++ loncom/interface/lonnavmaps.pm	Mon Oct 26 10:16:56 2009
@@ -1,7 +1,8 @@
 # The LearningOnline Network with CAPA
 # Navigate Maps Handler
 #
-# $Id: lonnavmaps.pm,v 1.436 2009/10/22 03:04:21 raeburn Exp $
+# $Id: lonnavmaps.pm,v 1.437 2009/10/26 10:16:56 foxr Exp $
+
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -48,7 +49,7 @@
 
 =head1 OVERVIEW
 
-X<lonnavmaps, overview> When a user enters a course, LON-CAPA examines the
+X<lonnavmaps, overview When a user enters a course, LON-CAPA examines the
 course structure and caches it in what is often referred to as the
 "big hash" X<big hash>. You can see it if you are logged into
 LON-CAPA, in a course, by going to /adm/test. (You may need to
@@ -597,7 +598,7 @@
 	    my ($map,$id,$src)=&Apache::lonnet::decode_symb($res->symb());
 	    if ($map=~/\.page$/) {
 		my $url=&Apache::lonnet::clutter($map);
-		$anchor=&escape($src->shown_symb());
+		$anchor=&escape($res->shown_symb());
 		return ($url,$res->shown_symb(),$anchor);
 	    }
         }
Index: loncom/interface/lonprintout.pm
diff -u loncom/interface/lonprintout.pm:1.561 loncom/interface/lonprintout.pm:1.562
--- loncom/interface/lonprintout.pm:1.561	Tue Sep 22 14:28:50 2009
+++ loncom/interface/lonprintout.pm	Mon Oct 26 10:16:56 2009
@@ -1,7 +1,8 @@
+#
 # The LearningOnline Network
 # Printout
 #
-# $Id: lonprintout.pm,v 1.561 2009/09/22 14:28:50 bisitz Exp $
+# $Id: lonprintout.pm,v 1.562 2009/10/26 10:16:56 foxr Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -26,7 +27,6 @@
 #
 #
 package Apache::lonprintout;
-
 use strict;
 use Apache::Constants qw(:common :http);
 use Apache::lonxml;
@@ -74,6 +74,183 @@
 
 my $font_size = 'normalsize';	# Default is normalsize...
 
+#----------------------------  Helper helpers. -------------------------
+
+#  Returns the text needd for a student chooser.
+#  that text must still be parsed by the helper xml parser.
+# Parameters:
+#   this_state   - State name of the chooser.
+#   sort_choice  - variable to hold the sorting choice.
+#   variable     - Name of variable to hold students.
+#   next_state   - State after chooser.
+
+
+sub generate_student_chooser {
+    my ($this_state, 
+	$sort_choice, 
+	$variable, 
+	$next_state) = @_;
+    my $result = <<CHOOSE_STUDENTS;
+  <state name="$this_state" title="Select Students and Resources">
+      <message><b>Select sorting order of printout</b> </message>
+
+    <choices variable="$sort_choice">
+      <choice computer='0'>Sort by section then student</choice>
+      <choice computer='1'>Sort by students across sections.</choice>
+    </choices>
+
+      <message><br /><hr /><br /> </message>
+      <student multichoice='1' 
+               variable="$variable" 
+               nextstate="$next_state" 
+               coursepersonnel="1" />
+  </state>
+
+CHOOSE_STUDENTS
+
+  return $result;
+}
+
+# Generate the text needed for a resource chooser given the top level of
+# the sequence/page
+#
+# Parameters:
+#     this_state    - State name of the chooser.
+#     prompt_text   - Text to use to prompt user.
+#     resource_options - Resource tag options e.g.
+#                        "multichoice='1', toponly='1', addstatus='1'"
+#                     that control the selection and appearance of the
+#                     resource selector.
+#     variable      - Name of the variable to hold the choice
+#     next_state    - Name of the next state the helper should transition
+#                     to
+#     top_url       - Top level URL within which to make the selector.
+#                     If empty the top level sequence is shown.
+#     filter        - How to filter the resources.
+#     value_func    - <valuefunc> function.
+#     choice_func   - If not empty generates a <choicefunc> with this function.
+#     start_new_option 
+#                   - Fragment appended after valuefunc.
+#
+#
+sub generate_resource_chooser {
+    my ($this_state,
+	$prompt_text,
+	$resource_options,
+	$variable,
+	$next_state,
+	$top_url,
+	$filter,
+	$choice_func,
+	$value_func,
+	$start_new_option)  = @_;
+
+    my $result = <<CHOOSE_RESOURCES;
+<state name="$this_state" title="$prompt_text">
+    <resource variable="$variable" $resource_options
+              closeallpages="1">
+      <nextstate>$next_state</nextstate>
+      <filterfunc>return $filter;</filterfunc>
+CHOOSE_RESOURCES
+    if ($choice_func ne '') {
+	$result .= "<choicefunc>return $choice_func;</choicefunc>";
+    }
+    if ($top_url ne '') {
+	$result .=  "<mapurl>$top_url</mapurl>";
+    }
+    $result .= <<CHOOSE_RESOURCES;
+      <valuefunc>return $value_func;</valuefunc>
+      $start_new_option
+      </resource>
+    </state>
+CHOOSE_RESOURCES
+
+    return $result;
+}
+#
+#   Generate the helper XML for a code choice helper dialog:
+#
+# Paramters:
+#   $helper       - Reference to the helper.
+#   $state        - Name of the state for the chooser.
+#   $next_state   - Name fo the state to follow the chooser.
+#   $bubble_types - Populates the bubble sheet type dropt down.
+#   $code_selections - Provides set of code choices that have been used
+#   $saved_codes  - Provides the list of saved codes.
+#
+# Returns;
+#   The Xml of the code chooser.
+#
+sub generate_code_selector {
+    my ($helper,
+	$state,
+	$next_state,
+	$bubble_types,
+	$code_selections,
+	$saved_codes) = @_;	# Unpack the parameters.
+
+    my $result = <<CHOOSE_ANON1;
+  <state name="$state" title="Specify CODEd Assignments">
+    <nextstate>$next_state</nextstate>
+    <message><h4>Fill out one of the forms below</h4></message>
+    <message><br /><hr /> <br /></message>
+    <message><h3>Generate new CODEd Assignments</h3></message>
+    <message><table><tr><td><b>Number of CODEd assignments to print:</b></td><td></message>
+    <string variable="NUMBER_TO_PRINT_TOTAL" maxlength="5" size="5">
+       <validator>
+	if (((\$helper->{'VARS'}{'NUMBER_TO_PRINT_TOTAL'}+0) < 1) &&
+	    !\$helper->{'VARS'}{'REUSE_OLD_CODES'}                &&
+            !\$helper->{'VARS'}{'SINGLE_CODE'}                    &&
+	    !\$helper->{'VARS'}{'CODE_SELECTED_FROM_LIST'}) {
+	    return "You need to specify the number of assignments to print";
+	}
+	return undef;
+       </validator>
+    </string>
+    <message></td></tr><tr><td></message>
+    <message><b>Names to save the CODEs under for later:</b></message>
+    <message></td><td></message>
+    <string variable="ANON_CODE_STORAGE_NAME" maxlength="50" size="20" />
+    <message></td></tr><tr><td></message>
+    <message><b>Bubble sheet type:</b></message>
+    <message></td><td></message>
+    <dropdown variable="CODE_OPTION" multichoice="0" allowempty="0">
+    $bubble_types
+    </dropdown>
+    <message></td></tr><tr><td colspan="2"></td></tr><tr><td></message>
+    <message></td></tr><tr><td></table></message>
+    <message><br /><hr /><h3>Print a Specific CODE </h3><br /><table></message>
+    <message><tr><td><b>Enter a CODE to print:</b></td><td></message>
+    <string variable="SINGLE_CODE" size="10">
+        <validator>
+	   if(!\$helper->{'VARS'}{'NUMBER_TO_PRINT_TOTAL'}           &&
+	      !\$helper->{'VARS'}{'REUSE_OLD_CODES'}                 &&
+	      !\$helper->{'VARS'}{'CODE_SELECTED_FROM_LIST'}) {
+	      return &Apache::lonprintout::is_code_valid(\$helper->{'VARS'}{'SINGLE_CODE'},
+						      \$helper->{'VARS'}{'CODE_OPTION'});
+	   } else {
+	       return undef;	# Other forces control us.
+	   }
+        </validator>
+    </string>
+    <message></td></tr><tr><td></message>
+        $code_selections
+    <message></td></tr></table></message>
+    <message><hr /><h3>Reprint a Set of Saved CODEs</h3><table><tr><td></message>
+    <message><b>Select saved CODEs:</b></message>
+    <message></td><td></message>
+    <dropdown variable="REUSE_OLD_CODES">
+        $saved_codes
+    </dropdown>
+    <message></td></tr></table></message>
+  </state>
+CHOOSE_ANON1
+
+   return $result;
+}
+
+#-----------------------------------------------------------------------
+
 
 # Fetch the contents of a resource, uninterpreted.
 # This is used here to fetch a latex file to be included
@@ -1343,7 +1520,7 @@
 
 
     if ($mode ne '') {$mode='\\'.$mode}
-    my $result.= &print_latex_header($mode);
+    my $result   =    &print_latex_header($mode);
     if ($currentURL=~m|^(/adm/wrapper/)?ext/|) {
 	$currentURL=~s|^(/adm/wrapper/)?ext/|http://|;
 	my $title=&Apache::lonnet::gettitle($symb);
@@ -1413,9 +1590,6 @@
 
 	    my $texversion = &ssi_with_retries($urlp, $ssi_retry_count, %form);
 
-	    # There seems to be an extraneous \vskip 1mm \\\\ :
-
-	    $texversion =~ s/^\\vskip 1mm \\\\\\\\//;
 
 	    # current document with answers.. no need to encap in minipage
 	    #  since there's only one answer.
@@ -1438,7 +1612,7 @@
 		if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') {
 		    $texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/;
 		} else {
-		    $texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'});
+		    $texversion= &print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'});
 		    if ($helper->{'VARS'}->{'construction'} ne '1') {
 			my $title = &Apache::lonnet::gettitle($helper->{'VARS'}->{'symb'});
 			$title = &Apache::lonxml::latex_special_symbols($title);
@@ -1473,6 +1647,14 @@
 		$texversion=~s/(\\addcontentsline\{toc\}\{subsection\}\{[^\}]*\})/$1 URL: \\verb|$currentURL| \\strut\\\\\\strut /;
 
 	    }
+	    $texversion = &latex_header_footer_remove($texversion);
+
+	    # the first remaining line is a comment from londefdef the second
+	    # line  seems to be an extraneous \vskip 1mm \\\\ :
+            # (imperfect removal from header_footer_remove?
+
+	    $texversion =~ s/\\vskip 1mm \\\\\\\\//;
+
 	    $result .= $texversion;
 	    if ($currentURL=~m/\.page\s*$/) {
 		($result,$numberofcolumns) = &page_cleanup($result);
@@ -1560,7 +1742,7 @@
 #    A reference to a page break hash.
 #
 #
-#use Data::Dumper;
+# use Data::Dumper;
 #sub dump_helper_vars {
 #    my ($helper) = @_;
 #    my $helpervars = Dumper($helper->{'VARS'});
@@ -1962,6 +2144,8 @@
 				  $helper->{'VARS'}->{'symb'});
 	}
     } elsif (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems')       or
+	     ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems_in_page') or
+	     ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_resources_in_page') or
              ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems_pages') or
              ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_problems')       or
 	     ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_resources')      or # BUGBUG
@@ -1970,9 +2154,12 @@
 
 
         #-- produce an output string
-	if ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems') {
+	if (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems')  or
+	    ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems_in_page') ) {
 	    $selectionmade = 2;
-	} elsif ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems_pages') {
+	} elsif (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems_pages') or
+		 ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_resources_in_page'))
+	{
 	    $selectionmade = 3;
 	} elsif (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_problems') 
 		 ) {
@@ -2012,11 +2199,10 @@
 		    $result.="\\newpage\n";
 		}
 	    }
-	    my ($sequence,$middle_thingy,$urlp)=&Apache::lonnet::decode_symb($master_seq[$i]);
+    my ($sequence,$middle_thingy,$urlp)=&Apache::lonnet::decode_symb($master_seq[$i]);
 	    $urlp=&Apache::lonnet::clutter($urlp);
 	    $form{'symb'}=$master_seq[$i];
 
-
 	    my $assignment=&Apache::lonxml::latex_special_symbols(&Apache::lonnet::gettitle($sequence),'header'); #title of the assignment which contains this problem
 
 	    if ($selectionmade==7) {$helper->{VARS}->{'assignment'}=$assignment;}
@@ -2026,9 +2212,9 @@
 		&& $urlp=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)$/) {
 		$resources_printed .= $urlp.':';
 		&Apache::lonxml::remember_problem_counter();
+		
 		$texversion.=&ssi_with_retries($urlp, $ssi_retry_count, %form);
 		if ($urlp=~/\.page$/) {
-
 		    ($texversion,my $number_of_columns_page) = &page_cleanup($texversion);
 		    if ($number_of_columns_page > $number_of_columns) {$number_of_columns=$number_of_columns_page;} 
 		    $texversion =~ s/\\end{document}\d*/\\end{document}/;
@@ -2151,6 +2337,7 @@
 	}	
 	$result .= '\end{document}';
      } elsif (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_students') ||
+	      ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_students_from_page') ||
 	      ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_problems_students') ||
 	      ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'resources_for_students')){
 
@@ -2158,6 +2345,7 @@
      #-- prints assignments for whole class or for selected students  
 	 my $type;
 	 if (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_students') ||
+	     ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_students_from_page') ||
 	     ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_problems_students') ) {
 	     $selectionmade=5;
 	     $type='problems';
@@ -2197,7 +2385,8 @@
 	 my @master_seq=split /\|\|\|/, $helper->{'VARS'}->{'RESOURCES'};
 
 	 #loop over students
-	 my $flag_latex_header_remove = 'NO';
+
+ 	 my $flag_latex_header_remove = 'NO';
 	 my %moreenv;
          $moreenv{'instructor_comments'}='hide';
 	 $moreenv{'textwidth'}=&get_textwidth($helper,$LaTeXwidth);
@@ -2245,6 +2434,7 @@
 	 &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state);
 	 $result .= $print_array[0].'  \end{document}';
      } elsif (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_anon')     ||
+	      ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_anon_page') ||
 	      ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'resources_for_anon')  ) { 
 	 my $cdom =$env{'course.'.$env{'request.course.id'}.'.domain'};
 	 my $cnum =$env{'course.'.$env{'request.course.id'}.'.num'};
@@ -2601,7 +2791,6 @@
     #   postscript.  Each ENDOFSTUDENTSTAMP will go on a line by itself.
     #
 
-
     foreach my $curresline (@{$master_seq})  {
 	if (defined $page_breaks{$curresline}) {
 	    if($i != 0) {
@@ -2620,7 +2809,6 @@
 		    &Apache::lonxml::remember_problem_counter();    
 
 		    my $rendered = &get_student_view_with_retries($curresline,$ssi_retry_count,$username,$userdomain,$env{'request.course.id'},'tex',$moreenv);
-
 		    if(($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') ||
 		       ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only')) {
 			#   Use a copy of the hash so we don't pervert it on future loop passes.
@@ -2648,12 +2836,12 @@
 			    $rendered = $header.$body;
 			}
 		    }
-
 		    if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') {
 			my $url = &Apache::lonnet::clutter($res_url);
 			my $annotation = &annotate($url);
 			$rendered =~  s/(\\keephidden{ENDOFPROBLEM})/$annotation$1/;
 		    }
+		    my $junk;
 		    if ($remove_latex_header eq 'YES') {
 			$rendered = &latex_header_footer_remove($rendered);
 		    } else {
@@ -2927,6 +3115,8 @@
         $subdir = substr($helper->{VARS}->{'filename'},
                          0, rindex($helper->{VARS}->{'filename'}, '/') + 1);
     } else {
+	# From course space:
+
 	if ($symb ne '') {
 	    ($map, $id, $url) = &Apache::lonnet::decode_symb($symb);
 	    $helper->{VARS}->{'postdata'} = 
@@ -2936,7 +3126,6 @@
 	    $is_published=1;	# From resource space.
 	}
 	$url = &Apache::lonnet::clutter($url);
-
         if (!$resourceTitle) { # if the resource doesn't have a title, use the filename
             my $postdata = $helper->{VARS}->{'postdata'};
             $resourceTitle = substr($postdata, rindex($postdata, '/') + 1);
@@ -2996,79 +3185,102 @@
 	    "' variable='FINISHPAGE' />";
     }
 
-    if (($helper->{'VARS'}->{'construction'} ne '1' ) &&
+    # If not construction space user can print the components of a page:
+
+    my $page_ispage;
+    my $page_title;
+    if (!$helper->{VARS}->{'construction'}) {
+	my $varspostdata = $helper->{VARS}->{'postdata'};
+	my $varsassignment = $helper->{VARS}->{'assignment'};
+	my $page_navmap         = Apache::lonnavmaps::navmap->new();
+	my @page_resources      = $page_navmap->retrieveResources($url);
+	if(defined($page_resources[0])) {
+	$page_ispage       = $page_resources[0]->is_page();
+	$page_title     = $page_resources[0]->title();
+	my $resourcesymb   = $page_resources[0]->symb();
+	my ($pagemap, $pageid, $pageurl) = &Apache::lonnet::decode_symb($symb);
+	if ($page_ispage) {
+	    push @{$printChoices}, 
+	    [&mt('Selected [_1]Problems[_2] from page [_3]', '<b>', '</b>', '<b><i>'.$page_title.'</i></b>'), 
+	     'map_problems_in_page', 
+	     'CHOOSE_PROBLEMS_PAGE'];
+	    push @{$printChoices}, 
+	         [&mt('Selected [_1]Resources[_2] from page [_3]', '<b>', '</b>', '<b><i>'.$page_title.'</i></b>'), 
+		  'map_resources_in_page', 
+		  'CHOOSE_RESOURCES_PAGE'];
+	}
+        my $helperFragment = &generate_resource_chooser('CHOOSE_PROBLEMS_PAGE',
+							'Select Problem(s) to print',
+							"multichoice='1' toponly='1' addstatus='1' closeallpages='1'",
+							'RESOURCES',
+							'PAGESIZE',
+							$url,
+							$isProblem, '',  $symbFilter,
+							$start_new_option);
+
+
+      $helperFragment .= &generate_resource_chooser('CHOOSE_RESOURCES_PAGE',
+						    'Select Resource(s) to print',
+						    'multichoice="1" toponly="1" addstatus="1" closeallpages="1"',
+						    'RESOURCES',
+						    'PAGESIZE',
+						    $url,
+						    $isNotMap, '', $symbFilter,
+						    $start_new_option);
+
+						    
+
+
+
+	&Apache::lonxml::xmlparse($r, 'helper', $helperFragment);
+	
+    }
+    }
+
+    if (($helper->{'VAR'}->{'construction'} ne '1' ) &&
 	$helper->{VARS}->{'postdata'} &&
 	$helper->{VARS}->{'assignment'}) {
         # Allow problems from sequence
-        push @{$printChoices}, [&mt('Selected [_1]Problems[_2] from folder [_3]','<b>','</b>','<b><i>'.$sequenceTitle.'</i></b>'), 'map_problems', 'CHOOSE_PROBLEMS'];
+        push @{$printChoices}, 
+	    [&mt('Selected [_1]Problems[_2] from folder [_3]','<b>','</b>','<b><i>'.$sequenceTitle.'</i></b>'), 
+	     'map_problems', 
+	     'CHOOSE_PROBLEMS'];
         # Allow all resources from sequence
-        push @{$printChoices}, [&mt('Selected [_1]Resources[_2] from folder [_3]','<b>','</b>','<b><i>'.$sequenceTitle.'</i></b>'), 'map_problems_pages', 'CHOOSE_PROBLEMS_HTML'];
-
-        my $helperFragment = <<HELPERFRAGMENT;
-  <state name="CHOOSE_PROBLEMS" title="Select Problem(s) to print">
-    <resource variable="RESOURCES" multichoice="1" toponly='1' addstatus="1"
-              closeallpages="1">
-      <nextstate>PAGESIZE</nextstate>
-      <filterfunc>return $isProblem;</filterfunc>
-      <mapurl>$map</mapurl>
-      <valuefunc>return $symbFilter;</valuefunc>
-      $start_new_option
-      </resource>
-    </state>
-
-  <state name="CHOOSE_PROBLEMS_HTML" title="Select Resource(s) to print">
-    <resource variable="RESOURCES" multichoice="1" toponly='1' addstatus="1"
-              closeallpages="1">
-      <nextstate>PAGESIZE</nextstate>
-      <filterfunc>return $isNotMap;</filterfunc>
-      <mapurl>$map</mapurl>
-      <valuefunc>return $symbFilter;</valuefunc>
-      $start_new_option
-      </resource>
-    </state>
-HELPERFRAGMENT
+        push @{$printChoices}, [&mt('Selected [_1]Resources[_2] from folder [_3]','<b>','</b>','<b><i>'.$sequenceTitle.'</i></b>'), 
+				'map_problems_pages', 
+				'CHOOSE_PROBLEMS_HTML'];
+        my $helperFragment = &generate_resource_chooser('CHOOSE_PROBLEMS',
+							'Select Problem(s) to print',
+							'multichoice="1" toponly="1" addstatus="1" closeallpages="1"',
+							'RESOURCES',
+							'PAGESIZE',
+							$map,
+							$isProblem, '',
+							$symbFilter,
+							$start_new_option);
+	$helperFragment .= &generate_resource_chooser('CHOOSE_PROBLEMS_HTML',
+						      'Select Resource(s) to print',
+						      	'multichoice="1" toponly="1" addstatus="1" closeallpages="1"',
+						      'RESOURCES',
+						      'PAGESIZE',
+						      $map,
+						      $isNotMap, '',
+						      $symbFilter,
+						      $start_new_option);
 
 	&Apache::lonxml::xmlparse($r, 'helper', $helperFragment);
     }
 
     # If the user has pfo (print for others) allow them to print all 
     # problems and resources  in the entire course, optionally for selected students
+    my $post_data = $helper->{VARS}->{'postdata'};
     if ($perm{'pfo'} &&  !$is_published  &&
-        ($helper->{VARS}->{'postdata'}=~/\/res\// || $helper->{VARS}->{'postdata'}=~/\/(syllabus|smppg|aboutme|bulletinboard)$/)) { 
+        ($post_data=~/\/res\// || $post_data =~/\/(syllabus|smppg|aboutme|bulletinboard)$/)) { 
 
         push @{$printChoices}, [&mtn('Selected <b>Problems</b> from <b>entire course</b>'), 'all_problems', 'ALL_PROBLEMS'];
 	push @{$printChoices}, [&mtn('Selected <b>Resources</b> from <b>entire course</b>'), 'all_resources', 'ALL_RESOURCES'];
 	push @{$printChoices}, [&mtn('Selected <b>Problems</b> from <b>entire course</b> for <b>selected people</b>'), 'all_problems_students', 'ALL_PROBLEMS_STUDENTS'];
-         &Apache::lonxml::xmlparse($r, 'helper', <<ALL_PROBLEMS);
-  <state name="ALL_PROBLEMS" title="Select Problem(s) to print">
-    <resource variable="RESOURCES" toponly='0' multichoice="1"
-	suppressEmptySequences='0' addstatus="1" closeallpages="1">
-      <nextstate>PAGESIZE</nextstate>
-      <filterfunc>return $isProblemOrMap;</filterfunc>
-      <choicefunc>return $isNotMap;</choicefunc>
-      <valuefunc>return $symbFilter;</valuefunc>
-      $start_new_option
-    </resource>
-  </state>
-  <state name="ALL_RESOURCES" title="Select Resource(s) to print">
-    <resource variable="RESOURCES" toponly='0' multichoice='1'
-              suppressEmptySequences='0' addstatus='1' closeallpages='1'>
-      <nextstate>PAGESIZE</nextstate>
-      <filterfunc>return $isNotMap; </filterfunc>
-      <valuefunc>return $symbFilter;</valuefunc>
-      $start_new_option
-    </resource>
-  </state>
-  <state name="ALL_PROBLEMS_STUDENTS" title="Select Problem(s) to print">
-    <resource variable="RESOURCES" toponly='0' multichoice="1"
-	suppressEmptySequences='0' addstatus="1" closeallpages="1">
-      <nextstate>STUDENTS1</nextstate>
-      <filterfunc>return $isProblemOrMap;</filterfunc>
-      <choicefunc>return $isNotMap;</choicefunc>
-      <valuefunc>return $symbFilter;</valuefunc>
-      $start_new_option
-    </resource>
-  </state>
+my $suffixXml = <<ALL_PROBLEMS;
   <state name="STUDENTS1" title="Select People">
       <message><b>Select sorting order of printout</b> </message>
     <choices variable='student_sort'>
@@ -3078,12 +3290,55 @@
       <message><br /><hr /><br /> </message>
       <student multichoice='1' variable="STUDENTS" nextstate="PRINT_FORMATTING" coursepersonnel="1"/>
   </state>
-
 ALL_PROBLEMS
+         &Apache::lonxml::xmlparse($r, 'helper', 
+				   &generate_resource_chooser('ALL_PROBLEMS',
+							      'SelectProblem(s) to print',
+							      'multichoice="1" suppressEmptySequences="0" addstatus="1" closeallpages="1"',
+							      'RESOURCES',
+							      'PAGESIZE',
+							      '',
+							      $isProblemOrMap, $isNotMap,
+							      $symbFilter,
+							      $start_new_option) .
+				   &generate_resource_chooser('ALL_RESOURCES',
+							      'Select Resource(s) to print',
+							      " toponly='0' multichoice='1' suppressEmptySequences='0' addstatus='1' closeallpages='1'",
+							      'RESOURCES',
+							      'PAGESIZE',
+							      '',
+							      $isNotMap,'',$symbFilter,
+							      $start_new_option) .
+				   &generate_resource_chooser('ALL_PROBLEMS_STUDENTS',
+							      'Select Problem(s) to print',
+							      'toponly="0" multichoice="1" suppressEmptySequences="0" addstatus="1" closeallpages="1"',
+							      'RESOURCES',
+							      'STUDENTS1',
+							      '',
+							      $isProblemOrMap,'' , $symbFilter,
+							      $start_new_option) .
+				     $suffixXml
+				   );
 
 	if ($helper->{VARS}->{'assignment'}) {
-	    push @{$printChoices}, [&mt('Selected [_1]Problems[_2] from folder [_3] for [_4]selected people[_5]','<b>','</b>','<b><i>'.$sequenceTitle.'</i></b>','<b>','</b>'), 'problems_for_students', 'CHOOSE_STUDENTS'];
-	    push @{$printChoices}, [&mt('Selected [_1]Problems[_2] from folder [_3] for [_4]CODEd assignments[_5]','<b>','</b>','<b><i>'.$sequenceTitle.'</i></b>','<b>','</b>'), 'problems_for_anon', 'CHOOSE_ANON1'];
+
+	    # If we were looking at a page, allow a selection of problems from the page
+	    # either for selected students or for coded assignments.
+
+	    if ($page_ispage) {
+		push @{$printChoices}, [&mt('Selected [_1]Problems[_2] from page [_3] for [_4]selected people[_5]',
+					    '<b>', '</b>', '<b><i>'.$page_title.'</i></b>', '<b>', '</b>'),
+					'problems_for_students_from_page', 'CHOOSE_TGT_STUDENTS_PAGE'];
+		push @{$printChoices}, [&mt('Selected [_1]Problems[_2] from page [_3] for [_4]CODEd assignments[_5]',
+					    '<b>', '</b>', '<b><i>'.$page_title.'</i></b>', '<b>', '</b>'),
+					'problems_for_anon_page', 'CHOOSE_ANON1_PAGE'];
+	    }
+	    push @{$printChoices}, [&mt('Selected [_1]Problems[_2] from folder [_3] for [_4]selected people[_5]',
+					'<b>','</b>','<b><i>'.$sequenceTitle.'</i></b>','<b>','</b>'), 
+				    'problems_for_students', 'CHOOSE_STUDENTS'];
+	    push @{$printChoices}, [&mt('Selected [_1]Problems[_2] from folder [_3] for [_4]CODEd assignments[_5]',
+					'<b>','</b>','<b><i>'.$sequenceTitle.'</i></b>','<b>','</b>'), 
+				    'problems_for_anon', 'CHOOSE_ANON1'];
 	}
 
 	my $randomly_ordered_warning = 
@@ -3098,20 +3353,15 @@
 	#    with one state, and use REGEXPs at inclusion time to set state names
 	#    and next states for better mix and match capability
 	#
-	my $resource_selector=<<RESOURCE_SELECTOR;
-    <state name="SELECT_PROBLEMS" title="Select resources to print">
-    $randomly_ordered_warning
-
-   <nextstate>PRINT_FORMATTING</nextstate> 
-   <message><br /><big><i><b>Select resources for the assignment</b></i></big><br /></message>
-    <resource variable="RESOURCES" multichoice="1" addstatus="1" 
-              closeallpages="1">
-      <filterfunc>return $isProblem;</filterfunc>
-      <mapurl>$map</mapurl>
-      <valuefunc>return $symbFilter;</valuefunc>
-      $start_new_option
-      </resource>
-    </state>
+	my $resource_selector= &generate_resource_chooser('SELECT_PROBLEMS',
+							  'Select resources to print',
+							  'multichoice="1" addstatus="1" closeallpages="1"',
+							  'RESOURCES', 
+							  'PRINT_FORMATTING',
+							  '',
+							  $isProblem, '', $symbFilter,
+							  $start_new_option);
+	$resource_selector .=  <<RESOURCE_SELECTOR;
     <state name="PRINT_FORMATTING" title="How should results be printed?">
     <message><br /><big><i><b>How should the results be printed?</b></i></big><br /></message>
     <choices variable="EMPTY_PAGES">
@@ -3131,19 +3381,31 @@
     </choices>
     </state>
 RESOURCE_SELECTOR
+        $resource_selector .= &generate_resource_chooser('CHOOSE_STUDENTS_PAGE',
+							'Select Problem(s) to print',
+							"multichoice='1' addstatus='1' closeallpages ='1'",
+							'RESOURCES',
+							'PRINT_FORMATTING',
+							$url,
+							$isProblem, '',  $symbFilter,
+							$start_new_option);
+
+
+# Generate student choosers.
 
-        &Apache::lonxml::xmlparse($r, 'helper', <<CHOOSE_STUDENTS);
-  <state name="CHOOSE_STUDENTS" title="Select Students and Resources">
-      <message><b>Select sorting order of printout</b> </message>
-    <choices variable='student_sort'>
-      <choice computer='0'>Sort by section then student</choice>
-      <choice computer='1'>Sort by students across sections.</choice>
-    </choices>
-      <message><br /><hr /><br /> </message>
-      <student multichoice='1' variable="STUDENTS" nextstate="SELECT_PROBLEMS" coursepersonnel="1"/>
-  </state>
-    $resource_selector
-CHOOSE_STUDENTS
+
+
+        &Apache::lonxml::xmlparse($r, 'helper',
+				  &generate_student_chooser('CHOOSE_TGT_STUDENTS_PAGE',
+							    'student_sort',
+							    'STUDENTS',
+							    'CHOOSE_STUDENTS_PAGE'));
+	&Apache::lonxml::xmlparse($r, 'helper', 
+				  &generate_student_chooser('CHOOSE_STUDENTS',
+							    'student_sort',
+							    'STUDENTS',
+							    'SELECT_PROBLEMS'));
+	&Apache::lonxml::xmlparse($r, 'helper', $resource_selector);
 
 	my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
 	my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
@@ -3201,63 +3463,31 @@
 	if ($codechoice eq '') {
 	    $codechoice='<choice computer="default">Default</choice>';
 	}
-        &Apache::lonxml::xmlparse($r, 'helper', <<CHOOSE_ANON1);
-  <state name="CHOOSE_ANON1" title="Specify CODEd Assignments">
-    <nextstate>SELECT_PROBLEMS</nextstate>
-    <message><h4>Fill out one of the forms below</h4></message>
-    <message><br /><hr /> <br /></message>
-    <message><h3>Generate new CODEd Assignments</h3></message>
-    <message><table><tr><td><b>Number of CODEd assignments to print:</b></td><td></message>
-    <string variable="NUMBER_TO_PRINT_TOTAL" maxlength="5" size="5">
-       <validator>
-	if (((\$helper->{'VARS'}{'NUMBER_TO_PRINT_TOTAL'}+0) < 1) &&
-	    !\$helper->{'VARS'}{'REUSE_OLD_CODES'}                &&
-            !\$helper->{'VARS'}{'SINGLE_CODE'}                    &&
-	    !\$helper->{'VARS'}{'CODE_SELECTED_FROM_LIST'}) {
-	    return "You need to specify the number of assignments to print";
-	}
-	return undef;
-       </validator>
-    </string>
-    <message></td></tr><tr><td></message>
-    <message><b>Names to save the CODEs under for later:</b></message>
-    <message></td><td></message>
-    <string variable="ANON_CODE_STORAGE_NAME" maxlength="50" size="20" />
-    <message></td></tr><tr><td></message>
-    <message><b>Bubble sheet type:</b></message>
-    <message></td><td></message>
-    <dropdown variable="CODE_OPTION" multichoice="0" allowempty="0">
-    $codechoice
-    </dropdown>
-    <message></td></tr><tr><td colspan="2"></td></tr><tr><td></message>
-    <message></td></tr><tr><td></table></message>
-    <message><br /><hr /><h3>Print a Specific CODE </h3><br /><table></message>
-    <message><tr><td><b>Enter a CODE to print:</b></td><td></message>
-    <string variable="SINGLE_CODE" size="10">
-        <validator>
-	   if(!\$helper->{'VARS'}{'NUMBER_TO_PRINT_TOTAL'}           &&
-	      !\$helper->{'VARS'}{'REUSE_OLD_CODES'}                 &&
-	      !\$helper->{'VARS'}{'CODE_SELECTED_FROM_LIST'}) {
-	      return &Apache::lonprintout::is_code_valid(\$helper->{'VARS'}{'SINGLE_CODE'},
-						      \$helper->{'VARS'}{'CODE_OPTION'});
-	   } else {
-	       return undef;	# Other forces control us.
-	   }
-        </validator>
-    </string>
-    <message></td></tr><tr><td></message>
-        $code_selection
-    <message></td></tr></table></message>
-    <message><hr /><h3>Reprint a Set of Saved CODEs</h3><table><tr><td></message>
-    <message><b>Select saved CODEs:</b></message>
-    <message></td><td></message>
-    <dropdown variable="REUSE_OLD_CODES">
-        $namechoice
-    </dropdown>
-    <message></td></tr></table></message>
-  </state>
-  $resource_selector
-CHOOSE_ANON1
+	my $anon1 = &generate_code_selector($helper, 
+					    'CHOOSE_ANON1',
+					    'SELECT_PROBLEMS',
+					    $codechoice,
+					    $code_selection,
+					    $namechoice) . $resource_selector;
+					    
+					    
+        &Apache::lonxml::xmlparse($r, 'helper',$anon1);
+
+	my $anon_page = &generate_code_selector($helper,
+						'CHOOSE_ANON1_PAGE',
+						'SELECT_PROBLEMS_PAGE',
+						$codechoice,
+						$code_selection,
+						$namechoice) .
+			&generate_resource_chooser('SELECT_PROBLEMS_PAGE',
+						   'Select Problem(s) to print',
+						   "multichoice='1' addstatus='1' closeallpages ='1'",
+						   'RESOURCES',
+						   'PRINT_FORMATTING',
+						   $url,
+						   $isProblem, '',  $symbFilter,
+						   $start_new_option);
+	&Apache::lonxml::xmlparse($r, 'helper', $anon_page);
 
 
 	if ($helper->{VARS}->{'assignment'}) {
@@ -3269,7 +3499,6 @@
 	$resource_selector=<<RESOURCE_SELECTOR;
     <state name="SELECT_RESOURCES" title="Select Resources">
     $randomly_ordered_warning
-
     <nextstate>PRINT_FORMATTING</nextstate>
     <message><br /><big><i><b>Select resources for the assignment</b></i></big><br /></message>
     <resource variable="RESOURCES" multichoice="1" addstatus="1" 
@@ -3280,6 +3509,7 @@
       $start_new_option
       </resource>
     </state>
+
     <state name="PRINT_FORMATTING" title="Format of the print job">
     <nextstate>NUMBER_PER_PDF</nextstate>
     <message><br /><big><i><b>How should the results be printed?</b></i></big><br /></message>

--foxr1256552217--