root/trunk/cstr/src/recpt/cstrbrowsetools.cpp @ 891

Revision 891, 27.9 KB (checked in by sjboddie, 20 years ago)

Initial revision

  • Property svn:keywords set to Author Date Id Revision
Line 
1/**********************************************************************
2 *
3 * cstrbrowsetools.cpp --
4 * Copyright (C) 1999  The New Zealand Digital Library Project
5 *
6 * A component of the Greenstone digital library software
7 * from the New Zealand Digital Library Project at the
8 * University of Waikato, New Zealand.
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
14 *
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18 * GNU General Public License for more details.
19 *
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23 *
24 * $Id$
25 *
26 *********************************************************************/
27
28/*
29   $Log$
30   Revision 1.1  2000/02/01 22:32:37  sjboddie
31   Initial revision
32
33   Revision 1.1  1999/09/07 21:49:41  sjboddie
34   new cstr receptionist
35
36 */
37
38
39#include "cstrbrowsetools.h"
40#include "OIDtools.h"
41#include "cgiutils.h"
42
43// simply checks to see if formatstring begins with a <td> tag
44static bool is_table_content (const text_t &formatstring) {
45  text_t::const_iterator here = formatstring.begin();
46  text_t::const_iterator end = formatstring.end();
47 
48  while (here != end) {
49    if (*here != ' ') {
50      if (*here == '<') {
51    if ((*(here+1) == 't' || *(here+1) == 'T') &&
52        (*(here+2) == 'd' || *(here+2) == 'D') &&
53        (*(here+3) == '>' || *(here+3) == ' '))
54      return true;
55      } else return false;
56    }
57    here ++;
58  }
59  return false;
60}
61
62static bool is_table_content (const format_t *formatlistptr) {
63
64  if (formatlistptr == NULL) return false;
65 
66  if (formatlistptr->command == comText)
67    return is_table_content (formatlistptr->text);
68   
69  return false;
70}
71
72
73// output_controls displays the detach, expand/contract contents,
74// expand/contract text and highlighting/no highlighting buttons
75static void output_controls (cgiargsclass &args, const text_tarray &ibuttons,
76                 recptproto */*collectproto*/, displayclass &disp,
77                 outconvertclass &outconvert, ostream &textout,
78                 ostream &/*logout*/) {
79
80  if (args["u"] != "1") {
81 
82    FilterResponse_t response;
83    text_tset metadata;
84    text_tarray buttons;
85
86    text_t &arg_gg = args["gg"];
87
88    text_tarray::const_iterator here = ibuttons.begin();
89    text_tarray::const_iterator end = ibuttons.end();
90
91    while (here != end) {
92   
93      if (*here == "Detach")
94    buttons.push_back ("_document:imagedetach_");
95      else if (*here == "Highlight" && arg_gg == "text") {
96    if (args["hl"] == "1")
97      buttons.push_back ("_document:imagenohighlight_");
98    else
99      buttons.push_back ("_document:imagehighlight_");
100    //      } else if (*here == "Expand Contents") {
101    //  if (args["gc"] == "1")
102    //    buttons.push_back ("_document:imagecontracttoc_");
103    //  else
104    //    buttons.push_back ("_document:imageexpandtoc_");
105      } else if (*here == "Expand Text" && arg_gg == "text") {
106    if (args.getintarg("gt"))
107      buttons.push_back ("_document:imagecontracttext_");
108    else
109      buttons.push_back ("_document:imageexpandtext_");
110      }
111      here ++;
112    }
113
114    here = buttons.begin();
115    end = buttons.end();
116    int count = 0;
117    while (here != end) {
118      if ((count != 0) && ((count % 3) == 0)) textout << "<br>\n";
119      textout << outconvert << disp << *here;
120      count ++;
121      here ++;
122    }
123  }
124}
125
126static void output_cstr_controls (cgiargsclass &args, const text_t &source,
127                  const text_t &description, const text_t &figures,
128                  displayclass &disp, outconvertclass &outconvert,
129                  ostream &textout) {
130  text_tarray buttons;
131  text_t &arg_gg = args["gg"];
132 
133  if (!source.empty())
134    buttons.push_back ("_document:imagepostscript_(" + cgi_safe(source) + ")");
135
136  if ((!description.empty()) && (arg_gg != "abstract"))
137    buttons.push_back ("_document:imageabstract_");
138
139  if ((!figures.empty()) && (arg_gg != "figures"))
140    buttons.push_back ("_document:imagefigures_");
141
142  if (arg_gg != "text")
143    buttons.push_back ("_document:imageviewtext_");
144
145  textout << "<br>\n";
146
147  text_tarray::const_iterator here = buttons.begin();
148  text_tarray::const_iterator end = buttons.end();
149  int count = 0;
150  while (here != end) {
151    if ((count != 0) && ((count % 3) == 0)) textout << "<br>\n";
152    textout << outconvert << disp << *here;
153    count ++;
154    here ++;
155  }
156}
157
158/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
159Functions for generating a document type tables of contents. These aren't really tables of
160contents at all, just a title, some navigation buttons and arrows and maybe a page ? of ?
161type thing. These should only be called for document level tocs (i.e. when the "d" argument
162is set) as I don't think it makes sense to display top level classifications in this way.
163-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
164
165void output_document_toc (cgiargsclass &args, const formatinfo_t &formatinfo,
166              recptproto *collectproto, displayclass &disp,
167              outconvertclass &outconvert, ostream &textout,
168              ostream &logout) {
169
170  text_t &arg_d = args["d"];
171  if (arg_d.empty()) return;
172
173  text_tset metadata;
174  FilterResponse_t response;
175  ResultDocInfo_t docinfo;
176  text_t booktop, facsimiles, figures, description, source, summary;
177  text_t &collection = args["c"];
178
179  metadata.insert ("Title");
180  if (get_info (arg_d, collection, metadata, false, collectproto, response, logout)) {
181
182    metadata.erase (metadata.begin(), metadata.end());
183    docinfo = response.docInfo[0];
184
185    textout
186      << "\n<!-- Table of Contents produced by cstrbrowsetools::output_document_toc -->\n\n";
187
188    // get title and author of book
189    get_top (arg_d, booktop);
190    metadata.insert ("facsimiles");
191    metadata.insert ("figures");
192    metadata.insert ("Description");
193    metadata.insert ("Source");
194    metadata.insert ("Summary");
195    get_info (booktop, collection, metadata, false, collectproto, response, logout);
196    facsimiles = response.docInfo[0].metadata[0].values[0];
197    figures = response.docInfo[0].metadata[1].values[0];
198    description = response.docInfo[0].metadata[2].values[0];
199    source = response.docInfo[0].metadata[3].values[0];
200    summary = response.docInfo[0].metadata[4].values[0];
201
202    metadata.erase (metadata.begin(), metadata.end());
203 
204    textout << outconvert << disp
205        << "<p><center>\n"
206        << "<table cellpadding=0 cellspacing=0 width=_pagewidth_>\n"
207        << "<tr valign=top><td>\n";
208
209    // don't want arrows and page number if text expanded
210    if (formatinfo.DocumentArrowsBottom && !args.getintarg ("gt")) {
211   
212      // previous arrow
213      textout << outconvert << disp << "<table><tr valign=top>\n"
214          << "<td align=left>_document:prevarrow_</td>\n";
215   
216      // page ? of ? text
217      textout << "<td align=center>\n";
218     
219      if (is_number (docinfo.metadata[0].values[0])) {
220    text_t doctop;
221    metadata.insert ("Title");
222    get_top (arg_d, doctop);
223    // get title of last sibling
224    if (get_info (doctop + ".lc", collection, metadata, false, collectproto, response, logout)) {
225      if (is_number (response.docInfo[0].metadata[0].values[0])) {
226        textout << outconvert << disp << "_document:page_" << docinfo.metadata[0].values[0]
227            << "_document:of_" << response.docInfo[0].metadata[0].values[0];
228      } else {
229        textout << outconvert << docinfo.metadata[0].values[0];
230      }
231    }
232      } else {
233    textout << outconvert << docinfo.metadata[0].values[0];
234      }
235 
236      // next arrow
237      textout << outconvert << disp << "</td>\n<td align=right>_document:nextarrow_</td>\n</table>\n";
238    }
239
240    // goto line ****** ????????????
241    //if (formatinfo.DocumentGoTo)
242    //  textout << outconvert << disp << "_document:gotoform_";
243
244    // control buttons
245    output_controls (args, formatinfo.DocumentButtons, collectproto,
246             disp, outconvert, textout, logout);
247    textout << "</td><td valign=top>\n";
248
249    if (!summary.empty())
250      textout << outconvert << summary << "\n";
251
252    output_cstr_controls (args, source, description, figures,
253              disp, outconvert, textout);
254
255    textout << "</td>\n";
256   
257    // facsimile image
258    // only want the first facsimile (some documents have two)
259    if (!facsimiles.empty()) {
260      text_t::const_iterator fbegin = facsimiles.begin();
261      facsimiles = substr (fbegin, findchar (fbegin, facsimiles.end(), ','));
262      textout << outconvert << disp << "<td valign=top><a href=\"_httpcurrentdocument_&gg=facsimiles\">"
263          << "<img src=\"_httpcollection_/archives/_thisOID_/"
264          << facsimiles << "\" width=150 height=250></a>" << "</td>\n";
265    }
266
267
268    textout << "</td></tr></table></center>\n";
269    textout << "\n<!-- end of Table of Contents -->\n";
270
271  }
272}
273
274
275/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
276Functions for generating a "Hierarchy" type table of contents. These can be used either
277at top classification level or at document level (the difference being that a cover
278image and control buttons may be displayed at document level).
279-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
280
281// prototypes
282
283static void output_contracted_hierarchy_toc (const text_t &classifytype, text_t &formatstring,
284                         cgiargsclass &args, recptproto *collectproto,
285                         displayclass &disp, outconvertclass &outconvert,
286                         ostream &textout, ostream &logout);
287
288static void output_expanded_hierarchy_toc (cgiargsclass &args, recptproto *collectproto,
289                       displayclass &disp, outconvertclass &outconvert,
290                       ostream &textout, ostream &logout);
291
292static void output_parents_toc (cgiargsclass &args, const FilterResponse_t &parents,
293                int &tabcount, displayclass &disp,
294                format_t *formatlistptr, outconvertclass &outconvert,
295                ostream &textout, ostream &logout);
296
297static void output_siblings_toc (const text_t &classifytype, cgiargsclass &args,
298                 const FilterResponse_t &siblings, int &tabcount,
299                 displayclass &disp, format_t *formatlistptr,
300                 outconvertclass &outconvert, ostream &textout,
301                 ostream &logout);
302
303static void output_stdlist (cgiargsclass &args, ResultDocInfo_tarray::iterator &here,
304                ResultDocInfo_tarray::iterator &end, bool intable,
305                displayclass &disp, format_t *formatlistptr,
306                 outconvertclass &outconvert, ostream &textout);
307
308static void output_datelist (cgiargsclass &args, ResultDocInfo_tarray::iterator &here,
309                 ResultDocInfo_tarray::iterator &end, bool intable,
310                 displayclass &disp, format_t *formatlistptr,
311                 outconvertclass &outconvert, ostream &textout);
312
313
314void output_standard_toc (const text_t &classifytype, const formatinfo_t &formatinfo,
315              text_t &formatstring, cgiargsclass &args,
316              recptproto *collectproto, displayclass &disp,
317              outconvertclass &outconvert, ostream &textout,
318              ostream &logout) {
319
320  bool havecontrols = false;
321
322  textout << "\n<!-- Table of Contents produced by cstrbrowsetools::output_standard_toc -->\n\n";
323
324  // get the cover image (if there is one) and the control buttons
325  // if we're inside a book
326  if (!args["d"].empty()) {
327    textout << "<p><table cellpadding=0 cellspacing=0><tr>\n";
328    textout << "<td valign=top width=200>\n";
329    //    if (cover) output_cover_image (args, collectproto, disp, outconvert, textout, logout);
330    output_controls (args, formatinfo.DocumentButtons, collectproto, disp, outconvert, textout, logout);
331    textout << "</td><td valign=top>\n";
332    havecontrols = true;
333  }
334 
335  // get table of contents
336  textout << "<table>\n";
337
338  if (args.getintarg("gc"))
339    output_expanded_hierarchy_toc(args, collectproto, disp, outconvert, textout, logout);
340  else
341    output_contracted_hierarchy_toc(classifytype, formatstring, args, collectproto,
342                    disp, outconvert, textout, logout);
343
344  textout << "</table>\n";
345
346  if (havecontrols) textout << "</td></tr></table>\n";
347
348  textout << "\n<!-- end of Table of Contents -->\n";
349}
350
351
352void output_contracted_hierarchy_toc (const text_t &classifytype, text_t &formatstring,
353                      cgiargsclass &args, recptproto *collectproto,
354                      displayclass &disp, outconvertclass &outconvert,
355                      ostream &textout, ostream &logout) {
356
357  int tabcount = 0;
358  text_tarray parents;
359  text_tset metadata;
360  FilterResponse_t fsiblings, fparents;
361  bool getParents = false;
362
363  text_t &arg_d = args["d"];
364  text_t OID = arg_d;
365  if (OID.empty()) OID = args["cl"];
366  text_t &collection = args["c"];
367
368  // if format string is empty use the default
369  if (formatstring.empty())
370    formatstring = "<td valign=top nowrap>[link][icon][/link]</td><td>{Or}{[Title],Untitled}</td>";
371
372  format_t *formatlistptr = new format_t();
373  parse_formatstring (formatstring, formatlistptr, metadata, getParents);
374
375  metadata.insert ("Date");
376  metadata.insert ("hastxt");
377  metadata.insert ("haschildren");
378  metadata.insert ("doctype");
379  metadata.insert ("classifytype");
380
381  if (has_children (OID, collection, collectproto, logout)) {
382      get_parents_array (OID + ".fc", parents);
383
384      if (!get_children (OID, collection, metadata, getParents,
385             collectproto, fsiblings, logout))
386    return;
387  } else {
388    get_parents_array (OID, parents);
389    if (!get_children (OID + ".pr", collection, metadata,
390               getParents, collectproto, fsiblings, logout))
391    return;
392  }
393  if (!get_info (parents, collection, metadata, false, collectproto, fparents, logout)) return;
394 
395  if (!fparents.docInfo.empty())
396    output_parents_toc(args, fparents, tabcount, disp,
397               formatlistptr, outconvert, textout, logout);
398 
399  if (!fsiblings.docInfo.empty())
400    output_siblings_toc (classifytype, args, fsiblings, tabcount, disp,
401             formatlistptr, outconvert, textout, logout);
402}
403void output_parents_toc (cgiargsclass &args, const FilterResponse_t &parents,
404             int &tabcount, displayclass &disp,
405             format_t *formatlistptr, outconvertclass &outconvert,
406             ostream &textout, ostream &/*logout*/) {
407
408  text_t tab, icon;
409  text_t &arg_cl = args["cl"];
410  text_t &arg_d = args["d"];
411  int numcols = parents.docInfo.size() + 1;
412 
413  bool intable = is_table_content (formatlistptr);
414 
415  ResultDocInfo_tarray::iterator thisparent = parents.docInfo.begin();
416  ResultDocInfo_tarray::iterator end = parents.docInfo.end();
417
418  int len = (*thisparent).metadata.size();
419  const text_t &classifytype = (*thisparent).metadata[len-1].values[0];
420
421  // don't want top level of any classifications to be displayed
422  if (arg_d.empty() && thisparent != end) {thisparent ++; numcols --;}
423
424  // don't want second level of classifications using classification links
425  if ((classifytype == "AZList" || classifytype == "DateList") && (thisparent != end))
426    {thisparent ++; numcols --;}
427
428  // the tab line
429  if (thisparent != end) {
430    text_t coltabs;
431    for (int i = 0; i < numcols; i ++) coltabs += "_document:tab_";
432    textout << outconvert << disp << "<tr>" << coltabs << "<td></td></tr>\n";
433  }
434
435  while (thisparent != end) {
436
437    const text_t &doctype = (*thisparent).metadata[len-2].values.back();
438
439    // set up icon and pointer
440    icon = "_document:icon";
441    if ((doctype != "classify") && ((*thisparent).OID == arg_d))
442      icon += "arrow";
443    if (doctype == "classify") icon += "openbookshelf_";
444    else if (is_top((*thisparent).OID)) icon += "openbook_";
445    else icon += "openfolder_";
446   
447    if (tabcount == 1) textout << "<td></td>\n";
448    else if (tabcount > 1) textout << "<td colspan=" << tabcount << "></td>";
449   
450    // set up the link
451    text_t link = "<a href=\"_httpdocument_";
452    if (is_top((*thisparent).OID) && args.getintarg("x")) link = "<a name=top>";
453    else
454      if (doctype == "classify") link += "&cl=" + (*thisparent).OID + ".pr\">";
455      else
456    if (is_top ((*thisparent).OID))
457      if (arg_cl.empty())
458        link = "<a name=top>";
459      else if (arg_cl == "search")
460        link = "<a href=\"_httpquery_\">";
461      else
462        link += "&cl=" + arg_cl + "\">";
463    else link += "&cl=" + arg_cl + "&d=" + (*thisparent).OID + ".pr\">";
464   
465    if ((numcols-tabcount) == 1) textout << "<td>";
466    else if ((numcols-tabcount) > 1) textout << "<td colspan="
467                         << (numcols-tabcount) << ">";
468
469    if (intable) textout << "<table><tr>";
470   
471    textout << outconvert << disp
472        << get_formatted_string (*thisparent, formatlistptr, link, icon);
473   
474    if (intable) textout << "</tr></table>";
475    textout << "</td></tr>\n";
476
477    tabcount ++;
478    thisparent ++;
479  }
480}
481
482
483void output_siblings_toc (const text_t &classifytype, cgiargsclass &args,
484              const FilterResponse_t &siblings, int &tabcount,
485              displayclass &disp, format_t *formatlistptr,
486              outconvertclass &outconvert, ostream &textout,
487              ostream &/*logout*/) {
488
489  bool intable = is_table_content (formatlistptr);
490
491  ResultDocInfo_tarray::const_iterator thissibling = siblings.docInfo.begin();
492  ResultDocInfo_tarray::const_iterator sibend = siblings.docInfo.end();
493
494  if (thissibling == sibend) return;
495
496  // tabbing
497  if (tabcount) {
498    if (tabcount == 1) textout << "<tr><td></td>\n";
499    else if (tabcount > 1) textout << "<tr><td colspan=" << tabcount << "></td>";
500    textout << "<td><table>\n";
501  }
502
503  if (!intable) textout << "<tr><td>\n";
504 
505  if (classifytype == "DateList")
506    output_datelist (args, thissibling, sibend, intable, disp,
507             formatlistptr, outconvert, textout);
508  else
509    output_stdlist (args, thissibling, sibend, intable, disp,
510            formatlistptr, outconvert, textout);
511
512  if (!intable) textout << "</td></tr></table>\n";
513  if (tabcount) textout << "</table></td></tr>\n";
514}
515
516void output_stdlist (cgiargsclass &args, ResultDocInfo_tarray::iterator &here,
517             ResultDocInfo_tarray::iterator &end, bool intable,
518             displayclass &disp, format_t *formatlistptr,
519             outconvertclass &outconvert, ostream &textout) {
520
521  text_t icon;
522  int count = 1;
523  int gt = args.getintarg("gt");
524  text_t &arg_cl = args["cl"];
525  text_t &arg_d = args["d"];
526
527  while (here != end) {
528
529    int len = (*here).metadata.size();
530    const text_t &doctype = (*here).metadata[len-2].values.back();
531    const text_t &hastxt = (*here).metadata[len-4].values.back();
532    const text_t &haschildren = (*here).metadata[len-3].values.back();
533
534    // set up icon and pointer
535    icon = "_document:icon";
536    if (doctype == "classify") {
537      if (((*here).OID == arg_cl) && (hastxt == "1"))
538        icon += "arrow";
539    } else if ((*here).OID == arg_d) icon += "arrow";
540
541    if (haschildren == "0") icon += "smalltext_";
542    else if (doctype == "classify") icon += "closedbookshelf_";
543    else if (is_top((*here).OID)) icon += "closedbook_";
544    else icon += "closedfolder_";
545   
546    // set up link
547    text_t link = "<a href=\"_httpdocument_";
548    if (doctype == "classify") link += "&cl=" + (*here).OID + "\">";
549    else link += "&cl=" + arg_cl + "&d=" + (*here).OID + "\">";
550    if (gt) {
551      link = "<a href=\"#" + text_t(count) + "\">";
552      count ++;
553    }
554
555    if (intable) textout << "<tr>";
556   
557    textout << outconvert << disp
558        << get_formatted_string (*here, formatlistptr, link, icon) << "\n";
559   
560    if (intable) textout << "</tr>";
561
562    here ++;
563  }
564}
565
566
567void output_datelist (cgiargsclass &args, ResultDocInfo_tarray::iterator &here,
568              ResultDocInfo_tarray::iterator &end, bool intable,
569              displayclass &disp, format_t *formatlistptr,
570              outconvertclass &outconvert, ostream &textout) {
571
572  text_t lastyear = "0000";
573  text_t lastmonth = "00";
574
575  while (here != end) {
576
577    int len = (*here).metadata.size();
578    const text_t &doctype = (*here).metadata[len-2].values.back();
579    const text_t &date = (*here).metadata[len-5].values.back();
580
581    // bail on this document if it has no date
582    if (date.empty()) continue;
583
584    text_t::const_iterator datebegin = date.begin();
585
586    text_t link = "<a href=\"_httpdocument_&cl=";
587    text_t icon = "_document:iconclosedbook_";
588     
589    if (doctype == "classify") {
590      icon = "_document:iconclosedbookshelf_";
591      link += (*here).OID + "\">";
592    } else link += args["cl"] + "&d=" + (*here).OID + "\">";
593
594    text_t thisyear = substr (datebegin, datebegin+4);
595    text_t thismonth = substr (datebegin+4, datebegin+6);
596
597    textout << "<tr>\n";
598
599    if (thisyear != lastyear) {
600      textout << outconvert << "<td><b>" << thisyear << "</b></td>";
601      lastyear = thisyear;
602    } else
603      textout << "<td></td>";
604
605    if (thismonth != lastmonth) {
606      textout << outconvert << disp << ("<td><b>_textmonth" + thismonth + "_</b></td>");
607      lastmonth = thismonth;
608    } else
609      textout << "<td></td>";
610
611    if (!intable) textout << "<td>\n";
612   
613    textout << outconvert << disp
614          << get_formatted_string (*here, formatlistptr, link, icon) << "\n";
615
616    if (!intable) textout << "</td>";
617     
618    textout << "</tr>\n";
619
620    here ++;
621  }
622}
623
624void output_expanded_hierarchy_toc (cgiargsclass &args, recptproto *collectproto,
625                    displayclass &disp, outconvertclass &outconvert,
626                    ostream &textout, ostream &logout) {
627
628  text_t OID, topOID, icon;
629  bool is_classify;
630  FilterResponse_t response;
631  int tabcols=0, totalcols=0, lasttabcols=0;
632
633  int gt = args.getintarg("gt");
634  text_t doclink = "<a href=\"_httpdocument_&cl=";
635
636  text_t &arg_d = args["d"];
637  text_t &arg_cl = args["cl"];
638
639  if (arg_d.empty()) {
640    if (arg_cl.empty()) return;
641    OID = arg_cl;
642    topOID = OID; // don't always want to expand from top if expanding classifications
643    is_classify=true;
644  } else {
645    OID = arg_d;
646    get_top (arg_d, topOID);
647    is_classify=false;
648  }
649
650  // Get OIDs and metadata of all topOIDs contents (and topOID itself)
651  text_tset metadata;
652  metadata.insert ("Title");
653  metadata.insert ("haschildren");
654  metadata.insert ("doctype");
655  //  metadata.insert ("hastxt");
656
657  get_contents (topOID, is_classify, metadata, totalcols,
658        args["c"], collectproto, response, logout);
659  int excess = countchar (topOID.begin(), topOID.end(), '.');
660  totalcols -= excess;
661
662  // allow for pointer
663  if (!is_classify && !gt) totalcols += 2;
664  else totalcols += 1;
665
666  ResultDocInfo_tarray::iterator thissection = response.docInfo.begin();
667  ResultDocInfo_tarray::iterator lastsection = response.docInfo.end();
668 
669  int count = 1;
670  while (thissection != lastsection) {
671   
672    const text_t &title = (*thissection).metadata[0].values[0];
673    const int haschildren = (*thissection).metadata[1].values[0].getint();
674    const text_t &doctype = (*thissection).metadata[2].values[0];
675
676    text_t icontabs, tab, pointer;
677
678    // set up icon
679    icon = "_document:iconsmalltext_";
680    if (is_top((*thissection).OID))
681      if (classifytype == "Document") icon = "_document:iconopenbook_";
682      else
683    if (doctype == "classify") icon = "_document:iconopenbookshelf_";
684    else icon = "_document:iconclosedbook_";
685    else if (haschildren)
686      if (classifytype == "Document") icon = "_document:iconopenfolder_";
687      else icon = "_document:iconopenbookshelf_";
688   
689    // set up tabbing
690    if ((classifytype == "classify") && (doctype != "classify"))
691      tabcols = lasttabcols + 1;
692    else {
693      tabcols = countchar ((*thissection).OID.begin(), (*thissection).OID.end(), '.');
694      lasttabcols = tabcols;
695    }
696    tabcols -= excess;
697
698    for (int i = 0; i < tabcols; i++)
699      icontabs += "_document:icontab_";
700   
701    // set up pointer
702    if (classifytype == "Document" && !gt) {
703      if ((*thissection).OID == OID) pointer = "_document:iconpointer_";
704      else pointer = "_document:icontab_";
705      tabcols ++;
706    }
707   
708    int colsremaining = totalcols - tabcols;
709
710    if (tabcols > 0) {
711      tab = "<td";
712      if (tabcols > 1) tab += " colspan=" + text_t(tabcols);
713      tab += ">" + icontabs + pointer + "</td>";
714    }
715
716    textout << outconvert << disp << "<tr>" << tab << "<td>";
717   
718    if ((classifytype == "Document") && (is_top((*thissection).OID)) &&
719    (args.getintarg("x")))
720      textout << outconvert << disp << icon << "</td><td";
721
722    else {
723      if (!gt) {
724    const text_t &thisOID = (*thissection).OID;
725    text_t link;
726    if (is_top (thisOID))
727      if (classifytype == "classify")
728        link = doclink + arg_cl + "&d=" + thisOID + "\">";
729      else
730        if (arg_cl.empty())
731          link.clear();
732        else if (arg_cl == "search")
733          link = "<a href=\"_httpquery_\">";
734        else
735          link = doclink + arg_cl + "\">";
736    else
737      if (haschildren)
738        if (classifytype == "classify")
739          link = doclink + thisOID + ".pr\">";
740        else
741          link = doclink + arg_cl + "&d=" + thisOID + ".pr\">";
742      else
743        if (classifytype == "classify")
744          link = doclink + thisOID + "\">";
745        else
746          link = doclink + arg_cl + "&d=" + thisOID + "\">";
747   
748    textout << outconvert << disp << link;
749      } else {
750    textout << "<a href=\"#" << count << "\">";
751    count ++;
752      }
753   
754      textout << outconvert << disp << icon << "</a></td><td";
755    }
756    if (colsremaining > 1) textout << " colspan=" << colsremaining;
757    textout << outconvert << disp << ">" << title << "</td></tr>\n";
758
759    thissection ++;
760  }
761}
762
763/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
764-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
765
766// set_arrow_macros sets the _httpprevarrow_ and _httpnextarrow_ macros
767// it shouldn't be called if OID is the top level of a book
768// as the "hasprevious" and "hasnext" metadata won't be set
769// when the filter can't get OIDs parent info - one day I'll
770// fix this ;-)
771void set_arrow_macros (const text_t &OID, const text_t &classifytype,
772               bool showtoppage, displayclass &disp,
773               recptproto *collectproto, const text_t &collection,
774               ostream &logout) {
775
776  if (OID.empty()) return;
777
778  text_tset metadata;
779  FilterResponse_t response;
780
781  metadata.insert ("haschildren");
782  metadata.insert ("hasnext");
783  metadata.insert ("hasprevious");
784  // get "haschildren", "hasnext" and "hasprevious" metadata for OID
785  if (get_info (OID, collection, metadata, false, collectproto, response, logout)) {
786
787    text_t haschildren = response.docInfo[0].metadata[0].values[0];
788    text_t hasnext = response.docInfo[0].metadata[1].values[0];
789    text_t hasprevious = response.docInfo[0].metadata[2].values[0];
790
791    if ((classifytype == "Hierarchy") || (classifytype == "Book")) {
792      if (haschildren == "1")
793    disp.setmacro ("httpnextarrow", "document",
794               "_If_(_cgiargd_,_httpdocument_&cl=_cgiargcl_&d=_cgiargd_.fc,_httpdocument_&cl=_cgiargcl_.fc)");
795      else if (hasnext == "1")
796    disp.setmacro ("httpnextarrow", "document",
797               "_If_(_cgiargd_,_httpdocument_&cl=_cgiargcl_&d=_cgiargd_.ns,_httpdocument_&cl=_cgiargcl_.ns)");
798      else {
799    // see if parent has younger siblings
800    if (get_info (OID + ".pr", collection, metadata, false, collectproto, response, logout)) {
801      if (!response.docInfo[0].metadata.empty() &&
802          response.docInfo[0].metadata[1].values[0] == "1")
803        disp.setmacro ("httpnextarrow", "document",
804               "_If_(_cgiargd_,_httpdocument_&cl=_cgiargcl_&d=_cgiargd_.pr.ns,_httpdocument_&cl=_cgiargcl_.pr.ns)");
805    }
806      }
807
808      if (hasprevious == "1") {
809    // see if OIDs older sibling has children
810    if (get_info (OID + ".ps", collection, metadata, false, collectproto, response, logout)) {
811      if (response.docInfo[0].metadata[0].values[0] == "1")
812        disp.setmacro ("httpprevarrow", "document",
813               "_If_(_cgiargd_,_httpdocument_&cl=_cgiargcl_&d=_cgiargd_.ps.lc,_httpdocument_&cl=_cgiargcl_.ps.lc)");
814      else
815        disp.setmacro ("httpprevarrow", "document",
816               "_If_(_cgiargd_,_httpdocument_&cl=_cgiargcl_&d=_cgiargd_.ps,_httpdocument_&cl=_cgiargcl_.ps)");
817    }
818      } else if (showtoppage && !is_top (OID))
819    disp.setmacro ("httpprevarrow", "document",
820               "_If_(_cgiargd_,_httpdocument_&cl=_cgiargcl_&d=_cgiargd_.pr,_httpdocument_&cl=_cgiargcl_.pr)");
821    }
822
823    else {
824      if (hasnext == "1")
825    disp.setmacro ("httpnextarrow", "document",
826               "_If_(_cgiargd_,_httpdocument_&cl=_cgiargcl_&d=_cgiargd_.ns,_httpdocument_&cl=_cgiargcl_.ns)");
827      if (hasprevious == "1")
828    disp.setmacro ("httpprevarrow", "document",
829               "_If_(_cgiargd_,_httpdocument_&cl=_cgiargcl_&d=_cgiargd_.ps,_httpdocument_&cl=_cgiargcl_.ps)");
830    }
831  }
832}
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
Note: See TracBrowser for help on using the browser.