1 19 20 package org.netbeans.modules.tasklist.core.translators; 21 22 import java.awt.Image ; 23 import java.io.*; 24 import java.lang.reflect.InvocationTargetException ; 25 import java.net.MalformedURLException ; 26 import java.net.URL ; 27 import java.text.DateFormat ; 28 import java.util.Date ; 29 import java.util.List ; 30 import java.util.ListIterator ; 31 import javax.swing.table.TableColumn ; 32 import javax.swing.table.TableColumnModel ; 33 import org.netbeans.modules.tasklist.core.filter.Filter; 34 import org.netbeans.modules.tasklist.core.ColumnProperty; 35 import org.netbeans.modules.tasklist.core.TLUtils; 36 import org.netbeans.modules.tasklist.core.TaskListView; 37 import org.netbeans.modules.tasklist.core.TaskList; 38 import org.netbeans.modules.tasklist.core.Task; 39 import org.netbeans.modules.tasklist.core.TaskNode; 40 import org.netbeans.modules.tasklist.core.export.ExportImportFormat; 41 import org.netbeans.modules.tasklist.core.util.IconManager; 42 import org.openide.NotifyDescriptor; 43 import org.openide.ErrorManager; 44 import org.openide.NotifyDescriptor.Confirmation; 45 import org.openide.filesystems.FileObject; 46 import org.openide.filesystems.FileStateInvalidException; 47 import org.openide.nodes.Node; 48 import org.openide.util.NbBundle; 49 import org.openide.awt.HtmlBrowser.URLDisplayer; 50 import org.openide.awt.HtmlBrowser; 51 import org.openide.DialogDisplayer; 52 import org.openide.WizardDescriptor; 53 54 55 63 public abstract class HTMLSupport implements ExportImportFormat { 64 private ColumnProperty[] columns; 66 private String [] headers; 67 private Filter filter; 68 private TaskListView view; 69 private Writer writer; 70 private boolean sortAscending = true; 71 private boolean sortedByName = false; 72 private boolean noSorting = true; 73 private Node.Property sortedByProperty = null; 74 private IconManager iconMap = null; 75 76 public String getName() { 77 return NbBundle.getMessage(HTMLSupport.class, "HTML"); } 79 80 public WizardDescriptor getWizard() { 81 return null; 83 } 84 85 public boolean doExportImport(File dir, 86 boolean interactive, OutputStream out) throws IOException { 87 Writer writer = new OutputStreamWriter(out, "utf8"); this.view = TaskListView.getCurrent(); 89 if (view == null) { 90 return false; 91 } 92 this.filter = view.getFilter(); 93 this.writer = writer; 94 95 if (interactive && (dir != null)) { 96 IconManager icm = new IconManager(dir); 97 NotifyDescriptor nd = new NotifyDescriptor.Confirmation ( 99 NbBundle.getMessage(HTMLSupport.class, 100 "ExportIcons"), NotifyDescriptor.YES_NO_OPTION 102 ); 103 Object result = DialogDisplayer.getDefault().notify(nd); 104 if (NotifyDescriptor.YES_OPTION == result) { 105 iconMap = icm; 106 } 107 } 108 109 exportHTML(); 110 writer.flush(); 111 112 iconMap = null; 113 return true; 114 } 115 116 119 protected void writeCSS(Writer writer) throws IOException { 120 writer.write( 121 " body { background-color:white; color:black }\n" + " td { text-align:left; vertical-align:text-top; background-color:#eeeeee }\n" + " th { text-align:center; background-color:#222288; color:white }\n" + " td.sum { text-align:left }\n" + " td.sumdone { text-align:left; background-color:#cccccc }\n" + " td.done { background-color:#cccccc }\n" + " td.subhead { text-align:center; background-color:#ccccff }\n" + " td.datehead { text-align:center; background-color:#ccccff }\n" + " td.space { background-color:white }\n" + " td.date { text-align:left }\n" + " td.dateholiday { text-align:left; color:red }\n"); } 133 134 private void exportHTML() throws IOException { 135 TableColumnModel headerModel = view.getColumnModel(); 136 137 writer.write( 139 "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\"" + " \"http://www.w3.org/TR/REC-html40/loose.dtd\">\n" + "<HTML><HEAD>\n <META http-equiv=\"Content-Type\"" + " content=\"text/html; charset=UTF-8\">\n" + " <TITLE>" + NbBundle.getMessage(HTMLSupport.class, "TaskListHeader") + "</TITLE>\n" + " <style type=\"text/css\">\n"); writeCSS(writer); 146 writer.write( 147 " </style>\n</HEAD><BODY>\n<H1>" + NbBundle.getMessage(HTMLSupport.class, "TaskListHeader") + "</H1>\n" + "<TABLE WIDTH=\"100%\" BORDER=0 CELLPADDING=3 CELLSPACING=3>\n"); 152 int headercols = headerModel.getColumnCount(); 154 writer.write("<TR>\n"); 156 int width = 0; 159 for (int j = 0; j < headercols; j++) { 160 TableColumn column = headerModel.getColumn(j); 161 width += column.getWidth(); 162 } 163 164 headers = new String [headercols]; 165 166 for (int j = 0; j < headercols; j++) { 167 TableColumn column = headerModel.getColumn(j); 168 int relativeWidth = column.getWidth()*100/width; 169 if (j == 0) { 170 writer.write(" <TH WIDTH=\"" + relativeWidth + "%\">"); } else { 173 writer.write(" <TH WIDTH=\"" + relativeWidth + "%\">"); } 176 headers[j] = column.getHeaderValue().toString(); 177 writer.write(TLUtils.toHTML(headers[j])); 178 writer.write("</TH>\n"); } 180 writer.write("</TR>\n"); 182 184 193 sortedByProperty = null; 195 sortAscending = true; 196 sortedByName = false; 197 noSorting = true; 198 199 columns = view.getColumns(); 200 201 for (int i = 0; i < columns.length; i++) { 203 Boolean sorting = 204 (Boolean )columns[i].getValue( "SortingColumnTTV"); if ((sorting != null) && (sorting.booleanValue())) { 206 if (i == 0) { 207 sortedByName = true; 208 } else { 209 sortedByProperty = columns[i]; 210 } 211 Boolean desc = (Boolean )columns[i]. 212 getValue( "DescendingOrderTTV"); sortAscending = ((desc == null) || !(desc.booleanValue())); 214 } 215 } 216 217 Node n = view.getExplorerManager().getRootContext(); 219 exportOneNode(n, -1); 220 221 writer.write( 222 "</TR>\n</TABLE>\n<P>" + NbBundle.getMessage(HTMLSupport.class, "PageCreatedBy", "<A HREF=\"http://www.netbeans.org\">NetBeans</A> " + "<A HREF=\"http://tasklist.netbeans.org\">tasklist</A></P>") + DateFormat.getDateTimeInstance(DateFormat.LONG,DateFormat.LONG). 227 format(new Date ()) + 228 "<P>\n</BODY></HTML>\n" ); 230 231 } 232 233 239 private void exportOneNode(Node n, int level) 240 throws IOException { 241 Task t = TaskNode.getTask(n); 242 if (t != null && filter != null && level != -1 && !filter.accept(t)) 243 return; 244 245 writer.write("<TR>\n"); 247 if (level >= 0) { 248 writeOneTask(n, level); 249 } 250 251 List l = view.getSortedChildren(n, sortedByProperty, sortAscending, 252 sortedByName, noSorting); 253 254 ListIterator it = l.listIterator(); 255 while (it.hasNext()) { 256 Node node = (Node)it.next(); 257 exportOneNode(node, level + 1); 258 } 259 } 260 261 267 private void writeOneTask(Node n, int level) 268 throws IOException { 269 Boolean invisible = null; 270 for (int i = 0; i < headers.length; ++i) { 271 int colidx; 272 273 for (colidx = 0; colidx < columns.length; ++colidx) { 274 if (headers[i].equalsIgnoreCase(columns[colidx].getDisplayName())) { 275 invisible = (Boolean )columns[colidx].getValue("InvisibleInTreeTableView"); break; 277 } 278 } 279 280 if (colidx >= columns.length || (invisible != null && invisible.booleanValue())) { 281 colidx = 0; 291 } 292 293 Node.PropertySet[] propsets = n.getPropertySets(); 295 for (int j = 0; j < propsets.length; ++j) { 296 Node.Property[] props = propsets[j].getProperties(); 297 int k; 298 299 for (k = 0; k < props.length; ++k) { 300 String name = props[k].getName(); 301 302 if (columns[colidx].getName().equals(name)) { 304 break; 305 } 306 } 307 308 if (k == props.length) { 309 break; 311 } 312 313 writeOneField(writer, j == 0, n, props[k], level); 314 } 315 } 316 writer.write("</TR>\n"); } 318 319 326 protected void writeOneField(Writer writer, boolean first, 327 Node node, Node.Property prop, int level) 328 throws IOException { 329 boolean subtable = level > 0; 335 336 if (prop.getName().equals(TaskListView.PROP_TASK_SUMMARY)) { writer.write("<TD>\n"); if (subtable) { 339 writer.write("<TABLE BORDER=\"0\" CELLPADDING=\"0\" CELLSPACING=\"0\" WIDTH=\"100%\">\n"); writer.write("<TR>\n"); writer.write("<TD WIDTH=\"" + 20 * level + "\"></TD>\n"); writer.write("<TD CLASS=\"sum\">\n"); } 344 345 exportIcon(writer, first, node); 346 try { 347 writer.write(TLUtils.toHTML(prop.getValue().toString())); 348 } catch (java.lang.IllegalAccessException e) { 349 writer.write("ERROR"); ErrorManager.getDefault().notify(e); 351 } catch (InvocationTargetException e) { 352 writer.write("ERROR"); ErrorManager.getDefault().notify(e); 354 } 355 if (subtable) { 356 writer.write("</TD>\n"); writer.write("</TR>\n"); writer.write("</TABLE>\n"); } 360 writer.write("</TD>\n"); } else { 362 writer.write("<TD>\n"); try { 364 Object value = prop.getValue(); 365 String s = value == null ? "" : value.toString(); if (s == null) s = ""; writer.write(TLUtils.toHTML(s)); 368 } catch (java.lang.IllegalAccessException e) { 369 writer.write("ERROR"); ErrorManager.getDefault().notify(e); 371 } catch (InvocationTargetException e) { 372 writer.write("ERROR"); ErrorManager.getDefault().notify(e); 374 } 375 writer.write("</TD>\n"); } 377 } 378 379 381 protected boolean exportIcon(Writer writer, boolean first, 382 Node node) throws IOException { 383 if (first && (iconMap != null)) { 384 Image icon = node.getIcon(java.beans.BeanInfo.ICON_COLOR_16x16); 385 String name = iconMap.getIcon(icon); 386 if (name != null) { 387 writer.write("<IMG SRC=\"" + name + "\"> \n"); return true; 389 } 390 } 391 return false; 392 } 393 } 394 | Popular Tags |