[Bio] / Sprout / SearchHelper.pm Repository:
ViewVC logotype

Diff of /Sprout/SearchHelper.pm

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.42, Fri Oct 17 16:41:47 2008 UTC revision 1.43, Mon Jan 19 21:56:19 2009 UTC
# Line 19  Line 19 
19      use URI::Escape;      use URI::Escape;
20      use PageBuilder;      use PageBuilder;
21      use AliasAnalysis;      use AliasAnalysis;
22        use CGI::Cookie;
23      use FreezeThaw qw(freeze thaw);      use FreezeThaw qw(freeze thaw);
24    
25  =head1 Search Helper Base Class  =head1 Search Helper Base Class
# Line 85  Line 86 
86    
87  List of the parameters that are used to select multiple genomes.  List of the parameters that are used to select multiple genomes.
88    
89    =item notices
90    
91    A list of messages to be put in the notice file.
92    
93  =back  =back
94    
95  =head2 Adding a new Search Tool  =head2 Adding a new Search Tool
# Line 258  Line 263 
263  sub new {  sub new {
264      # Get the parameters.      # Get the parameters.
265      my ($class, $cgi) = @_;      my ($class, $cgi) = @_;
266      # Check for a session ID.      # Check for a session ID. First we look in the CGI parameters.
267      my $session_id = $cgi->param("SessionID");      my $session_id = $cgi->param("SessionID");
268      my $type = "old";      my $type = "old";
269      if (! $session_id) {      if (! $session_id) {
270            # We need a session ID. Try to get it from the cookies.
271            my %cookies = fetch CGI::Cookie;
272            my $session_cookie = $cookies{$class};
273            if (! $session_cookie) {
274          Trace("No session ID found.") if T(3);          Trace("No session ID found.") if T(3);
275          # Here we're starting a new session. We create the session ID and          # Here we're starting a new session. We create the session ID and
276          # store it in the query object.              # store it in a cookie.
277          $session_id = FIGRules::NewSessionID();          $session_id = FIGRules::NewSessionID();
278          Trace("New session ID is $session_id.") if T(3);          Trace("New session ID is $session_id.") if T(3);
279                $session_cookie = new CGI::Cookie(-name => $class,
280                                                  -value => $session_id,
281                                                  -expires => '+7d');
282                $session_cookie->bake();
283            } else {
284                # Here we're recovering an old session. The session ID is
285                # used to find any old search options lying around, but we're
286                # still considered a new session.
287                $session_id = $session_cookie->value();
288                Trace("Session $session_id recovered from cookie.") if T(3);
289            }
290            # Denote this is a new session.
291          $type = "new";          $type = "new";
292            # Put the session IS in the parameters.
293          $cgi->param(-name => 'SessionID', -value => $session_id);          $cgi->param(-name => 'SessionID', -value => $session_id);
294      } else {      } else {
295          Trace("Session ID is $session_id.") if T(3);          Trace("Session ID is $session_id.") if T(3);
# Line 303  Line 325 
325                    scriptQueue => [],                    scriptQueue => [],
326                    genomeList => undef,                    genomeList => undef,
327                    genomeParms => [],                    genomeParms => [],
328                      notices => [],
329                   };                   };
330      # Bless and return it.      # Bless and return it.
331      bless $retVal, $class;      bless $retVal, $class;
# Line 325  Line 348 
348  }  }
349    
350    
   
