source: trunk/gsdl/src/recpt/hlistbrowserclass.cpp@ 5017

Last change on this file since 5017 was 4906, checked in by sjboddie, 21 years ago

Replaced overloaded get_formatted_string() functions in formattools with
a single function by using a text_tmap in place of the old link, text,
icon, and highlight variables.

  • Property svn:executable set to *
  • Property svn:keywords set to Author Date Id Revision
File size: 6.0 KB
Line 
1/**********************************************************************
2 *
3 * hlistbrowserclass.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 *********************************************************************/
25
26#include "hlistbrowserclass.h"
27#include <assert.h>
28#include "OIDtools.h"
29
30hlistbrowserclass::hlistbrowserclass () {
31}
32
33hlistbrowserclass::~hlistbrowserclass () {
34}
35
36// returns the name that specifies the browserclass type
37text_t hlistbrowserclass::get_browser_name () {
38 return "HList";
39}
40
41void hlistbrowserclass::load_metadata_defaults (text_tset &metadata) {
42 metadata.insert ("doctype");
43}
44
45text_t hlistbrowserclass::get_default_formatstring () {
46 return "[link][highlight][Title][/highlight][/link]";
47}
48
49// need to change OID to it's child
50void hlistbrowserclass::processOID (cgiargsclass &args, recptproto *collectproto,
51 ostream &logout) {
52
53 text_t OID = args["d"];
54 bool is_classify = false;
55 if (OID.empty()) {
56 is_classify = true;
57 OID = args["cl"];
58 }
59
60 FilterResponse_t response;
61 text_tset metadata;
62 metadata.insert ("childtype");
63 text_t classifytype = "Invisible";
64 text_t child_doctype;
65
66 text_tarray OIDs;
67
68 while (classifytype == "Invisible") {
69 OIDs.erase (OIDs.begin(), OIDs.end());
70
71 OIDs.push_back (OID);
72 OIDs.push_back (OID + ".fc");
73
74 get_info (OIDs, args["c"], metadata, false, collectproto, response, logout);
75
76 OID = response.docInfo[1].OID;
77 classifytype = response.docInfo[0].metadata["childtype"].values[0];
78 }
79 if (is_classify) args["cl"] = OID;
80 else args["d"] = OID;
81}
82
83int hlistbrowserclass::output_section_group (ResultDocInfo_t &section, cgiargsclass &args,
84 const text_t& collection, int colnumber,
85 format_t *formatlistptr, bool use_table,
86 text_tset &metadata, bool &getParents,
87 recptproto *collectproto, displayclass &disp,
88 outconvertclass &outconvert, ostream &textout,
89 ostream &logout) {
90
91 // expanded contents are going to cause some nasty recursions
92 // so we'll only continue if being passed the current section
93 if ((args["gc"] == 1) && (section.OID != args["d"])) return 0;
94
95 // get all siblings
96 FilterResponse_t response;
97 text_t &arg_cl = args["cl"];
98 get_children (section.OID + ".pr", args["c"], metadata, getParents,
99 collectproto, response, logout);
100
101
102 if (use_table || colnumber > 0) {
103 textout << outconvert << "<table><tr><td>";
104 // get tab size
105 text_t tab; int itab;
106 disp.expandstring ("Global", "_tabwidth_", tab);
107 itab = tab.getint();
108 if (colnumber > 0) textout << outconvert << disp
109 << "<img src=\"_httpimg_/space.gif\" width="
110 << (itab*colnumber) << ">";
111 textout << outconvert << "</td>\n";
112 }
113
114 textout << outconvert << "<table><tr>\n";
115
116 ResultDocInfo_tarray::iterator tsibling = response.docInfo.begin();
117 ResultDocInfo_tarray::iterator esibling = response.docInfo.end();
118
119 text_t icon, link;
120 int num_chars=0; // see note below - jrm21
121 while (tsibling != esibling) {
122
123 bool highlight = false;
124 text_t &doctype = (*tsibling).metadata["doctype"].values[0];
125
126 if ((*tsibling).OID == section.OID) {
127 link.clear();
128 highlight = true;
129 } else {
130 link = "<a href=\"_httpdocument_";
131 if (doctype == "classify")
132 link += "&cl=" + (*tsibling).OID + "\">";
133 else
134 link += "&cl=" + arg_cl + "&d=" + (*tsibling).OID + "\">";
135 }
136
137 text_tmap options;
138 options["link"] = link;
139 options["icon"] = icon;
140 if (highlight) options["highlight"] = "1";
141 else options["highlight"] = "0";
142
143 text_t fmt_str=get_formatted_string (collection, collectproto,
144 *tsibling, disp, formatlistptr,
145 options, logout);
146
147 /* this is awful. Someone please come up with a better way to prevent
148 the table of contents when browsing metadata from becoming too wide.
149 This is an attempt to add new rows when the number of characters in
150 the current row becomes too high. It doesn't know about macros in the
151 string, though... -- jrm21 */
152
153 char *tmp_str=fmt_str.getcstr();
154 char *end_str=tmp_str+strlen(tmp_str);
155 while (tmp_str<end_str) {
156 if (*tmp_str=='<') { // for html tags
157 while (*tmp_str!='>') tmp_str++;
158 } else if (*tmp_str=='&') { // for html entities
159 while (*tmp_str!=';') tmp_str++;
160 num_chars++;
161 } else num_chars++;
162 tmp_str++;
163 }
164
165 if (num_chars>100) { // this is fairly arbitrary...
166 textout << outconvert << "</tr>\n<tr>";
167 num_chars=0;
168 }
169
170 textout << outconvert << "<td>" << disp << fmt_str << "</td>\n";
171 tsibling ++;
172 }
173
174 textout << outconvert << "</tr></table>\n";
175 if (use_table || colnumber > 0) textout << outconvert << "</tr></table>\n";
176 return 0;
177}
178
179int hlistbrowserclass::output_section_group (FilterResponse_t &/*sections*/, cgiargsclass &/*args*/,
180 const text_t &/*collection*/, int /*colnumber*/,
181 format_t * /*formatlistptr*/, bool /*use_table*/,
182 text_tset &/*metadata*/, bool &/*getParents*/,
183 recptproto * /*collectproto*/, displayclass &/*disp*/,
184 outconvertclass &/*outconvert*/, ostream &/*textout*/,
185 ostream &/*logout*/) {
186 return 0;
187}
Note: See TracBrowser for help on using the repository browser.