Subversion Repositories DevTools

Rev

Blame | Last modification | View Log | RSS feed

/*
 * Created on 24/03/2005
 */
package DMS;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;


/**
 * @author mtayler
 */

public class htmlGen {
        
        private HttpServletRequest FRequest;
        private HttpServletResponse FResponse;
        private templateXML FTemplate;
        
        private projectItem FDefaultProject;
        private templateItem FDefaultTemplate;
        private dbTemplateData FTemplateData;
        
        private static String PROJECT = "filterfieldproject";
        private static String PROJECT_LABEL = "Projects";
        private static String TEMPLATE = "filterfieldtemplate";
        private static String TEMPLATE_LABEL = "Templates";
        private static String TEMPLATE_XML = "TEMPLATE_XML";
        private static String TEMPLATE_DATA = "TEMPLATE_DATA";
                

        public htmlGen(HttpServletRequest request, HttpServletResponse response) {
                FRequest=request;
                FResponse=response;
                
                FTemplate = (templateXML)getAttribute(TEMPLATE_XML);
                if (FTemplate==null) {
                        FTemplate = new templateXML();
                        setAttribute(TEMPLATE_XML,FTemplate);
                }
                                        
                String sDefaultProject = DMSUtils.NVL(getParameter(PROJECT));           
                String sDefaultTemplate = DMSUtils.NVL(getParameter(TEMPLATE));         
                FDefaultProject = FTemplate.getProjectByName(sDefaultProject);          
                FDefaultTemplate = null;
                if (FDefaultProject!=null) {
                        FDefaultTemplate = FDefaultProject.getTemplateByName(sDefaultTemplate);
                        if (FDefaultTemplate!=null) {
                                
                                FTemplateData = (dbTemplateData)getAttribute(TEMPLATE_DATA);
                                if (FTemplateData==null || !FTemplateData.getTemplate().equals(FDefaultTemplate)) {
                                        FTemplateData=new dbTemplateData(FDefaultTemplate, FRequest);
                                        setAttribute(TEMPLATE_DATA,FTemplateData);
                                }
                                FTemplateData.load(FRequest);//load all data
                        }                       
                }       
                                
        }
        
        private void setAttribute(String key, Object obj) {
                if (FRequest!=null) FRequest.getSession(false).setAttribute(key, obj);
        }

        private Object getAttribute(String key) {               
                if (FRequest!=null) return FRequest.getSession(false).getAttribute(key);
                else return null;               
        }

        private String getParameter(String key) {
                if (FRequest!=null) return FRequest.getParameter(key);
                else return null;
        }
        
        private PrintWriter getWriter() {
                PrintWriter writer = null;              
                try {
                        writer=FResponse.getWriter();   
                } catch (Exception e) {
                        e.printStackTrace();
                }
                
                return writer;
        }

        private void write(String data) {
                PrintWriter writer=getWriter(); 
                
                if (writer!=null) {
                        writer.println(data);
                }
        }

        private String genCombo(String name, String label, comboDataItem[] data, String defValue, boolean bSelectAll, boolean bRefresh) {
                StringBuffer sb = new StringBuffer();
                sb.append ("  ");
                sb.append("<span class=comboLabelStyle>").append(DMSUtils.cleanHTMLStr(label)).append("</span>").append("&nbsp;").append("\n");
                sb.append ("&nbsp;&nbsp;");
                sb.append("<select class=comboStyle name=\"").append(name).append("\" ").append(bRefresh?"onchange=\"javascript:refresh()\"":"").append(" onkeypress=\"if(window.event.keyCode =='13') refresh();\">").append("\n");
                if (bSelectAll) {
                        sb.append("<option value=\"ALL\"").append(defValue!=null&&defValue.equals("ALL")?" selected ":"").append(">").append("\n");
                        sb.append("All").append("\n");
                } else {
                        sb.append("<option value=\"NONE\"").append(defValue!=null&&defValue.equals("NONE")?" selected ":"").append(">").append("\n");
                        sb.append(DMSUtils.cleanHTMLStr("<Please select one>")).append("\n");
                }
                sb.append("</option>").append("\n");                    

                for (int i=0;i<data.length;i++) {                       
                        if (data[i].getValue()!=null) {
                                sb.append("<option value=\"").append(DMSUtils.cleanJStr(data[i].getValue())).append("\"").append(defValue!=null&&defValue.equals(data[i].getValue())?" selected ":"").append(">").append("\n");
                                sb.append(DMSUtils.cleanHTMLStr(data[i].getDescrip())).append("\n");
                                sb.append("</option>").append("\n");
                        }
                }
                sb.append("</select>").append("\n");                            
                return sb.toString();           
        }
        
