001 /*****************************************************************************
002 * MODULE DESCRIPTION
003 ******************************************************************************
004 *
005 * NAME: HtmlBean.java
006 * LANGUAGE: Java 2
007 * DATE: 13.11.2002
008 * AUTHOR: Jussi Mäkinen, Jyväskylä University (JYU)
009 * PURPOSE: Contains some useful routines to make HTML code
010 *
011 ******************************************************************************
012 * COPYRIGHT (C) Kiuru group
013 * Limited rights granted. Please refer to license
014 *****************************************************************************/
015
016 /*****************************************************************************
017 * UPDATES
018 ******************************************************************************
019 *
020 * 6.2.2003 / MN
021 * - Added method getH
022 *
023 * 24.3.2003 / MN
024 * - Added support for writers (eg JspWriter, PrintWriter...)
025 *
026 * 28.5.2003 /mn
027 * - Moved getLink from HtmlTable
028 ******************************************************************************/
029 package kiurubeans;
030
031 import java.util.*;
032 import kotkabeans.*;
033
034
035
036 /**
037 * Facilitates HTML output and translations.
038 *
039 * @author Jussi Mäkinen & Miika Nurminen
040 */
041 public class HtmlBean {
042
043 // Attributes
044
045 /** used for translation. if user is not set, text is translated 'as is'. */
046 public User user;
047
048 /** Writer - current JSP page (or other writer) to print */
049 private java.io.PrintWriter writer;
050
051 // Constructors
052
053 /** Creates a new instance of HtmlBean. Dummy empty constructor */
054 public HtmlBean() {
055 }
056
057 // Access methods
058
059 /** Getter for property writer.
060 * @return Value of property writer.
061 */
062 public java.io.PrintWriter getWriter() {
063 return this.writer;
064 }
065
066 /** Setter for property writer.
067 * @param writer New value of property writer.
068 */
069 public void setWriter(java.io.Writer writer) {
070 this.writer = new java.io.PrintWriter(writer);
071 }
072
073 /**
074 * Prints string to current writer and adds endline.
075 * @param s string to be written.
076 */
077 private void println(String s) {
078 getWriter().println(s);
079 }
080
081 /** Setter method for user
082 * @param user current user
083 */
084 public void setUser(User user) {
085 this.user=user;
086 }
087
088 /** Getter method for user
089 * @return current user
090 */
091 public User getUser() {
092 return this.user;
093 }
094
095 /**
096 * Translates given string
097 * @param s String that is being translated
098 * @return Translated String
099 */
100 public String translate(String s) {
101 if (getUser()==null) return s;
102 else return getUser().T(s);
103 }
104
105 /**
106 * Creates a new HTML Select list
107 *
108 * @return Generated HTML code including a select list.
109 * @param name The name of HTML Select list.
110 * @param rs ResultSet
111 * @param valueField The name of SQL field that contains the id values
112 * @param textField The name of SQL field that contains the text values.
113 * @param selected Id that is selected.
114 * @throws Exception if problems with RS2
115 */
116 public static String makeSelectList(String name,RS2 rs, String valueField, String textField, String selected) throws Exception {
117 return HtmlBean.makeSelectList(name,rs,valueField,textField,selected,null);
118 }
119
120 /** Creates a new HTML Select list
121 *
122 * @return Generated HTML code including a select list.
123 * @param name The name of HTML Select list.
124 * @param rs ResultSet
125 * @param valueField The name of SQL field that contains the id values
126 * @param textField The name of SQL field that contains the text values.
127 * @param selected Id that is selected.
128 * @param nullString nullstring is added in the beginning with value 0 (if nullString==null, nothing is added)
129 * @throws Exception If problems with RS2
130 */
131 public static String makeSelectList(String name,RS2 rs, String valueField, String textField, String selected,String nullString) throws Exception {
132 StringBuffer sb=new StringBuffer(1000);
133 sb.append("<select name=\"");
134 sb.append(name);
135 sb.append("\">\n");
136 rs.beforeFirst();
137 if (nullString!=null) {
138 sb.append("<option value=\"0\"");
139 if (selected.equals("0")) {
140 sb.append(" selected=\"selected\"");
141 }
142 sb.append(">");
143 sb.append(nullString);
144 sb.append("</option>\n");
145 }
146 while (rs.next()) {
147 sb.append("<option value=\"");
148 sb.append(rs.getString(valueField));
149 sb.append("\"");
150 if ((rs.getString(valueField).equals(selected)) && (!selected.equals(""))) {
151 sb.append(" selected=\"selected\"");
152 }
153 sb.append(">");
154 sb.append(rs.getString(textField));
155 sb.append("</option>\n");
156 }
157 sb.append("</select>");
158 return new String(sb);
159 }
160
161
162 /** Creates a group of HTML Radiobuttons
163 *
164 * @return generated radiobutton group
165 * @param name The name of HTML radiobuttons.
166 * @param rs ResultSet
167 * @param valueField The name of SQL field that contains the id values
168 * @param textField The name of SQL field that contains the text values.
169 * @param checked Which radio button is selected by default.
170 * @throws Exception if problems with rs
171 */
172 public String makeRadioGroup(String name, RS2 rs, String valueField, String textField, String checked) throws Exception {
173 return makeRadioGroup(name,rs,valueField,textField,checked,null);
174 }
175
176 /** Creates a group of HTML Radiobuttons
177 *
178 * @return generated radiobutton group
179 * @param name The name of HTML radiobuttons.
180 * @param rs RS2 where data is retrieved
181 * @param valueField The name of SQL field that contains the id values
182 * @param textField The name of SQL field that contains the text values.
183 * @param checked Which radio button is selected by default.
184 * @param nullString nullstring is added in the beginning with value 0 (if nullString==null, nothing is added)
185 * @throws Exception if problems with rs
186 */
187 public String makeRadioGroup(String name, RS2 rs, String valueField, String textField, String checked,String nullString) throws Exception {
188 StringBuffer sb=new StringBuffer(1000);
189 if (nullString!=null) {
190 sb.append("<input type=\"radio\" name=");
191 sb.append(KiuruString.quote(name));
192 sb.append(" value=\"0\"");
193 if (checked.equals("0")) {
194 sb.append(" checked=\"checked\"");
195 }
196 sb.append(" />");
197 sb.append(nullString);
198 sb.append("<br />\n");
199 }
200 rs.beforeFirst();
201 while (rs.next()) {
202 sb.append("<input type=\"radio\" name=\"");
203 sb.append(name);
204 sb.append("\" value=\"");
205 sb.append(rs.getString(valueField));
206 sb.append("\"");
207 if ((rs.getString(valueField).equals(checked)) && (!checked.equals(""))) {
208 sb.append(" checked=\"checked\"");
209 }
210 sb.append(" />");
211 sb.append(rs.getString(textField));
212 sb.append("<br />\n");
213 }
214 return new String(sb);
215 }
216
217 /** Creates a group of HTML Radiobuttons based on ArrayList with StringPairs
218 *
219 * @return generated radiobutton group
220 * @see StringPair
221 * @param name The name of HTML radiobuttons.
222 * @param rs arraylist containing (key,value) StringPairs
223 * @param checked Which radio button is selected by default.
224 * @param dobreak if true, a <code>br</code> tag is appended to the end
225 */
226 public static String makeRadioGroup(String name, ArrayList rs, String checked,boolean dobreak) {
227 if ((rs==null) || (rs.size()==0))
228 return new String();
229 StringBuffer sb=new StringBuffer(1000);
230 for (int i=0; i<rs.size(); i++) {
231 StringPair p = (StringPair)rs.get(i);
232 sb.append("<input type=\"radio\" name="+KiuruString.quote(name));
233 sb.append(" value="+KiuruString.quote(p.getKey()));
234 if ((p.getKey().equals(checked)) && (!checked.equals(""))) {
235 sb.append(" checked="+KiuruString.quote("checked"));
236 }
237 sb.append(">");
238 sb.append(p.getValue());
239 if (dobreak)
240 sb.append("<br />\n");
241 else
242 sb.append(" \n");
243 }
244 return new String(sb);
245 }
246
247 /** Creates a group of Checkbox
248 * @param name The name of HTML checkboxes
249 * @param rs RS2 where data is retrieved
250 * @param valueField The name of SQL field that contains the id values
251 * @param textField The name of SQL field that contains the text values.
252 * @param checked id for checked box
253 * @throws Exception if problems with RS2
254 * @return generated checkbox group
255 */
256 public String makeCheckBox(String name, RS2 rs, String valueField, String textField, String checked) throws Exception {
257 StringBuffer sb=new StringBuffer(1000);
258 rs.beforeFirst();
259 while (rs.next()) {
260 sb.append("<input type=\"checkbox\" name=\"");
261 sb.append(name);
262 sb.append("\" value=\"");
263 sb.append(rs.getString(valueField));
264 sb.append("\"");
265 if (rs.getString(valueField).equals(checked)) {
266 sb.append(" checked");
267 }
268 sb.append(">");
269 sb.append(rs.getString(textField));
270 sb.append("<br>\n");
271 }
272 return new String(sb);
273 }
274
275
276
277 /** Creates a new HTML Select list with size
278 *
279 * @return Generated HTML code including a select list.
280 * @param name The name of HTML Select list.
281 * @param rs ResultSet
282 * @param valueField The name of SQL field that contains the id values
283 * @param textField The name of SQL field that contains the text values.
284 * @param selected Id that is selected.
285 * @param size Select list size
286 * @param multiple if true, multiple values can be selected
287 * @throws Exception If problems with RS2
288 */
289 public static String makeSelectList(String name,RS2 rs, String valueField, String textField, String selected, int size, boolean multiple) throws Exception {
290 StringBuffer sb=new StringBuffer(1000);
291 sb.append("<select name="+KiuruString.quote(name)+" size="+KiuruString.quote(Integer.toString(size)));
292 if (multiple) {
293 sb.append(" multiple="+KiuruString.quote("multiple"));
294 }
295 sb.append(">\n");
296 while (rs.next()) {
297 sb.append("<option value=\"");
298 sb.append(rs.getString(valueField));
299 sb.append("\"");
300 if (rs.getString(valueField).equals(selected)) {
301 sb.append(" selected");
302 }
303 sb.append(">");
304 sb.append(rs.getString(textField));
305 sb.append("</option>\n");
306 }
307 sb.append("</select>");
308 return new String(sb);
309 }
310
311
312
313 /** Creates simple search form. Used for searching spaces & persons
314 * @param targetPage action page
315 * @param editName name for edit box
316 * @param editContent default text for edit box
317 * @return search form as string
318 */
319 public static String createSearchForm(String targetPage,String editName,String editContent) {
320 return HtmlBean.createSearchForm(targetPage,editName,editContent,true);
321 }
322
323 /** Creates simple search form. Used for searching spaces & persons
324 * @param targetPage action page
325 * @param editName name for edit box
326 * @param editContent default text for edit box
327 * @param closeForm if true, form is closed
328 * @return search form as string
329 */
330 public static String createSearchForm(String targetPage,String editName,String editContent,boolean closeForm) {
331 StringBuffer sb = new StringBuffer(1000);
332 sb.append("<form action="+KiuruString.quote(targetPage)+" method=\"get\">\n");
333 sb.append("<label for=\"haku\">Hakuehto:</label><br />\n");
334 sb.append("<input id=\"haku\" type=\"text\" name="+KiuruString.quote(editName)+" size=\"50\" value="+KiuruString.quote(editContent)+" />\n");
335 sb.append("<input type=\"submit\" name=\"submitSearch\" value=\"Hae\" />\n");
336 if (closeForm) sb.append("</form>");
337 return sb.toString();
338 }
339
340 /**
341 * Standard navigation text for bottom of pages concerning spaces, spacegroups & reports. probably obsolete.
342 * @return html string
343 */
344 public static String bottomNavigator() {
345 StringBuffer sb = new StringBuffer(1000);
346 sb.append("<p>\n");
347 sb.append("<a href=\"searchSpace.jsp\">Salit</a> | <a href=\"searchSpaceGroup.jsp\">Saliryhmät</a> | <a href=\"reportInit.jsp\">Raportit</a>\n");
348 sb.append("</p>\n");
349 return sb.toString();
350 }
351
352 /** Returns hidden component for html form
353 * @param name Name of the HTML hidden component.
354 * @param value Value of the HTML hidden component.
355 * @return HTML code containing the HTML hidden component.
356 */
357 public static String getHidden(String name, String value) {
358 return "<input type=\"hidden\" name="+KiuruString.quote(name)+" value="+KiuruString.quote(value)+" />\n";
359 }
360
361 /** Returns hidden component for html form
362 * @param name Name of the HTML hidden component.
363 * @param value Value of the HTML hidden component.
364 * @return HTML code containing the HTML hidden component.
365 */
366 public static String getHidden(String name, int value) {
367 return getHidden(name,Integer.toString(value));
368 }
369
370 /**
371 * Returns submit component for html form
372 * @param name Name of the HTML submit component.
373 * @param value Value of the HTML submit component.
374 * @return HTML code containing the HTML submit component.
375 */
376 public static String getSubmit(String name, String value) {
377 return "<input type=\"submit\" name="+KiuruString.quote(name)+" value="+KiuruString.quote(value)+" />\n";
378 }
379
380 /** Prints translated submit button to current writer
381 * @param name button component name
382 * @param value text on button
383 */
384 public void printSubmit(String name,String value) {
385 println(getSubmit(name,translate(value)));
386 }
387 /** Returns NON-TRANSLATED text with label style (used in html forms).
388 * to do: should the text be translated?
389 * @param text content text
390 * @return HTML code for label
391 */
392 public static String getLabel(String text) {
393 return "<strong>"+text+"</strong> ";
394 }
395
396 /** Returns page's main headline. Translates text.
397 * @param text content text
398 * @return HTML code for headline
399 */
400 public String getH(String text) {
401 return getH(text,1);
402 }
403
404 /** Returns page's headline of given level. Translates text.
405 * @param text content text
406 * @param level content level
407 * @return HTML code for headline
408 */
409 public String getH(String text, int level) {
410 return "<h"+level+">"+translate(text)+"</h"+level+">\n";
411 }
412
413 /** Retuns script tag and begin HTML comment. Always use in conjunction
414 * with end_javascript!
415 * @see #end_javascript()
416 * @return HTML code to begin javascript.
417 */
418 public static String begin_javascript() {
419 return "<script type=\"text/javascript\">"+"<!--\n";
420 }
421
422 /** Retuns end HTML comment and end script tag. Always use in conjunction
423 * with begin_javascript!
424 * @see #begin_javascript()
425 * @return HTML code to end javascript
426 */
427 public static String end_javascript() {
428 return "\n // --> </script>";
429 }
430
431 /** return begin <code>table</code> tag with parameters, standard formatting
432 * @return HTML code for begin table
433 */
434 public static String begin_table() {
435 return "<table border=\"1\" cellpadding=\"3\" cellspacing=\"0\">";
436 }
437
438 /** Returns javascript code for printing a submit button. translated.
439 * @param name component name
440 * @param value component value
441 * @param onClick javascript code to execute on click
442 * @return javascript code for printing a submit button.
443 */
444 public String getJsButton(String name, String value, String onClick) {
445 StringBuffer result = new StringBuffer(20);
446 result.append(begin_javascript());
447 result.append("document.write('<input type="+KiuruString.quote("button")+" name=");
448 result.append(KiuruString.quote(name));
449 result.append(" value=");
450 result.append(KiuruString.quote(translate(value)));
451 result.append(" onClick=");
452 result.append(KiuruString.quote(onClick));
453 result.append(" />');\n");
454 result.append(end_javascript());
455 return result.toString();
456 }
457
458
459 /** Returns current page filename, no request parameters or path.
460 * @param r request from JSP page
461 * @throws MalformedURLException if URI is not valid
462 * @return page filename
463 */
464 public static String getCurrentPage(javax.servlet.http.HttpServletRequest r) throws java.net.MalformedURLException {
465 String s=r.getRequestURI();
466 int i=s.indexOf("?");
467 if (i<=0)
468 return s;
469 else
470 return s.substring(1,s.indexOf("?")-1);
471 }
472
473 /**
474 * Returns current time in string. parameter "currentTime". Can be appended in
475 * URL.
476 * @return current time in string - can be appended in urls that mustn't be cached
477 */
478 public static String getCurrentTime() {
479 return "currentTime="+System.currentTimeMillis();
480 }
481
482 /** Taken from portal/pageAddUser. Sorts hashtable values and puts them in a
483 * combo box.
484 * @param translations Translation values in a hash table (key id)
485 * @param selected Selected value
486 */
487 public void printOptionValues(java.util.Hashtable translations, String selected) /*throws Exception */{
488 java.util.ArrayList sortedIDs = Tools.sortHashtableByValue(translations);
489 for (int i=0; i<sortedIDs.size(); i++) {
490 String id = (String)sortedIDs.get(i); //nextIter;
491 String sel = ( id.equals(selected) ? " selected=\"selected\"" : "" );
492 println("<option value=\"" + id + "\""+sel+">" + translations.get(id)+"</option>\n");
493 }
494 }
495
496
497 /**
498 * Creates a new HTML Select list based on hashtable. hashtable values are not translated!
499 * @param name The name of HTML Select list.
500 * @param values Values to be printed (keys are ids)
501 * @param selected Id that is selected.
502 * @param nullString nullstring is added in the beginning with value 0 (if nullString==null, nothing is added)
503 */
504 public void printSelectList(String name,java.util.Hashtable values, String selected,String nullString) {
505 println("<select name="+KiuruString.quote(name)+">");
506 if (nullString!=null) {
507 println("<option value=\"0\"");
508 if (selected.equals("0")) {
509 println(" selected=\"selected\"");
510 }
511 println(">---"+translate(nullString)+"---</option>");
512 }
513 printOptionValues(values,selected);
514 println("</select>");
515 }
516
517 /**
518 * Prints a HtmlTable component on current writer
519 * @param h HtmlTable component
520 * @see HtmlTable
521 */
522 public void printHtmlTable(HtmlTable h) {
523 println(h.generateTable());
524 }
525
526 /** Returns current time as a hidden control to ensure cache-free functionality.
527 * @return HTML code to be put inside a form
528 */
529 public static String getCurrentTimeAsHidden() {
530 return "<input type=\"hidden\" name=\"currentTimeMillis\" value=\""+System.currentTimeMillis()+"\" />\n";
531 }
532
533 /** Returns HTML code for a link. If title is empty, defaultTitle is appended
534 * instead.
535 *
536 * @return HTML code for a link
537 * @param title Visible text in link
538 * @param value value appended to base text
539 * @param defaultTitle visible text if title is empty
540 */
541 public static String getLink(String title,String value,String defaultTitle) {
542 if (KiuruString.isEmpty(title)) title=defaultTitle;
543 StringBuffer sb=new StringBuffer(20);
544 sb.append("<a href="+KiuruString.quote(value));
545 sb.append(">");
546 sb.append(title);
547 sb.append("</a>");
548 return sb.toString();
549 }
550
551 /** Returns HTML code for a link.
552 *
553 * @return HTML code for a link
554 * @param title Visible text in link
555 * @param value value appended to base text
556 */
557 public static String getLink(String title,String value) {
558 return getLink(title,value,"");
559 }
560 }
561 /***************************************************************************************************
562 * COPYRIGHT (C) KIURU -PROJECT GROUP
563 * Limited rights granted. Please refer to license.
564 **************************************************************************************************/