KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > netbeans > modules > tasklist > usertasks > translators > HistoryTextExportFormat


1 /*
2  * The contents of this file are subject to the terms of the Common Development
3  * and Distribution License (the License). You may not use this file except in
4  * compliance with the License.
5  *
6  * You can obtain a copy of the License at http://www.netbeans.org/cddl.html
7  * or http://www.netbeans.org/cddl.txt.
8  *
9  * When distributing Covered Code, include this CDDL Header Notice in each file
10  * and include the License file at http://www.netbeans.org/cddl.txt.
11  * If applicable, add the following below the CDDL Header, with the fields
12  * enclosed by brackets [] replaced by your own identifying information:
13  * "Portions Copyrighted [year] [name of copyright owner]"
14  *
15  * The Original Software is NetBeans. The Initial Developer of the Original
16  * Code is Sun Microsystems, Inc. Portions Copyright 1997-2006 Sun
17  * Microsystems, Inc. All Rights Reserved.
18  */

19
20 package org.netbeans.modules.tasklist.usertasks.translators;
21
22 import java.io.File JavaDoc;
23 import java.net.MalformedURLException JavaDoc;
24 import java.net.URL JavaDoc;
25 import java.text.DateFormat JavaDoc;
26 import java.text.MessageFormat JavaDoc;
27 import java.util.Calendar JavaDoc;
28 import java.util.Date JavaDoc;
29 import java.util.List JavaDoc;
30 import java.util.logging.Level JavaDoc;
31 import javax.xml.parsers.DocumentBuilderFactory JavaDoc;
32 import javax.xml.parsers.ParserConfigurationException JavaDoc;
33 import javax.xml.transform.OutputKeys JavaDoc;
34 import javax.xml.transform.Transformer JavaDoc;
35 import javax.xml.transform.TransformerConfigurationException JavaDoc;
36 import javax.xml.transform.TransformerException JavaDoc;
37 import javax.xml.transform.TransformerFactory JavaDoc;
38 import javax.xml.transform.TransformerFactoryConfigurationError JavaDoc;
39 import javax.xml.transform.dom.DOMSource JavaDoc;
40 import javax.xml.transform.stream.StreamResult JavaDoc;
41 import org.netbeans.modules.tasklist.core.export.ExportImportFormat;
42 import org.netbeans.modules.tasklist.core.export.ExportImportProvider;
43 import org.netbeans.modules.tasklist.core.export.SaveFilePanel;
44 import org.netbeans.modules.tasklist.core.util.ExtensionFileFilter;
45 import org.netbeans.modules.tasklist.core.util.SimpleWizardPanel;
46 import org.netbeans.modules.tasklist.usertasks.options.Settings;
47 import org.netbeans.modules.tasklist.usertasks.UserTaskView;
48 import org.netbeans.modules.tasklist.usertasks.UserTaskViewRegistry;
49 import org.netbeans.modules.tasklist.usertasks.model.Duration;
50 import org.netbeans.modules.tasklist.usertasks.model.UserTask;
51 import org.netbeans.modules.tasklist.usertasks.model.UserTaskList;
52 import org.netbeans.modules.tasklist.usertasks.model.UserTaskObjectList;
53 import org.netbeans.modules.tasklist.usertasks.util.DurationFormat;
54 import org.netbeans.modules.tasklist.usertasks.util.TreeAbstraction;
55 import org.netbeans.modules.tasklist.usertasks.util.UTUtils;
56 import org.netbeans.modules.tasklist.usertasks.util.UnaryFunction;
57 import org.openide.DialogDisplayer;
58 import org.openide.NotifyDescriptor;
59 import org.openide.WizardDescriptor;
60 import org.openide.awt.HtmlBrowser;
61 import org.openide.util.NbBundle;
62 import org.w3c.dom.Document JavaDoc;
63 import org.w3c.dom.Element JavaDoc;
64
65 /**
66  * Export spent times for a time period.
67  *
68  * @author tl
69  */

