1
22 package org.crosswire.bibledesktop.desktop;
23
24 import java.awt.Component;
25 import java.awt.event.ActionEvent;
26 import java.io.IOException;
27 import java.net.URI;
28
29 import javax.swing.JCheckBoxMenuItem;
30 import javax.swing.ToolTipManager;
31
32 import org.crosswire.bibledesktop.BDMsg;
33 import org.crosswire.bibledesktop.book.BibleViewPane;
34 import org.crosswire.bibledesktop.book.install.InternetWarning;
35 import org.crosswire.bibledesktop.book.install.SitesPane;
36 import org.crosswire.bibledesktop.display.BookDataDisplay;
37 import org.crosswire.bibledesktop.display.basic.SplitBookDataDisplay;
38 import org.crosswire.bibledesktop.display.basic.TabbedBookDataDisplay;
39 import org.crosswire.common.config.swing.ConfigEditorFactory;
40 import org.crosswire.common.swing.ActionFactory;
41 import org.crosswire.common.swing.CWOptionPane;
42 import org.crosswire.common.swing.desktop.LayoutPersistence;
43 import org.crosswire.common.swing.desktop.ViewVisitor;
44 import org.crosswire.common.util.CWProject;
45 import org.crosswire.common.util.ClassUtil;
46 import org.crosswire.common.util.FileUtil;
47 import org.crosswire.common.util.Logger;
48 import org.crosswire.common.util.OSType;
49 import org.crosswire.common.util.ReflectionUtil;
50 import org.crosswire.common.util.Reporter;
51 import org.crosswire.jsword.passage.Key;
52 import org.crosswire.jsword.passage.NoSuchVerseException;
53 import org.crosswire.jsword.util.WebWarning;
54
55
67 public class DesktopActions {
68
74 public DesktopActions(Desktop desktop) {
75 this.desktop = desktop;
76 actions = new ActionFactory(this);
77
78 osxRegistered = macOSXRegistration();
79 }
80
81
84 public Desktop getDesktop() {
85 return desktop;
86 }
87
88
91 public ActionFactory getActions() {
92 return actions;
93 }
94
95
101 public boolean macOSXRegistration() {
102 if (OSType.MAC.equals(OSType.getOSType())) {
103 try {
104 Class<?> osxAdapter = ClassUtil.forName("org.crosswire.common.aqua.OSXAdapter");
105 Object[] registerOSXArgs = {
106 actions, "About", "Options", "Exit"
107 };
108 ReflectionUtil.invoke(osxAdapter, osxAdapter, "registerMacOSXApplication", registerOSXArgs);
109
110 Class<?>[] enablePrefTypes = {
113 boolean.class
114 };
115 Object[] enablePrefArgs = {
116 Boolean.TRUE
117 };
118 ReflectionUtil.invoke(osxAdapter, osxAdapter, "enablePrefs", enablePrefArgs, enablePrefTypes);
119 return true;
120 } catch (NoClassDefFoundError e) {
121 log.error("This version of Mac OS X does not support the Apple EAWT. Application Menu handling has been disabled (" + e + ")");
123 } catch (ClassNotFoundException e) {
124 log.error("This version of Mac OS X does not support the Apple EAWT. Application Menu handling has been disabled (" + e + ")");
126 } catch (Exception e) {
127 log.error("Exception while loading the OSXAdapter:", e);
129 }
130 }
131 return false;
132 }
133
134
139 public boolean isOSXRegistered() {
140 return osxRegistered;
141 }
142
143
146 public SitesPane getSites() {
147 if (sites == null) {
148 sites = new SitesPane();
149 }
150 return sites;
151 }
152
153
156 public void doOpen() {
157 try {
158 BibleViewPane view = (BibleViewPane) getDesktop().getViews().getSelected();
159 view.open();
160 } catch (NoSuchVerseException e) {
161 Reporter.informUser(getDesktop(), e);
162 } catch (IOException e) {
163 Reporter.informUser(getDesktop(), e);
164 }
165 }
166
167
170 public void doSave() {
171 try {
172 BibleViewPane view = (BibleViewPane) getDesktop().getViews().getSelected();
173 if (!view.maySave()) {
174 Reporter.informUser(getDesktop(), BDMsg.gettext("No Passage to Save"));
177 return;
178 }
179
180 view.save();
181 } catch (IOException ex) {
182 Reporter.informUser(getDesktop(), ex);
183 }
184 }
185
186
189 public void doSaveAs() {
190 try {
191 BibleViewPane view = (BibleViewPane) getDesktop().getViews().getSelected();
192 if (!view.maySave()) {
193 Reporter.informUser(getDesktop(), BDMsg.gettext("No Passage to Save"));
196 return;
197 }
198
199 view.saveAs();
200 } catch (IOException ex) {
201 Reporter.informUser(getDesktop(), ex);
202 }
203 }
204
205
208 public void doSaveAll() {
209 boolean ok = false;
210
211 for (Component comp : getDesktop().getViews()) {
212 BibleViewPane view = (BibleViewPane) comp;
213 if (view.maySave()) {
214 ok = true;
215 }
216 }
217
218 if (!ok) {
219 Reporter.informUser(getDesktop(), BDMsg.gettext("No Passage to Save"));
222 return;
223 }
224
225 for (Component comp : getDesktop().getViews()) {
226 try {
227 BibleViewPane view = (BibleViewPane) comp;
228 view.save();
229 } catch (IOException ex) {
230 Reporter.informUser(getDesktop(), ex);
231 }
232 }
233 }
234
235
238 public void doExit() {
239 LayoutPersistence.instance().saveLayout(desktop);
240 System.exit(0);
241 }
242
243
246 public void doCopy() {
247 BibleViewPane view = (BibleViewPane) getDesktop().getViews().getSelected();
248 SplitBookDataDisplay da = view.getPassagePane();
249 da.copy();
250 }
251
252
255 public void doBack() {
256 getDesktop().selectHistory(-1);
257 }
258
259
262 public void doForward() {
263 getDesktop().selectHistory(1);
264 }
265
266 public void doStrongs(ActionEvent ev) {
267 JCheckBoxMenuItem toggle = (JCheckBoxMenuItem) ev.getSource();
268 XSLTProperty.STRONGS_NUMBERS.setState(toggle.isSelected());
269 BibleViewPane view = (BibleViewPane) getDesktop().getViews().getSelected();
270 SplitBookDataDisplay da = view.getPassagePane();
271 da.getBookDataDisplay().refresh();
272 }
273
274 public void doMorph(ActionEvent ev) {
275 JCheckBoxMenuItem toggle = (JCheckBoxMenuItem) ev.getSource();
276 XSLTProperty.MORPH.setState(toggle.isSelected());
277 BibleViewPane view = (BibleViewPane) getDesktop().getViews().getSelected();
278 SplitBookDataDisplay da = view.getPassagePane();
279 da.getBookDataDisplay().refresh();
280 }
281
282 public void doVLine(ActionEvent ev) {
283 JCheckBoxMenuItem toggle = (JCheckBoxMenuItem) ev.getSource();
284 XSLTProperty.START_VERSE_ON_NEWLINE.setState(toggle.isSelected());
285 BibleViewPane view = (BibleViewPane) getDesktop().getViews().getSelected();
286 SplitBookDataDisplay da = view.getPassagePane();
287 da.getBookDataDisplay().refresh();
288 }
289
290 public void doVNum() {
291 XSLTProperty.VERSE_NUMBERS.setState(true);
292 XSLTProperty.CV.setState(false);
293 XSLTProperty.BCV.setState(false);
294 XSLTProperty.NO_VERSE_NUMBERS.setState(false);
295 BibleViewPane view = (BibleViewPane) getDesktop().getViews().getSelected();
296 SplitBookDataDisplay da = view.getPassagePane();
297 da.getBookDataDisplay().refresh();
298 }
299
300 public void doTinyVNum(ActionEvent ev) {
301 JCheckBoxMenuItem toggle = (JCheckBoxMenuItem) ev.getSource();
302 XSLTProperty.TINY_VERSE_NUMBERS.setState(toggle.isSelected());
303 BibleViewPane view = (BibleViewPane) getDesktop().getViews().getSelected();
304 SplitBookDataDisplay da = view.getPassagePane();
305 da.getBookDataDisplay().refresh();
306 }
307
308 public void doBCVNum() {
309 XSLTProperty.VERSE_NUMBERS.setState(false);
310 XSLTProperty.CV.setState(false);
311 XSLTProperty.BCV.setState(true);
312 XSLTProperty.NO_VERSE_NUMBERS.setState(false);
313 BibleViewPane view = (BibleViewPane) getDesktop().getViews().getSelected();
314 SplitBookDataDisplay da = view.getPassagePane();
315 da.getBookDataDisplay().refresh();
316 }
317
318 public void doCVNum() {
319 XSLTProperty.VERSE_NUMBERS.setState(false);
320 XSLTProperty.CV.setState(true);
321 XSLTProperty.BCV.setState(false);
322 XSLTProperty.NO_VERSE_NUMBERS.setState(false);
323 BibleViewPane view = (BibleViewPane) getDesktop().getViews().getSelected();
324 SplitBookDataDisplay da = view.getPassagePane();
325 da.getBookDataDisplay().refresh();
326 }
327
328 public void doNoVNum() {
329 XSLTProperty.VERSE_NUMBERS.setState(false);
330 XSLTProperty.CV.setState(false);
331 XSLTProperty.BCV.setState(false);
332 XSLTProperty.NO_VERSE_NUMBERS.setState(true);
333 BibleViewPane view = (BibleViewPane) getDesktop().getViews().getSelected();
334 SplitBookDataDisplay da = view.getPassagePane();
335 da.getBookDataDisplay().refresh();
336 }
337
338
341 public void doCompareToggle(ActionEvent ev) {
342 JCheckBoxMenuItem toggle = (JCheckBoxMenuItem) ev.getSource();
343 getDesktop().setCompareShowing(toggle.getState());
344 }
345
346 public void doHeadings(ActionEvent ev) {
347 JCheckBoxMenuItem toggle = (JCheckBoxMenuItem) ev.getSource();
348 XSLTProperty.HEADINGS.setState(toggle.isSelected());
349 BibleViewPane view = (BibleViewPane) getDesktop().getViews().getSelected();
350 SplitBookDataDisplay da = view.getPassagePane();
351 da.getBookDataDisplay().refresh();
352 }
353
354 public void doNotes(ActionEvent ev) {
355 JCheckBoxMenuItem toggle = (JCheckBoxMenuItem) ev.getSource();
356 XSLTProperty.NOTES.setState(toggle.isSelected());
357 BibleViewPane view = (BibleViewPane) getDesktop().getViews().getSelected();
358 SplitBookDataDisplay da = view.getPassagePane();
359 da.getBookDataDisplay().refresh();
360 }
361
362 public void doXRef(ActionEvent ev) {
363 JCheckBoxMenuItem toggle = (JCheckBoxMenuItem) ev.getSource();
364 XSLTProperty.XREF.setState(toggle.isSelected());
365 BibleViewPane view = (BibleViewPane) getDesktop().getViews().getSelected();
366 SplitBookDataDisplay da = view.getPassagePane();
367 da.getBookDataDisplay().refresh();
368 }
369
370
376 public void doViewSource() {
377 BibleViewPane view = (BibleViewPane) getDesktop().getViews().getSelected();
379 SplitBookDataDisplay da = view.getPassagePane();
380 BookDataDisplay bdd = da.getBookDataDisplay();
381 if (bdd instanceof TabbedBookDataDisplay) {
382 bdd = ((TabbedBookDataDisplay) bdd).getInnerDisplayPane();
383 }
384
385 Key key = bdd.getKey();
386
387 if (key == null) {
388 Reporter.informUser(getDesktop(), BDMsg.gettext("No current passage to view"));
391 return;
392 }
393
394 ViewSourcePane viewer = new ViewSourcePane(da.getBooks(), key);
395 viewer.showInFrame(getDesktop());
396 }
397
398
401 public void doBooks() {
402 int webAccess = InternetWarning.GRANTED;
403 if (WebWarning.instance().isShown()) {
404 webAccess = InternetWarning.showDialog(desktop, "?");
405 }
406
407 if (webAccess == InternetWarning.GRANTED) {
408 getSites().showInDialog(getDesktop());
409 }
410 }
411
412
415 public void doOptions() {
416 URI configUri = CWProject.instance().getWritableURI("desktop", FileUtil.EXTENSION_PROPERTIES);
417 ConfigEditorFactory.showDialog(desktop.getConfig(), desktop, configUri);
418 }
419
420
423 public void doContents() {
424 StringBuilder buf = new StringBuilder(200);
425 buf.append(BDMsg.gettext("Currently on-line help is only available via the Bible Desktop's website:"));
427 buf.append("\nhttp://www.crosswire.org/bibledesktop");
428 CWOptionPane.showMessageDialog(getDesktop(), buf.toString());
429 }
430
431
434 public void doAbout() {
435 if (atp == null) {
436 atp = new AboutPane();
437 }
438
439 atp.showInDialog(getDesktop());
440 }
441
442
445 public void doToolTipToggle(ActionEvent ev) {
446 JCheckBoxMenuItem toggle = (JCheckBoxMenuItem) ev.getSource();
447 ToolTipManager.sharedInstance().setEnabled(toggle.isSelected());
448 }
449
450
453 public void doStatusToggle(ActionEvent ev) {
454 JCheckBoxMenuItem toggle = (JCheckBoxMenuItem) ev.getSource();
455 desktop.showStatusBar(toggle.isSelected());
456 }
457
458
461 public void doSidebarToggle(ActionEvent ev) {
462 JCheckBoxMenuItem toggle = (JCheckBoxMenuItem) ev.getSource();
463 final boolean show = toggle.isSelected();
464 desktop.getViews().visit(new ShowSideBarVisitor(show));
465 }
466
467
470 private static final class ShowSideBarVisitor implements ViewVisitor {
471
474 public ShowSideBarVisitor(boolean show) {
475 this.show = show;
476 }
477
478
481 public void visitView(Component component) {
482 if (component instanceof BibleViewPane) {
483 BibleViewPane view = (BibleViewPane) component;
484 SplitBookDataDisplay sbDisplay = view.getPassagePane();
485 sbDisplay.showSidebar(show);
486 }
487 }
488
489 private boolean show;
490 }
491
492
518
521 protected Desktop desktop;
522
523
526 private ActionFactory actions;
527
528
531 private boolean osxRegistered;
532
533
536 private AboutPane atp;
537
538
541 private SitesPane sites;
542
543
546 protected static final Logger log = Logger.getLogger(DesktopActions.class);
547 }
548