package kiyut.ekspos; import com.jgoodies.looks.LookUtils; import com.jgoodies.looks.Options; import com.jgoodies.looks.plastic.PlasticLookAndFeel; import com.jgoodies.looks.plastic.theme.ExperienceBlue; import java.awt.EventQueue; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.File; import java.io.IOException; import java.util.List; import javax.swing.JFrame; import javax.swing.LookAndFeel; import javax.swing.UIManager; import kiyut.ekspos.prefs.GeneralPreferences; import kiyut.ekspos.prefs.IIOPreferences; import org.flexdock.docking.state.PersistenceException; import org.flexdock.perspective.PerspectiveManager; import org.flexdock.perspective.persist.PersistenceHandler; import org.flexdock.perspective.persist.Persister; import org.flexdock.perspective.persist.PerspectiveModel; import org.flexdock.perspective.persist.xml.XMLPersister; /** This is the Application Launcher */ public class Ekspos { /**Main method*/ public static void main(String[] args) { String path = null; if (args.length > 0 ) { path = args[0]; } Ekspos ekspos = new Ekspos(); ekspos.run(path); } /**Construct the application*/ private Ekspos() { } private void run(String path) { initialize(); try { path = resolvePath(path); } catch (Exception ex) { System.err.println("Unable to resolve startup path.\n" + ex.getMessage()); path = null; } final String absPath = path; EventQueue.invokeLater(new Runnable() { public void run() { showMainFrame(absPath); } }); } /** Resolve the startup path with the following rule <br> * - if empty set to null <br> * - if absolute leave at it is <br> * - if relative resolve against current dir System.getProperty("user.dir") * @return String */ private String resolvePath(String path) throws IOException { String newPath = null; if (path == null) { return newPath; } File file = new File(path); file = file.getCanonicalFile(); newPath = file.getCanonicalPath(); return newPath; } private void initialize() { String osName = System.getProperty("os.name").toUpperCase(); // set default swing bold to false, only for JVM 1.5 or above UIManager.put("swing.boldMetal", Boolean.FALSE); // set LaF LookAndFeel lnf = UIManager.getLookAndFeel(); if (lnf != null && lnf.getID().equalsIgnoreCase("Metal")) { String lnfClassName = null; if (osName.startsWith("MAC")) { System.setProperty("com.apple.mrj.application.apple.menu.about.name", Application.getName()); System.setProperty("apple.laf.useScreenMenuBar","true"); lnfClassName = UIManager.getSystemLookAndFeelClassName(); } else if (osName.startsWith("WINDOWS")) { UIManager.put("ClassLoader", LookUtils.class.getClassLoader()); lnfClassName = Options.getSystemLookAndFeelClassName(); Options.setUseNarrowButtons(false); } else { UIManager.put("ClassLoader", LookUtils.class.getClassLoader()); lnfClassName = Options.getCrossPlatformLookAndFeelClassName(); PlasticLookAndFeel.setTabStyle(PlasticLookAndFeel.TAB_STYLE_METAL_VALUE); PlasticLookAndFeel.setPlasticTheme(new ExperienceBlue()); Options.setUseNarrowButtons(false); //PlasticLookAndFeel.setMyCurrentTheme(new ExperienceBlueDefaultFont()); // for CJK Font } if (lnfClassName != null) { try { UIManager.setLookAndFeel(lnfClassName); } catch (Exception ex) { System.err.println("Unable to set LookAndFeel, use default LookAndFeel.\n" + ex.getMessage()); } } } // initialize preferences. GeneralPreferences.getInstance(); IIOPreferences.getInstance(); } private void showMainFrame(String path) { BrowserWindow frame = new BrowserWindow(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setStartPath(path); frame.setVisible(true); WindowManager.createInstance(frame); // setup the PerspectiveManager PerspectiveManager.setPersistenceHandler(new DockingPersistence()); frame.restoreDocking(); // start tips of the day GeneralPreferences prefs = GeneralPreferences.getInstance(); if (prefs.getBoolean(GeneralPreferences.TOTD_KEY) == true) { TOTDWindow totd = new TOTDWindow(); totd.pack(); totd.setLocationRelativeTo(frame); totd.setVisible(true); } frame.addWindowListener(new WindowAdapter() { @Override public void windowClosed(WindowEvent evt) { System.exit(0); } }); frame.setViewer(new Viewer() { public void view(List<File> files, int index) { WindowManager.getInstance().openViewerWindow(files, index); } }); } private class DockingPersistence implements PersistenceHandler { public boolean store(String persistenceKey, PerspectiveModel perspectiveModel) throws IOException, PersistenceException { boolean saved = false; java.io.ByteArrayOutputStream os = new java.io.ByteArrayOutputStream(1024); try { boolean stored = createDefaultPersister().store(os, perspectiveModel); if (stored == true) { byte[] bytes = os.toByteArray(); GeneralPreferences prefs = GeneralPreferences.getInstance(); prefs.putByteArray(GeneralPreferences.DOCKING_LAYOUT_KEY,bytes); prefs.save(); saved = true; } } finally { os.close(); } return saved; } public PerspectiveModel load(String persistenceKey) throws IOException, PersistenceException { PerspectiveModel perspectiveModel = null; GeneralPreferences prefs = GeneralPreferences.getInstance(); byte[] bytes = prefs.getByteArray(GeneralPreferences.DOCKING_LAYOUT_KEY); if (bytes != null) { java.io.ByteArrayInputStream is = new java.io.ByteArrayInputStream(bytes); try { perspectiveModel = createDefaultPersister().load(is); } finally { if (is != null) { is.close(); } } } return perspectiveModel; } public Persister createDefaultPersister() { return XMLPersister.newDefaultInstance(); } } }