70 public class HistoryTextExportFormat implements ExportImportFormat {
71     private static DurationFormat DURATION_FORMAT =
72             new DurationFormat(DurationFormat.Type.SHORT);
73
74     /**
75      * Localizes a string.
76      *
77      * @param key a key
78      * @return localized string
79      */

80     private static String JavaDoc loc(String JavaDoc key) {
81         return NbBundle.getMessage(HistoryTextExportFormat.class, key);
82     }
83     
84     public String JavaDoc getName() {
85         return loc("SpentTimes"); // NOI18N
86
}
87
88     public WizardDescriptor getWizard() {
89         HistoryOptionsPanel hop = new HistoryOptionsPanel();
90         SimpleWizardPanel hopwp = new SimpleWizardPanel(hop);
91         hop.setName(loc("ExportOptions")); // NOI18N
92
hopwp.setContentHighlightedIndex(0);
93         
94         SaveFilePanel chooseFilePanel = new SaveFilePanel();
95         SimpleWizardPanel chooseFileWP = new SimpleWizardPanel(chooseFilePanel);
96         chooseFilePanel.setWizardPanel(chooseFileWP);
97         chooseFilePanel.getFileChooser().addChoosableFileFilter(
98             new ExtensionFileFilter(loc("HtmlFilter"), // NOI18N
99
new String JavaDoc[] {".html"})); // NOI18N
100
chooseFilePanel.setFile(new File JavaDoc(
101                 Settings.getDefault().getLastUsedExportFolder(),
102                 "tasklist.html")); // NOI18N
103
chooseFilePanel.setOpenFileCheckBoxVisible(true);
104         chooseFileWP.setContentHighlightedIndex(1);
105
106         // create wizard descriptor
107
WizardDescriptor.Iterator iterator =
108             new WizardDescriptor.ArrayIterator(
109                 new WizardDescriptor.Panel[] {hopwp, chooseFileWP});
110         WizardDescriptor wd = new WizardDescriptor(iterator);
111         wd.putProperty("WizardPanel_contentData", // NOI18N
112
new String JavaDoc[] {
113                 hop.getName(),
114                 chooseFilePanel.getName()
115             }
116         );
117         wd.putProperty("WizardPanel_autoWizardStyle", Boolean.TRUE); // NOI18N
118
wd.putProperty("WizardPanel_contentDisplayed", Boolean.TRUE); // NOI18N
119
wd.putProperty("WizardPanel_contentNumbered", Boolean.TRUE); // NOI18N
120
wd.setTitle(loc("ExportText")); // NOI18N
121
wd.putProperty("chooseFilePanel", chooseFilePanel); // NOI18N
122
wd.putProperty("historyOptionsPanel", hop); // NOI18N
123
wd.setTitleFormat(new java.text.MessageFormat JavaDoc("{0}")); // NOI18N
124

125         return wd;
126     }
127
128     public void doExportImport(ExportImportProvider provider,
129             WizardDescriptor wd) {
130         HistoryOptionsPanel hop = (HistoryOptionsPanel)
131                 wd.getProperty("historyOptionsPanel"); // NOI18N
132
SaveFilePanel panel = (SaveFilePanel)
133                 wd.getProperty("chooseFilePanel"); // NOI18N
134

135         Date JavaDoc from = hop.getFrom();
136         Date JavaDoc to = hop.getTo();
137         if (from.compareTo(to) > 0) {
138             Date JavaDoc tmp = from;
139             from = to;
140             to = tmp;
141         }
142         
143         Calendar JavaDoc c = Calendar.getInstance();
144         c.setTime(to);
145         c.add(Calendar.DAY_OF_YEAR, 1);
146         HistoryOptionsPanel.Group g = hop.getGroup();
147         final int minDur = hop.getMinimumDuration();
148         
149         SpentTimesUserTaskProcessor p =
150                 new SpentTimesUserTaskProcessor(from,
151                 c.getTime(), g, minDur);
152         
153         UserTaskInfo info = createInfos();
154         TreeAbstraction<UserTaskInfo> tree = info.createTreeInterface();
155         UTUtils.processDepthFirst(tree, p);
156         UTUtils.processDepthFirst(tree, new UnaryFunction() {
157             public Object JavaDoc compute(Object JavaDoc obj) {
158                 UserTaskInfo info = (UserTaskInfo) obj;
159                 
160                 int i = 0;
161                 while (i < info.children.size()) {
162                     UserTaskInfo ch = info.children.get(i);
163                     if (UTUtils.sum(ch.spentTimes) < minDur * 60 * 1000)
164                         info.children.remove(i);
165                     else
166                         i++;
167                 }
168                 
169                 return null;
170             }
171         });
172         
173         // Here are some i18n problems, but it is probably not necessary
174
// to localize these strings.
175
String JavaDoc fs;
176         switch (g) {
177             case DAILY:
178                 fs = "{0,date,short}"; // NOI18N
179
break;
180             case WEEKLY:
181                 fs = "{0,date,short} - {1,date,short} ({0,date,w})"; // NOI18N
182
break;
183             case MONTHLY:
184                 fs = "{0,date,MMM yyyy}"; // NOI18N
185
break;
186             case QUARTERLY:
187                 fs = "{0,date,MMM} - {1,date,MMM yyyy}"; // NOI18N
188
break;
189             case YEARLY:
190                 fs = "{0,date,yyyy}"; // NOI18N
191
break;
192             default:
193                 fs = "{0} - {1}"; // NOI18N
194
}
195         MessageFormat JavaDoc mf = new MessageFormat JavaDoc(fs);
196         
197         Transformer JavaDoc tr;
198         try {
199             tr = TransformerFactory.newInstance().newTransformer();
200         } catch (TransformerConfigurationException JavaDoc ex) {
201             UTUtils.LOGGER.log(Level.SEVERE, "", ex); // NOI18N
202
return;
203         } catch (TransformerFactoryConfigurationError JavaDoc ex) {
204             UTUtils.LOGGER.log(Level.SEVERE, "", ex); // NOI18N
205
return;
206         }
207         
208         tr.setOutputProperty(OutputKeys.DOCTYPE_PUBLIC,
209                 "-//W3C//DTD XHTML 1.0 Strict//EN"); // NOI18N
210
tr.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM,
211                 "http://www.w3.org/TR/xhtml1" + // NOI18N
212
"/DTD/xhtml1-strict.dtd"); // NOI18N
213
tr.setOutputProperty(OutputKeys.METHOD, "xml"); // NOI18N
214
tr.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no"); // NOI18N
215

216         Document JavaDoc html;
217         try {
218             html = export(info, p.getPeriods(), mf);
219         } catch (ParserConfigurationException JavaDoc ex) {
220             UTUtils.LOGGER.log(Level.SEVERE, "", ex); // NOI18N
221
return;
222         }
223         
224         DOMSource JavaDoc source = new DOMSource JavaDoc(html);
225         StreamResult JavaDoc result = new StreamResult JavaDoc(panel.getFile());
226         try {
227             tr.transform(source, result);
228             Settings.getDefault().setLastUsedExportFolder(
229                     panel.getFile().getParentFile());
230         } catch (TransformerException JavaDoc ex) {
231             String JavaDoc msg = NbBundle.getMessage(HistoryTextExportFormat.class,
232                     "CannotWriteFile", // NOI18N
233
panel.getFile().getAbsolutePath(), ex.getMessage());
234             NotifyDescriptor nd = new NotifyDescriptor.Message(
235                     msg, NotifyDescriptor.ERROR_MESSAGE);
236             DialogDisplayer.getDefault().notify(nd);
237         }
238         if (panel.getOpenExportedFile())
239             openFileInBrowser(panel.getFile());
240     }
241
242     /**
243      * Creates an UTInfo for the current task list.
244      *
245      * @return UTInfo
246      */

