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

Last change on this file since 7389 was 7215, checked in by sjboddie, 20 years ago

Fixed a minor bug in the way nested HLists were displayed

  • Property svn:executable set to *
  • Property svn:keywords set to Author Date Id Revision
File size: 6.2 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_tarray OIDs;
65
66 while (classifytype == "Invisible" || classifytype == "HList") {
67 OIDs.erase (OIDs.begin(), OIDs.end());
68
69 OIDs.push_back (OID);
70 OIDs.push_back (OID + ".fc");
71
72 get_info (OIDs, args["c"], metadata, false, collectproto, response, logout);
73
74 OID = response.docInfo[1].OID;
75 classifytype = response.docInfo[1].metadata["childtype"].values[0];
76 }
77 if (is_classify) args["cl"] = OID;
78 else args["d"] = OID;
79}
80
81int hlistbrowserclass::output_section_group (ResultDocInfo_t &section, cgiargsclass &args,
82 const text_t& collection, int colnumber,
83 format_t *formatlistptr, bool use_table,
84 text_tset &metadata, bool &getParents,
85 recptproto *collectproto, displayclass &disp,
86 outconvertclass &outconvert, ostream &textout,
87 ostream &logout) {
88
89 // expanded contents are going to cause some nasty recursions
90 // so we'll only continue if being passed the current section
91 if ((args["gc"] == 1) && (section.OID != args["d"])) return 0;
92
93 // get all siblings
94 FilterResponse_t response;
95 text_t &arg_cl = args["cl"];
96 get_children (section.OID + ".pr", args["c"], metadata, getParents,
97 collectproto, response, logout);
98
99
100 if (use_table || colnumber > 0) {
101 textout << outconvert << "<table><tr><td>";
102 // get tab size
103 text_t tab; int itab;
104 disp.expandstring ("Global", "_tabwidth_", tab);
105 itab = tab.getint();
106 if (colnumber > 0) textout << outconvert << disp
107 << "<img src=\"_httpimg_/space.gif\" width="
108 << (itab*colnumber) << ">";
109 textout << outconvert << "</td>\n";
110 }
111
112 textout << outconvert << "<table><tr>\n";
113
114 ResultDocInfo_tarray::iterator tsibling = response.docInfo.begin();
115 ResultDocInfo_tarray::iterator esibling = response.docInfo.end();
116
117 text_t icon, link;
118 int num_chars=0; // see note below - jrm21
119 while (tsibling != esibling) {
120
121 bool highlight = false;
122 text_t &doctype = (*tsibling).metadata["doctype"].values[0];
123
124 if ((*tsibling).OID == section.OID) {
125 link.clear();
126 highlight = true;
127 } else {
128 link = "<a href=\"_httpdocument_";
129 if (doctype == "classify")
130 link += "&cl=" + (*tsibling).OID + "\">";
131 else {
132 link += "&cl=" + arg_cl + "&d=" + (*tsibling).OID;// + "\">";
133 // [modification to allow default document detach settings -- kjdon]
134 if (args["xx"]=="1") {
135 // documents should be detached
136 link += "&x=1\" target=\\_blank>";
137 } else {
138 link += "\">";
139 }
140 }
141 }
142
143 text_tmap options;
144 options["link"] = link;
145 options["icon"] = icon;
146 if (highlight) options["highlight"] = "1";
147 else options["highlight"] = "0";
148
149 text_t fmt_str=get_formatted_string (collection, collectproto,
150 *tsibling, disp, formatlistptr,
151 options, logout);
152
153 /* this is awful. Someone please come up with a better way to prevent
154 the table of contents when browsing metadata from becoming too wide.
155 This is an attempt to add new rows when the number of characters in
156 the current row becomes too high. It doesn't know about macros in the
157 string, though... -- jrm21 */
158
159 char *tmp_str=fmt_str.getcstr();
160 char *end_str=tmp_str+strlen(tmp_str);
161 while (tmp_str<end_str) {
162 if (*tmp_str=='<') { // for html tags
163 while (*tmp_str!='>') tmp_str++;
164 } else if (*tmp_str=='&') { // for html entities
165 while (*tmp_str!=';') tmp_str++;
166 num_chars++;
167 } else num_chars++;
168 tmp_str++;
169 }
170
171 if (num_chars>100) { // this is fairly arbitrary...
172 textout << outconvert << "</tr>\n<tr>";
173 num_chars=0;
174 }
175
176 textout << outconvert << "<td>" << disp << fmt_str << "</td>\n";
177 tsibling ++;
178 }
179
180 textout << outconvert << "</tr></table>\n";
181 if (use_table || colnumber > 0) textout << outconvert << "</tr></table>\n";
182 return 0;
183}
184
185int hlistbrowserclass::output_section_group (FilterResponse_t &/*sections*/, cgiargsclass &/*args*/,
186 const text_t &/*collection*/, int /*colnumber*/,
187 format_t * /*formatlistptr*/, bool /*use_table*/,
188 text_tset &/*metadata*/, bool &/*getParents*/,
189 recptproto * /*collectproto*/, displayclass &/*disp*/,
190 outconvertclass &/*outconvert*/, ostream &/*textout*/,
191 ostream &/*logout*/) {
192 return 0;
193}
Note: See TracBrowser for help on using the repository browser.