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 **************************************************************************************************/