247     private UserTaskInfo createInfos() {
248         return createInfo(UserTaskViewRegistry.getInstance().getCurrent().
249                 getUserTaskList());
250     }
251     
252     /**
253      * Creates UTInfo for a user task list.
254      *
255      * @param utl a user task list
256      * @return UTInfo
257      */

258     private UserTaskInfo createInfo(UserTaskList utl) {
259         UserTaskInfo res = new UserTaskInfo();
260         res.object = utl;
261         addChildren(res, utl.getSubtasks());
262         return res;
263     }
264     
265     /**
266      * Adds UTInfos for all subtasks of info.
267      *
268      * @param info UTInfo for a task
269      * @param list list of user tasks
270      */

271     private void addChildren(UserTaskInfo info, UserTaskObjectList list) {
272         for (int i = 0; i < list.size(); i++) {
273             UserTaskInfo c = new UserTaskInfo();
274             c.object = list.get(i);
275             info.children.add(c);
276             addChildren(c, list.get(i).getSubtasks());
277         }
278     }
279     
280     /**
281      * Opens the specified file in the IDE.
282      *
283      * @param file file to be opened
284      */

285     private static void openFileInBrowser(File JavaDoc file) {
286         URL JavaDoc url;
287         try {
288             url = file.toURI().toURL();
289         } catch (MalformedURLException JavaDoc e) {
290             // Can't show URL
291
UTUtils.LOGGER.log(Level.SEVERE, "", e); // NOI18N
292
return;
293         }
294
295         HtmlBrowser.URLDisplayer.getDefault().showURL(url);
296     }
297     
298     /**
299      * Exports the tasks.
300      *
301      * @param info an information node
302      * @param periods time periods
303      * @param format format for periods {0} and {1} as java.util.Date
304      * @return HTML
305      */