351  =head3 DB  =head3 DB
352    
353      my $sprout = $shelp->DB();      my $sprout = $shelp->DB();
# Line 460  Line 482 
482      # Start the form. Note we use the override option on the Class value, in      # Start the form. Note we use the override option on the Class value, in
483      # case the Advanced button was used.      # case the Advanced button was used.
484      my $retVal = "<div class=\"search\">\n" .      my $retVal = "<div class=\"search\">\n" .
485                   $cgi->start_form(-method => 'POST',                   CGI::start_form(-method => 'POST',
486                                    -action => "$FIG_Config::cgi_url/SearchSkeleton.cgi",                                    -action => "$FIG_Config::cgi_url/wiki/rest.cgi/NmpdrPlugin/search",
487                                    -name => $self->FormName()) .                                    -name => $self->FormName()) .
488                   $cgi->hidden(-name => 'Class',                   CGI::hidden(-name => 'Class',
489                                -value => $self->{class},                                -value => $self->{class}) .
490                                -override => 1) .                   CGI::hidden(-name => 'SPROUT',
                  $cgi->hidden(-name => 'SPROUT',  
491                                -value => 1) .                                -value => 1) .
492                   $cgi->h3("$title" . Hint($self->{class}, "Click here for more information."));                   CGI::h3("$title" . Hint($self->{class}, "Click here for more information."));
493      # Put in an anchor tag in case there's a table of contents.      # Put in an anchor tag in case there's a table of contents.
494      my $anchorName = $self->FormName();      my $anchorName = $self->FormName();
495      $retVal .= "<a name=\"$anchorName\"></a>\n";      $retVal .= "<a name=\"$anchorName\"></a>\n";
# Line 666  Line 687 
687      $self->{fileHandle} = Open(undef, "| sort | cut --fields=2- >>$fileName");      $self->{fileHandle} = Open(undef, "| sort | cut --fields=2- >>$fileName");
688  }  }
689    
690    =head3 SetNotice
691    
692        $shelp->SetNotice($message);
693    
694    This method creates a notice that will be displayed on the search results
695    page. After the search is complete, notices are placed in a small temporary
696    file that is checked by the results display engine.
697    
698    =over 4
699    
700    =item message
701    
702    Message to write to the notice file.
703    
704    =back
705    
706    =cut
707    
708    sub SetNotice {
709        # Get the parameters.
710        my ($self, $message) = @_;
711        # Save the message.
712        push @{$self->{notices}}, $message;
713    }
714    
715    
716  =head3 ReadColumnHeaders  =head3 ReadColumnHeaders
717    
718      my @colHdrs = $shelp->ReadColumnHeaders($fh);      my @colHdrs = $shelp->ReadColumnHeaders($fh);
# Line 747  Line 794 
794          my $cgi = $self->Q();          my $cgi = $self->Q();
795          $self->PrintLine("Output formatting complete.<br />");          $self->PrintLine("Output formatting complete.<br />");
796      }      }
797        # Check for notices.
798        my @notices = @{$self->{notices}};
799        if (scalar @notices) {
800            # We have some, so put then in a notice file.
801            my $noticeFile = $self->GetTempFileName('notices');
802            my $nh = Open(undef, ">$noticeFile");
803            print $nh join("\n", @notices, "");
804            close $nh;
805            $self->PrintLine(scalar(@notices) . " notices saved.<br />");
806        }
807  }  }
808    
809  =head3 OrganismData  =head3 OrganismData
# Line 1262  Line 1319 
1319      # Get all the property names, putting them after the null choice if one exists.      # Get all the property names, putting them after the null choice if one exists.
1320      push @propNames, $sprout->GetChoices('Property', 'property-name');      push @propNames, $sprout->GetChoices('Property', 'property-name');
1321      # Create a menu from them.      # Create a menu from them.
1322      my $retVal = $cgi->popup_menu(-name=> $menuName, -values => \@propNames,      my $retVal = CGI::popup_menu(-name=> $menuName, -values => \@propNames,
1323                                    -default => $selected);                                    -default => $selected);
1324      # Return the result.      # Return the result.
1325      return $retVal;      return $retVal;
# Line 1324  Line 1381 
1381          }          }
1382      }      }
1383      # Create the table.      # Create the table.
1384      my $retVal = $cgi->table({border => 2, cellspacing => 2,      my $retVal = CGI::table({border => 2, cellspacing => 2,
1385                                width => 700, class => 'search'},                                width => 700, class => 'search'},
1386                               @{$rows});                               @{$rows});
1387      # Return the result.      # Return the result.
# Line 1365  Line 1422 
1422      # Get the current feature ID type.      # Get the current feature ID type.
1423      my $aliasType = $self->GetPreferredAliasType();      my $aliasType = $self->GetPreferredAliasType();
1424      # Create the rows.      # Create the rows.
1425      my $retVal = $cgi->Tr($cgi->td("Identifier Type "),      my $retVal = CGI::Tr(CGI::td("Identifier Type "),
1426                            $cgi->td({ colspan => 2 },                            CGI::td({ colspan => 2 },
1427                                     $cgi->popup_menu(-name => 'AliasType',                                     CGI::popup_menu(-name => 'AliasType',
1428                                                      -values => ['FIG', AliasAnalysis::AliasTypes() ],                                                      -values => ['FIG', AliasAnalysis::AliasTypes() ],
1429                                                      -default => $aliasType) .                                                      -default => $aliasType) .
1430                                     Hint("Identifier Type", "Specify how you want gene names to be displayed."))) .                                     Hint("Identifier Type", "Specify how you want gene names to be displayed."))) .
1431                   "\n" .                   "\n" .
1432                   $cgi->Tr($cgi->td("Results/Page"),                   CGI::Tr(CGI::td("Results/Page"),
1433                            $cgi->td($cgi->popup_menu(-name => 'PageSize',                            CGI::td(CGI::popup_menu(-name => 'PageSize',
1434                                                      -values => [10, 25, 50, 100, 1000],                                                      -values => [10, 25, 50, 100, 1000],
1435                                                      -default => $pageSize)),                                                      -default => $pageSize)),
1436                            $cgi->td($cgi->submit(-class => 'goButton',                            CGI::td(CGI::submit(-class => 'goButton',
1437                                                  -name => 'Search',                                                  -name => 'Search',
1438                                                  -value => $realCaption)));                                                  -value => $realCaption)));
1439      # Return the result.      # Return the result.
# Line 1719  Line 1776 
1776              Confess("Hash reference found at start of selection tree. The tree as a whole cannot have attributes, only tree nodes.");              Confess("Hash reference found at start of selection tree. The tree as a whole cannot have attributes, only tree nodes.");
1777          } else {          } else {
1778              # Here we have a real tree. Apply the tree style.              # Here we have a real tree. Apply the tree style.
1779              push @retVal, $cgi->start_div({ class => $optionThing->{style} });              push @retVal, CGI::start_div({ class => $optionThing->{style} });
1780              # Give us a DIV ID.              # Give us a DIV ID.
1781              my $divID = GetDivID($optionThing->{name});              my $divID = GetDivID($optionThing->{name});
1782              # Show the tree.              # Show the tree.
1783              push @retVal, ShowBranch($cgi, "(root)", $divID, $tree, $optionThing, 'block');              push @retVal, ShowBranch($cgi, "(root)", $divID, $tree, $optionThing, 'block');
1784              # Close the DIV block.              # Close the DIV block.
1785              push @retVal, $cgi->end_div();              push @retVal, CGI::end_div();
1786          }          }
1787      }      }
1788      # Return the result.      # Return the result.
# Line 1783  Line 1840 
1840      # Declare the return variable.      # Declare the return variable.
1841      my @retVal = ();      my @retVal = ();
1842      # Start the branch.      # Start the branch.
1843      push @retVal, $cgi->start_ul({ id => $id, style => "display:$displayType" });      push @retVal, CGI::start_ul({ id => $id, style => "display:$displayType" });
1844      # Check for the hash and choose the start location accordingly.      # Check for the hash and choose the start location accordingly.
1845      my $i0 = (ref $branch->[0] eq 'HASH' ? 1 : 0);      my $i0 = (ref $branch->[0] eq 'HASH' ? 1 : 0);
1846      # Get the list length.      # Get the list length.
# Line 1841  Line 1898 
1898              # closed images.              # closed images.
1899              my @images = ($options->{nodeImageOpen}, $options->{nodeImageClosed});              my @images = ($options->{nodeImageOpen}, $options->{nodeImageClosed});
1900              my $image = $images[$hasChildren];              my $image = $images[$hasChildren];
1901              my $prefixHtml = $cgi->img({src => $image, id => "${myID}img"});              my $prefixHtml = CGI::img({src => $image, id => "${myID}img"});
1902              if ($hasChildren) {              if ($hasChildren) {
1903                  # If there are children, we wrap the image in a toggle hyperlink.                  # If there are children, we wrap the image in a toggle hyperlink.
1904                  $prefixHtml = $cgi->a({ onClick => "javascript:treeToggle('$myID','$images[0]', '$images[1]')" },                  $prefixHtml = CGI::a({ onClick => "javascript:treeToggle('$myID','$images[0]', '$images[1]')" },
1905                                        $prefixHtml);                                        $prefixHtml);
1906              }              }
1907              # Now the radio button, if any. Note we use "defined" in case the user wants the              # Now the radio button, if any. Note we use "defined" in case the user wants the
# Line 1861  Line 1918 
1918                  if (defined $options->{selected} && $options->{selected} eq $attrHash->{value}) {                  if (defined $options->{selected} && $options->{selected} eq $attrHash->{value}) {
1919                      $radioParms->{checked} = undef;                      $radioParms->{checked} = undef;
1920                  }                  }
1921                  $prefixHtml .= $cgi->input($radioParms);                  $prefixHtml .= CGI::input($radioParms);
1922              }              }
1923              # Next, we format the label.              # Next, we format the label.
1924              my $labelHtml = $myLabel;              my $labelHtml = $myLabel;
1925              Trace("Formatting tree node for \"$myLabel\".") if T(4);              Trace("Formatting tree node for \"$myLabel\".") if T(4);
1926              # Apply a hyperlink if necessary.              # Apply a hyperlink if necessary.
1927              if (defined $attrHash->{link}) {              if (defined $attrHash->{link}) {
1928                  $labelHtml = $cgi->a({ href => $attrHash->{link}, target => $options->{target} },                  $labelHtml = CGI::a({ href => $attrHash->{link}, target => $options->{target} },
1929                                       $labelHtml);                                       $labelHtml);
1930              }              }
1931              # Finally, roll up the child HTML. If there are no children, we'll get a null string              # Finally, roll up the child HTML. If there are no children, we'll get a null string
1932              # here.              # here.
1933              my $childHtml = join("\n", @childHtml);              my $childHtml = join("\n", @childHtml);
1934              # Now we have all the pieces, so we can put them together.              # Now we have all the pieces, so we can put them together.
1935              push @retVal, $cgi->li("$prefixHtml$labelHtml$childHtml");              push @retVal, CGI::li("$prefixHtml$labelHtml$childHtml");
1936          }          }
1937      }      }
1938      # Close the tree branch.      # Close the tree branch.
1939      push @retVal, $cgi->end_ul();      push @retVal, CGI::end_ul();
1940      # Return the result.      # Return the result.
1941      return @retVal;      return @retVal;
1942  }  }
# Line 1935  Line 1992 
1992  sub PrintLine {  sub PrintLine {
1993      # Get the parameters.      # Get the parameters.
1994      my ($self, $message) = @_;      my ($self, $message) = @_;
1995      # Send them to the output.      # Send the message to the output.
1996      print "$message\n";      print "$message\n";
1997  }  }
1998    
# Line 1987  Line 2044 
2044          # Commit suicide if it didn't work.          # Commit suicide if it didn't work.
2045          if (! defined $retVal) {          if (! defined $retVal) {
2046              die "Could not find a $type handler of type $className.";              die "Could not find a $type handler of type $className.";
2047            } else {
2048                # Perform any necessary subclass initialization.
2049                $retVal->Initialize();
2050          }          }
2051      };      };
2052      # Check for errors.      # Check for errors.
# Line 2184  Line 2244 
2244      return $retVal;      return $retVal;
2245  }  }
2246    
2247    =head3 Hint
2248    
2249        my $htmlText = SearchHelper::Hint($wikiPage, $hintText);
2250    
2251    Return the HTML for a small question mark that displays the specified hint text when it is clicked.
2252    This HTML can be put in forms to provide a useful hinting mechanism.
2253    
2254    =over 4
2255    
2256    =item wikiPage
2257    
2258    Name of the wiki page to be popped up when the hint mark is clicked.
2259    
2260    =item hintText
2261    
2262    Text to display for the hint. It is raw html, but may not contain any double quotes.
2263    
2264    =item RETURN
2265    
2266    Returns the html for the hint facility. The resulting html shows a small button-like thing that
2267    uses the standard FIG popup technology.
2268    
2269    =back
2270    
2271    =cut
2272    
2273    sub Hint {
2274        # Get the parameters.
2275        my ($wikiPage, $hintText) = @_;
2276        # Ask Sprout to draw the hint button for us.
2277        return Sprout::Hint($wikiPage, $hintText);
2278    }
2279    
2280    
2281    
2282  =head2 Virtual Methods  =head2 Virtual Methods
2283    
2284    =head3 HeaderHtml
2285    
2286        my $html = $shelp->HeaderHtml();
2287    
2288    Generate HTML for the HTML header. If extra styles or javascript are required,
2289    they should go in here.
2290    
2291    =cut
2292    
2293    sub HeaderHtml {
2294        return "";
2295    }
2296    
2297  =head3 Form  =head3 Form
2298    
2299      my $html = $shelp->Form();      my $html = $shelp->Form($mode);
2300    
2301    Generate the HTML for a form to request a new search. If the subclass does not
2302    override this method, then the search is formless, and must be started from an
2303    external page.
2304    
2305    =cut
2306    
2307  Generate the HTML for a form to request a new search.  sub Form {
2308        # Get the parameters.
2309        my ($self) = @_;
2310        return "";
2311    }
2312    
2313  =head3 Find  =head3 Find
2314    
# Line 2273  Line 2391 
2391      $rhelp->SetColumns(@cols);      $rhelp->SetColumns(@cols);
2392  }  }
2393    
 =head3 Hint  