        private String genCombo(String name, String label, comboDataItem[] data, String defValue) {
                return genCombo(name, label, data, defValue, true, false);
        }

        public String genFilters() {    
                
                StringBuffer sb = new StringBuffer();
                        
                String[] pnames = DMSUtils.SortArray(FTemplate.getProjectNames());
                String sDefaultProject = DMSUtils.NVL(getParameter(PROJECT));
                sb.append(genCombo(PROJECT,PROJECT_LABEL,DMSUtils.genComboDataItemArray(pnames,pnames),sDefaultProject, false, true));                          
                
                if (FDefaultProject!=null) {
                        
                        String[] tnames = DMSUtils.SortArray(FDefaultProject.getTemplateNames());
                        String sDefaultTemplate = DMSUtils.NVL(getParameter(TEMPLATE));
                        sb.append ("&nbsp;&nbsp;");
                        sb.append(genCombo(TEMPLATE,TEMPLATE_LABEL,DMSUtils.genComboDataItemArray(tnames,tnames),sDefaultTemplate, false, true));                       
                }       
                
                sb.append("<br>");
                sb.append("<br>");              
                                
                if (FDefaultTemplate!=null) {
                                                
                        columnList cols = FDefaultTemplate.getColumns();
                        String[] colNames = cols.getColumnNames();
                        
                        sb.append("<table border=0 class=tableStyle>").append("\n");
                        sb.append("<tr>").append("\n"); 
                        sb.append("<td>").append("\n"); 

                        for (int i=0;i<colNames.length;i++) {
                                columnItem col = FDefaultTemplate.getColumnByName(colNames[i]);                         
                                if (col.canFilter() && !col.getDataType().equals("datetime") && !col.getDataType().equals("date")) {                                    
                                        //generate combo filter
                                        String [] colData = DMSUtils.SortArray(FTemplateData.getDistinctValues(col.getName()));
                                        String defaultValue = DMSUtils.NVL(getParameter("filterfield"+col.getName()));
                                        
                                        sb.append(genCombo("filterfield" + col.getName(),col.getLabel(),DMSUtils.genComboDataItemArray(colData,colData),defaultValue));
                                }
                        }                                               
                
                        for (int i=0;i<colNames.length;i++) {
                                columnItem col = FDefaultTemplate.getColumnByName(colNames[i]);                         
                                if (col.canFilter()) {
                                        if (col.getDataType().equals("datetime") || col.getDataType().equals("date")) {
                                                sb.append("<br>");
                                                sb.append("<br>");                                                                                                                              
                                                //generate date range                           
                                                sb.append(genDateRange("daterangefield" + col.getName(),col.getLabel()));
                                        } else if (col.getDataType().equals("int") || col.getDataType().equals("number")|| col.getDataType().equals("integer")|| col.getDataType().equals("bigint")) {
                                                sb.append("<br>");
                                                sb.append("<br>");                                                                              
                                                //generate date range                           
                                                sb.append(genNumberRange("numberrangefield" + col.getName(),col.getLabel()));                                           
                                        }
                                } 
                        }
                        
                        sb.append("</td>").append("\n");                        
                        sb.append("</tr>").append("\n");
                        sb.append("</table>").append("\n");                     
                        
                        sb.append("<br>");
                        sb.append("<input type=button value=\"Filter\" onclick=\"javascript:refresh()\">");                     
                }
        
                return sb.toString();
        }

        
        private String genMonthCombo(String name, String defValue) {
                StringBuffer sb = new StringBuffer();
                sb.append ("&nbsp;&nbsp;");
                sb.append("<select class=comboStyle name=\"").append(name).append("\" onkeypress=\"if(window.event.keyCode =='13') refresh();\">").append("\n");

                sb.append("<option value=\"NONE\"").append(defValue!=null&&defValue.equals("NONE")?" selected ":"").append(">").append("\n");
                sb.append("&nbsp;").append("\n");
                sb.append("</option>").append("\n");                    

                String [] data = {"Jan", "Feb", "Mar", "Apr", "May","Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
                
                for (int i=0;i<data.length;i++) {                       
                        if (data[i]!=null) {
                                sb.append("<option value=\"").append(i).append("\"").append(defValue!=null&&defValue.equals(Integer.toString(i))?" selected ":"").append(">").append("\n");
                                sb.append(DMSUtils.cleanHTMLStr(data[i])).append("\n");
                                sb.append("</option>").append("\n");
                        }
                }
                sb.append("</select>").append("\n");                            
                return sb.toString();           
        }
        
        public String genDate(String dateFieldName) {
                StringBuffer sb = new StringBuffer();

                String nameDay=dateFieldName + "Day";
                String nameMonth=dateFieldName + "Month"; 
                String nameYear=dateFieldName + "Year";

                String defaultValueDay = DMSUtils.NVL(getParameter(nameDay));
                String defaultValueMonth = DMSUtils.NVL(getParameter(nameMonth));
                String defaultValueYear = DMSUtils.NVL(getParameter(nameYear));
                
                sb.append("<input type=text size=2 name=\"").append(nameDay).append("\" value=\"").append(DMSUtils.cleanJStr(defaultValueDay)).append("\" onkeypress=\"if(window.event.keyCode =='13') refresh();\">");
                
                sb.append ("&nbsp;&nbsp;");
                
                sb.append(genMonthCombo(nameMonth, defaultValueMonth));
                
                sb.append ("&nbsp;&nbsp;");
                
                sb.append("<input type=text size=4 name=\"").append(nameYear).append("\" value=\"").append(DMSUtils.cleanJStr(defaultValueYear)).append("\" onkeypress=\"if(window.event.keyCode =='13') refresh();\">");                               
                
                return sb.toString();
        }
        
        public String genDateRange( String dateRangeFieldName, String label) {          
                StringBuffer sb = new StringBuffer();

                sb.append ("&nbsp;&nbsp;");
                sb.append("<span class=comboLabelStyle>").append(DMSUtils.cleanHTMLStr(label)).append("(dd-mmm-yyyy)").append("</span>").append("&nbsp;").append("\n");
                sb.append ("&nbsp;&nbsp;");
                
                sb.append(genDate(dateRangeFieldName + "From"));
                
                sb.append("&nbsp;<span class=comboLabelStyle>").append("to").append("</span>").append("&nbsp;").append("\n");
                
                sb.append(genDate(dateRangeFieldName + "To"));
                
                return sb.toString();
        }
        
        public String genNumberRange( String numberRangeFieldName, String label) {              
                StringBuffer sb = new StringBuffer();

                sb.append ("&nbsp;&nbsp;");
                sb.append("<span class=comboLabelStyle>").append(DMSUtils.cleanHTMLStr(label)).append("</span>").append("&nbsp;").append("\n");
                sb.append ("&nbsp;&nbsp;");
                
                String nameFrom = numberRangeFieldName + "From";
                String nameTo = numberRangeFieldName + "To";
                
                String defaultValueFrom = DMSUtils.NVL(getParameter(nameFrom));
                String defaultValueTo = DMSUtils.NVL(getParameter(nameTo));
                
                sb.append ("<input type=text name=\"").append(nameFrom).append("\" value=\"").append(DMSUtils.cleanJStr(defaultValueFrom)).append("\" onkeypress=\"if(window.event.keyCode =='13') refresh();\">").append("\n");
                
                sb.append("&nbsp;<span class=comboLabelStyle>").append("to").append("</span>").append("&nbsp;").append("\n");

                sb.append ("<input type=text name=\"").append(nameTo).append("\" value=\"").append(DMSUtils.cleanJStr(defaultValueTo)).append("\" onkeypress=\"if(window.event.keyCode =='13') refresh();\">").append("\n");            
                        
                return sb.toString();
        }
        
        
        public String genHighlightLegend() {
                StringBuffer sb = new StringBuffer(); 
                if (FDefaultTemplate!=null) {
                        highlightList hList = FDefaultTemplate.getHighlights();
                        highlightItem[] highlights = hList.getHighlightItems();
                        
                        sb.append("<table width=100% border=0 cellspacing=0>").append("\n");
                        for (int i=0;i<highlights.length;i++) {
                                sb.append("<tr class=").append(highlights[i].getStyleClass()).append(">").append("\n");                         
                                sb.append("<td>").append("\n");
                                sb.append("Records that have \"").append(DMSUtils.cleanHTMLStr(highlights[i].getHighlightLogic())).append("\" have this colour").append("\n");
                                sb.append("</td>").append("\n");                                
                                sb.append("</tr>").append("\n");
                        }                       
                        sb.append("</table").append("\n");
                }
                return sb.toString();
        }
        
        public String genData() {
                StringBuffer sb = new StringBuffer();
                int i, recID;
                String sortOrder;
                
                if (FDefaultTemplate!=null) {
                        columnList colList = FDefaultTemplate.getColumns();
                        columnItem[] hiddenCols = colList.getHiddenColumns();
                        columnItem[] visibleCols = colList.getVisibleColumns();
                        highlightList hList = FDefaultTemplate.getHighlights();

                        for (i=0;i<visibleCols.length;i++) {
                                if (visibleCols[i].canSort()) {
                                        sortOrder=DMSUtils.NVL(getParameter("sortfield"+visibleCols[i].getName()));
                                        sb.append("<input type=hidden id=sortfield").append(visibleCols[i].getName()).append(" name=sortfield").append(visibleCols[i].getName()).append(" value=\"").append(sortOrder).append("\">").append("\n");
                                }
                        }
                        
                        sb.append("<table border=1 class=tableStyle>").append("\n");
                        sb.append("<tr class=headerStyle>").append("\n");
                        if (hiddenCols.length>0) {                              
                                sb.append("<td width=10 >").append("\n");
                                sb.append("&nbsp;").append("\n");
                                sb.append("</td>").append("\n");                                                        
                        }
                        for (i=0;i<visibleCols.length;i++) {
                                sb.append("<td nowrap ");
                                if (visibleCols[i].canSort()) {
                                        sb.append("onmouseover=\"this.className='headerMouseOverStyle';\" onmouseout=\"this.className='headerStyle';\" onclick=\"sort(sortfield").append(visibleCols[i].getName()).append(");\" ").append("\n");
                                }
                                sb.append("style=\"width:").append(visibleCols[i].getWidth()).append("\">").append("\n");
                                sb.append(DMSUtils.cleanHTMLStr(visibleCols[i].getLabel())).append("\n");
                                if (visibleCols[i].canSort()) {
                                        sortOrder=DMSUtils.NVL(getParameter("sortfield"+visibleCols[i].getName()));
                                        
                                        if (sortOrder.equals("asc")) {
                                                sb.append("<img id=img").append(visibleCols[i].getName()).append(" src=\"images/SortUpArrow.gif\">").append("\n");              
                                        } else if (sortOrder.equals("desc")) {
                                                sb.append("<img id=img").append(visibleCols[i].getName()).append(" src=\"images/SortDownArrow.gif\">").append("\n");
                                        } else {
                                                sb.append("<img id=img").append(visibleCols[i].getName()).append(" src=\"images/NoSortArrow.gif\">").append("\n");
                                        }
                                }
                                sb.append("</td>").append("\n");                                
                        }
                        sb.append("</tr>").append("\n");
                                                
                        recID=0;
                        while (FTemplateData.next()) {
                                
                                recID++;
                                sb.append("<tr  style=\"width:100%\" class=").append(hList.getHighlightStyle(FTemplateData.getRecord())).append(">").append("\n");

                                if (hiddenCols.length>0) {
                                        sb.append("<td width=10 onclick=\"toggleButton(TAG").append(recID).append(", BTN").append(recID).append(");\">").append("\n");
                                        sb.append("<img name=collapsed id=BTN").append(recID).append(" src=\"images/collapsed.gif\">").append("\n");
                                        sb.append("</td>").append("\n");
                                }
                                                        
                                for (i=0;i<visibleCols.length;i++) {
                                        sb.append("<td class=visibleDataStyle style=\"width:").append(visibleCols[i].getWidth()).append("\" ").append(">").append("\n");
                                        
                                        if (visibleCols[i].isLink())
                                                sb.append("<a href=\"").append(DMSUtils.cleanJStr(DMSUtils.replaceParams(visibleCols[i].getLink(), FTemplateData))).append("\">").append("\n");
                                        
                                        sb.append(DMSUtils.cleanHTMLStr(FTemplateData.getFieldValue(visibleCols[i].getName()), true)).append("\n");
                                        
                                        if (visibleCols[i].isLink())
                                                sb.append("</a>").append("\n");
                                        sb.append("</td>").append("\n");
                                }                       
                                sb.append("</tr>").append("\n");
                                
                                if (colList.hasHiddenColumns()) {
                                
                                        for (i=0;i<hiddenCols.length;i++) {                                             
                                                sb.append("<tr id=TAG").append(recID).append(" style=\"width:100%\" class=hiddenDataStyle>").append("\n");
                                                sb.append("<td colspan=").append(visibleCols.length+1).append(">").append("\n");
                                                sb.append("<span class=hiddenDataLabelStyle>").append(hiddenCols[i].getLabel()).append(":</span>&nbsp;");
                                                sb.append(DMSUtils.cleanHTMLStr(FTemplateData.getFieldValue(hiddenCols[i].getName()), true)).append("\n");
                                                sb.append("</td>").append("\n");                                        
                                                sb.append("</tr>").append("\n");
                                        }
                                }
                                
                        }               
                        sb.append("</table>").append("\n");
                }
                
                return sb.toString();           
        }
        
        public projectItem getProject() {
                return FDefaultProject;
        }
        
        public templateItem getTemplate() {
                return FDefaultTemplate;                
        }

        public dbTemplateData getData() {
                return FTemplateData;           
        }
        
        private boolean writeCSVField(PrintWriter out, String data, boolean firstColumn) {
                if (!firstColumn) {
                        out.write(",");
                } else {
                        firstColumn = false;
                }                                       
                out.write(DMSUtils.cleanCSV(data));
                
                return firstColumn;
        }
        

        public void exportData() {
                PrintWriter out = null ;
                int i;
                boolean firstColumn;

                FResponse.setContentType("text/csv");
                FResponse.addHeader("Content-disposition","attachment;filename=export.csv");
                try {
                        out = FResponse.getWriter();
                        
                        if (FDefaultTemplate!=null) {
                                columnList colList = FDefaultTemplate.getColumns();
                                
                                columnItem[] hiddenCols = colList.getHiddenColumns();
                                columnItem[] visibleCols = colList.getVisibleColumns();

                                // write labels
                                                                
                                firstColumn  = true;
                                for (i=0;i<visibleCols.length;i++) {
                                        firstColumn = writeCSVField(out, visibleCols[i].getLabel(), firstColumn);
                                }
                                
                                for (i=0;i<hiddenCols.length;i++) {
                                        firstColumn = writeCSVField(out, hiddenCols[i].getLabel(), firstColumn);
                                }
                                
                                out.write("\r\n"); // next line
                                                                        
                                while (FTemplateData.next()) {

                                        firstColumn  = true;
                                        for (i=0;i<visibleCols.length;i++) {
                                                firstColumn = writeCSVField(out, FTemplateData.getFieldValue(visibleCols[i].getName()), firstColumn);
                                        }
                                        
                                        for (i=0;i<hiddenCols.length;i++) {
                                                firstColumn = writeCSVField(out, FTemplateData.getFieldValue(hiddenCols[i].getName()), firstColumn);
                                        }
                                        
                                        out.write("\r\n"); // next line                                 
                                }               
                        }
                        
                } catch (Exception e) {
                        e.printStackTrace(out);
                }

                
        }
                
}