1
22 package org.crosswire.bibledesktop.display.basic;
23
24 import java.net.URI;
25 import java.util.Locale;
26
27 import javax.swing.JToolTip;
28 import javax.swing.ToolTipManager;
29 import javax.xml.transform.TransformerException;
30
31 import org.crosswire.bibledesktop.book.install.BookFont;
32 import org.crosswire.bibledesktop.desktop.Desktop;
33 import org.crosswire.bibledesktop.desktop.XSLTProperty;
34 import org.crosswire.bibledesktop.display.URIEvent;
35 import org.crosswire.bibledesktop.display.URIEventListener;
36 import org.crosswire.common.swing.GuiConvert;
37 import org.crosswire.common.swing.GuiUtil;
38 import org.crosswire.common.util.Reporter;
39 import org.crosswire.common.xml.Converter;
40 import org.crosswire.common.xml.SAXEventProvider;
41 import org.crosswire.common.xml.TransformingSAXEventProvider;
42 import org.crosswire.common.xml.XMLUtil;
43 import org.crosswire.jsword.book.Book;
44 import org.crosswire.jsword.book.BookCategory;
45 import org.crosswire.jsword.book.BookData;
46 import org.crosswire.jsword.book.BookException;
47 import org.crosswire.jsword.book.BookMetaData;
48 import org.crosswire.jsword.book.Books;
49 import org.crosswire.jsword.book.Defaults;
50 import org.crosswire.jsword.passage.NoSuchKeyException;
51 import org.xml.sax.SAXException;
52
53
61 public class URITipHelper implements URIEventListener {
62
74 public URITipHelper() {
75 tip = new FullHTMLTip();
76 }
77
78 public JToolTip fetchToolTip() {
79 return tip;
80 }
81
82
89 public String retrieve(Converter converter) {
90 if (event == null) {
91 return null;
92 }
93 if (txt != null) {
94 return txt; }
96 String protocol = event.getScheme();
97 Book book = null;
98 if (protocol.equals(Desktop.GREEK_DEF_PROTOCOL)) {
99 book = Defaults.getGreekDefinitions();
100 } else if (protocol.equals(Desktop.HEBREW_DEF_PROTOCOL)) {
101 book = Defaults.getHebrewDefinitions();
102 } else if (protocol.equals(Desktop.GREEK_MORPH_PROTOCOL)) {
103 book = Defaults.getGreekParse();
104 } else if (protocol.equals(Desktop.HEBREW_MORPH_PROTOCOL)) {
105 book = Defaults.getHebrewParse();
106 }
107
108 if (book == null || Books.installed().getBook(book.getName()) == null) {
109 return "Book Unavailable!";
110 }
111
112 BookData bdata = null;
113
114 try {
115 bdata = new BookData(book, book.getKey(event.getURI()));
116 } catch (NoSuchKeyException ex) {
117 return ex.getDetailedMessage();
118 }
119
120 assert book == bdata.getFirstBook();
121
122 BookMetaData bmd = book.getBookMetaData();
123 if (bmd == null) {
124 return "Book Meta Data Unavailable!";
125 }
126
127 boolean direction = bmd.isLeftToRight();
130 GuiUtil.applyOrientation(tip.getTextView(), direction);
131
132 tip.getTextView().setLocale(new Locale(bmd.getLanguage().getCode()));
136 String fontSpec = GuiConvert.font2String(BookFont.instance().getFont(book));
137 try {
138 SAXEventProvider osissep = bdata.getSAXEventProvider();
139 TransformingSAXEventProvider htmlsep = (TransformingSAXEventProvider) converter.convert(osissep);
140 XSLTProperty.DIRECTION.setState(direction ? "ltr" : "rtl");
141
142 URI loc = bmd.getLocation();
143 XSLTProperty.BASE_URL.setState(loc == null ? "" : loc.getPath());
144
145 if (bmd.getBookCategory() == BookCategory.BIBLE) {
146 XSLTProperty.setProperties(htmlsep);
147 } else {
148 XSLTProperty.CSS.setProperty(htmlsep);
149 XSLTProperty.BASE_URL.setProperty(htmlsep);
150 XSLTProperty.DIRECTION.setProperty(htmlsep);
151 }
152 htmlsep.setParameter(XSLTProperty.FONT.getName(), fontSpec);
154
155 txt = XMLUtil.writeToString(htmlsep);
156 } catch (SAXException e) {
157 Reporter.informUser(this, e);
158 e.printStackTrace();
159 txt = e.getMessage();
160 } catch (TransformerException e) {
161 Reporter.informUser(this, e);
162 e.printStackTrace();
163 txt = e.getMessage();
164 } catch (BookException e) {
165 Reporter.informUser(this, e);
166 e.printStackTrace();
167 txt = e.getMessage();
168 }
169 return txt;
170 }
171
172 public String getTipTitle() {
173 if (event == null) {
174 return "Untitled Tip";
175 }
176 return event.getURI();
177 }
178
179
184 public void activateURI(URIEvent ev) {
185 }
187
188
194 public void enterURI(URIEvent ev) {
195 if (!interested(ev)) {
196 return;
197 }
198 formerDismissDelay = ToolTipManager.sharedInstance().getDismissDelay();
200 ToolTipManager.sharedInstance().setDismissDelay(myDismissDelay);
202
203 event = ev; }
205
206
212 public void leaveURI(URIEvent ev) {
213
214 if (!interested(ev)) {
215 return;
216 }
217
218 ToolTipManager.sharedInstance().setDismissDelay(formerDismissDelay);
219
220 event = null; txt = null; }
223
224
228 boolean interested(URIEvent ev) {
229 String protocol = ev.getScheme();
231 if (protocol.equals(Desktop.GREEK_DEF_PROTOCOL)) {
232 return true;
233 }
234 if (protocol.equals(Desktop.HEBREW_DEF_PROTOCOL)) {
235 return true;
236 }
237 if (protocol.equals(Desktop.GREEK_MORPH_PROTOCOL)) {
238 return true;
239 }
240 if (protocol.equals(Desktop.HEBREW_MORPH_PROTOCOL)) {
241 return true;
242 }
243 return false;
244 }
245
246 private int formerDismissDelay;
247
248 private int myDismissDelay = 60000;
249
250
253 private FullHTMLTip tip;
254
255
258 private URIEvent event;
259 private String txt;
260 }
261