306     private Document JavaDoc export(UserTaskInfo info, List JavaDoc<Date JavaDoc> periods,
307             MessageFormat JavaDoc format) throws ParserConfigurationException JavaDoc {
308         Document JavaDoc doc = DocumentBuilderFactory.newInstance().
309                 newDocumentBuilder().newDocument();
310         
311         Element JavaDoc html = doc.createElement("html"); // NOI18N
312
doc.appendChild(html);
313         Element JavaDoc head = UTUtils.appendElement(html, "head"); // NOI18N
314
Element JavaDoc meta = UTUtils.appendElement(head, "meta");
315         meta.setAttribute("http-equiv", "Content-Type"); // NOI18N
316
meta.setAttribute("content", "text/html; charset=UTF-8"); // NOI18N
317
UTUtils.appendElement(head, "title", loc("SpentTimes")); // NOI18N
318
createStyle(head);
319         Element JavaDoc body = UTUtils.appendElement(html, "body");
320         body.setAttribute("style", "font-family: sans-serif"); // NOI18N
321
UTUtils.appendElement(body,"h1", loc("SpentTimes")); // NOI18N
322

323         DateFormat JavaDoc datef = DateFormat.getDateInstance(DateFormat.SHORT);
324
325         Element JavaDoc table = UTUtils.appendElement(body, "table"); // NOI18N
326
table.setAttribute("border", "0"); // NOI18N
327
table.setAttribute("cellspacing", "1");
328         table.setAttribute("cellpadding", "0"); // NOI18N
329
Element JavaDoc tbody = UTUtils.appendElement(table, "tbody"); // NOI18N
330

331         Element JavaDoc header = UTUtils.appendElement(tbody, "tr"); // NOI18N
332
header.setAttribute("class", "header"); // NOI18N
333
Element JavaDoc td = UTUtils.appendElement(header, "td", // NOI18N
334
loc("Summary")); // NOI18N
335
td.setAttribute("class", "summary"); // NOI18N
336
Calendar JavaDoc c = Calendar.getInstance();
337         for (int i = 0; i < periods.size() - 1; i++) {
338             c.setTime(periods.get(i + 1));
339             c.add(Calendar.SECOND, -1);
340             Element JavaDoc td2 = UTUtils.appendElement(header, "td", // NOI18N
341
format.format(new Object JavaDoc[] { // NOI18N
342
periods.get(i), c.getTime()}, new StringBuffer JavaDoc(),
343                     null).toString());
344             td2.setAttribute("class", "data"); // NOI18N
345
}
346
347         int[] row = new int[1];
348         for (int i = 0; i < info.children.size(); i++) {
349             createTableRow(info.children.get(i), tbody, row, 0);
350         }
351
352         UTUtils.appendElement(body, "hr"); // NOI18N
353
createFooter(body);
354         return doc;
355     }
356
357     /**
358      * Creates a table row for a UserTaskInfo.
359      *
360      * @return created tag
361      * @param tbody tbody tag
362      * @param rowNumber row number [1]
363      * @param level nesting level
364      */