2394    
2395      my $htmlText = SearchHelper::Hint($wikiPage, $hintText);  =head3 Initialize
2396    
2397  Return the HTML for a small question mark that displays the specified hint text when it is clicked.      $shelp->Initialize();
 This HTML can be put in forms to provide a useful hinting mechanism.  
2398    
2399  =over 4  Perform any initialization required after construction of the helper.
2400    
2401  =item wikiPage  =cut
2402    
2403  Name of the wiki page to be popped up when the hint mark is clicked.  sub Initialize {
2404        # The default is to do nothing.
2405    }
2406    
2407  =item hintText  =head3 GetResultHelper
2408    
2409  Text to display for the hint. It is raw html, but may not contain any double quotes.      my $rhelp = $shelp->GetResultHelper($className);
2410    
2411    Return a result helper for this search helper. The default action is to create
2412    a result helper from scratch; however, if the subclass has an internal result
2413    helper it can override this method to return it without having to create a new
2414    one.
2415    
2416    =over 4
2417    
2418    =item className
2419    
2420    Result helper class name.
2421    
2422  =item RETURN  =item RETURN
2423    
2424  Returns the html for the hint facility. The resulting html shows a small button-like thing that  Returns a result helper of the specified class connected to this search helper.
 uses the standard FIG popup technology.  
2425    
2426  =back  =back
2427    
2428  =cut  =cut
2429    
2430  sub Hint {  sub GetResultHelper {
2431      # Get the parameters.      # Get the parameters.
2432      my ($wikiPage, $hintText) = @_;      my ($self, $className) = @_;
2433      # Ask Sprout to draw the hint button for us.      # Create the helper.
2434      return Sprout::Hint($wikiPage, $hintText);      my $retVal = GetHelper($self, RH => $className);
2435        # return it.
2436        return $retVal;
2437  }  }
2438    
   
2439  1;  1;

Legend:
Removed from v.1.42  
changed lines
  Added in v.1.43

MCS Webmaster
ViewVC Help
Powered by ViewVC 1.0.3