365     private void createTableRow(UserTaskInfo info, Element JavaDoc tbody, int[] rowNumber,
366             int level) {
367         Element JavaDoc row = UTUtils.appendElement(tbody, "tr"); // NOI18N
368
if (rowNumber[0] % 2 == 0)
369             row.setAttribute("class", "even"); // NOI18N
370
Element JavaDoc td = UTUtils.appendElement(row, "td"); // NOI18N
371
td.setAttribute("class", "summary"); // NOI18N
372
if (info.object instanceof UserTask) {
373             fillDataCell(td, ((UserTask) info.object).getSummary(), level);
374         } else if (info.object instanceof UserTaskList) {
375             /* TODO fillDataCell(td, FileUtil.getFileDisplayName(
376                     ((UserTaskList) info.object).getFile()),
377                     level);*/

378         } else {
379             fillDataCell(td, loc("AllTaskLists"), level); // NOI18N
380
}
381         for (int j = 0; j < info.spentTimes.length; j++) {
382             Duration d = new Duration((int) (info.spentTimes[j] / (1000 * 60)),
383                     24, 5);
384             Element JavaDoc td2 = UTUtils.appendElement(row, "td", // NOI18N
385
DURATION_FORMAT.format(d));
386             td2.setAttribute("class", "data"); // NOI18N
387
}
388         rowNumber[0]++;
389         
390         for (int i = 0; i < info.children.size(); i++) {
391             createTableRow(info.children.get(i), tbody, rowNumber, level + 1);
392         }
393     }
394     
395     /**
396      * Creates the footer.
397      *
398      * @param parent parent node
399      * @return footer
400      */

401     private static Element JavaDoc createFooter(Element JavaDoc parent) {
402         // small i18n problems here
403
Element JavaDoc p = UTUtils.appendElement(parent, "p"); // NOI18N
404
Element JavaDoc a = UTUtils.appendElement(p, "a", loc("ValidXHTML"));
405         a.setAttribute("href", // NOI18N
406
"http://validator.w3.org/check/referer"); // NOI18N
407
UTUtils.appendText(p, loc("CreatedBy") + " "); // NOI18N
408
UTUtils.appendElement(p, "a", "NetBeans"). // NOI18N
409
setAttribute("href", "http://www.netbeans.org"); // NOI18N
410

411         // &nbsp;
412
UTUtils.appendText(p, "\u00a0"); // NOI18N
413

414         UTUtils.appendElement(p, "a", "User Tasks Module"). // NOI18N
415
setAttribute("href", // NOI18N
416
"http://tasklist.netbeans.org"); // NOI18N
417
return p;
418     }
419     
420     /**
421      * Creates <style> tag.
422      *
423      * @param parent parent tag
424      * @return created tag
425      */

426     private static Element JavaDoc createStyle(Element JavaDoc parent) {
427         Element JavaDoc style = UTUtils.appendElement(parent, "style"); // NOI18N
428
style.setAttribute("type", "text/css"); // NOI18N
429
UTUtils.appendText(style,
430                 "tr.header { background-color: #222288; " + // NOI18N
431
"color: white; font-weight: bold }\n"); // NOI18N
432
UTUtils.appendText(style,
433                 "tr.even { background-color: #eeeeee }\n"); // NOI18N
434
UTUtils.appendText(style,
435                 "td.summary { text-align: left; width: 400px; }\n"); // NOI18N
436
UTUtils.appendText(style,
437                 "td.data { text-align: center }"); // NOI18N
438
return style;
439     }
440     
441     /**
442      * Fills text about a UserTaskInfo.
443      *
444      * @param td table cell
445      * @param v task description
446      * @param level nesting level
447      */

448     private static void fillDataCell(Element JavaDoc td, String JavaDoc v, int level) {
449         Element JavaDoc table = UTUtils.appendElement(td, "table");
450         table.setAttribute("style", "width: 100%"); // NOI18N
451
Element JavaDoc tbody = UTUtils.appendElement(table, "tbody");
452         Element JavaDoc tr = UTUtils.appendElement(tbody, "tr"); // NOI18N
453
Element JavaDoc td_ = UTUtils.appendElement(tr, "td");
454         td_.setAttribute("style", "width: " + (level * 30 + 1) + "px"); // NOI18N
455
Element JavaDoc td2 = UTUtils.appendElement(tr, "td"); // NOI18N
456
UTUtils.appendText(td2, "\u2022"); // NOI18N
457
Element JavaDoc span = UTUtils.appendElement(td2, "span", v); // NOI18N
458
span.setAttribute("title", v); // NOI18N
459
}
460 }
461
Popular Tags