net.sf.jabref.oo.AutoDetectPaths.java Source code

Java tutorial

Introduction

Here is the source code for net.sf.jabref.oo.AutoDetectPaths.java

Source

/*  Copyright (C) 2003-2011 JabRef contributors.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
    
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.
    
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
package net.sf.jabref.oo;

import net.sf.jabref.Globals;
import net.sf.jabref.AbstractWorker;

import javax.swing.*;
import java.io.File;
import java.io.FileFilter;
import java.awt.*;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.util.*;
import java.util.List;

import com.jgoodies.forms.builder.DefaultFormBuilder;
import com.jgoodies.forms.layout.FormLayout;

/**
 * Tools for automatically detecting jar and executable paths to OpenOffice.
 */
public class AutoDetectPaths extends AbstractWorker {

    private boolean foundPaths = false;
    private boolean fileSearchCancelled = false;
    private JDialog prog;
    private final JDialog parent;

    public AutoDetectPaths(JDialog parent) {
        this.parent = parent;
    }

    public boolean runAutodetection() {
        try {
            if (AutoDetectPaths.checkAutoDetectedPaths()) {
                return true;
            }
            init();
            getWorker().run();
            update();
            return foundPaths;
        } catch (Throwable e) {
            e.printStackTrace();
            return false;
        }
    }

    @Override
    public void run() {
        foundPaths = autoDetectPaths();
    }

    public boolean getResult() {
        return foundPaths;
    }

    public boolean cancelled() {
        return fileSearchCancelled;
    }

    @Override
    public void init() throws Throwable {
        prog = showProgressDialog(parent, Globals.lang("Autodetecting paths..."), Globals.lang("Please wait..."),
                true);
    }

    @Override
    public void update() {
        prog.dispose();
    }

    private boolean autoDetectPaths() {

        if (Globals.ON_WIN) {
            List<File> progFiles = AutoDetectPaths.findProgramFilesDir();
            File sOffice = null;
            if (fileSearchCancelled) {
                return false;
            }
            for (File dir : progFiles) {
                sOffice = findFileDir(dir, "soffice.exe");
                if (sOffice != null) {
                    break;
                }
            }
            if (sOffice == null) {
                JOptionPane.showMessageDialog(parent, Globals.lang(
                        "Unable to autodetect OpenOffice installation. Please choose the installation directory manually."),
                        Globals.lang("Could not find OpenOffice installation"), JOptionPane.INFORMATION_MESSAGE);
                JFileChooser jfc = new JFileChooser(new File("C:\\"));
                jfc.setDialogType(JFileChooser.OPEN_DIALOG);
                jfc.setFileFilter(new javax.swing.filechooser.FileFilter() {

                    @Override
                    public boolean accept(File file) {
                        return file.isDirectory();
                    }

                    @Override
                    public String getDescription() {
                        return Globals.lang("Directories");
                    }
                });
                jfc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
                jfc.showOpenDialog(parent);
                if (jfc.getSelectedFile() != null) {
                    sOffice = jfc.getSelectedFile();
                }
            }
            if (sOffice == null) {
                return false;
            }

            Globals.prefs.put("ooExecutablePath", new File(sOffice, "soffice.exe").getPath());
            File unoil = findFileDir(sOffice.getParentFile(), "unoil.jar");
            if (fileSearchCancelled) {
                return false;
            }
            File jurt = findFileDir(sOffice.getParentFile(), "jurt.jar");
            if (fileSearchCancelled) {
                return false;
            }
            if ((unoil != null) && (jurt != null)) {
                Globals.prefs.put("ooUnoilPath", unoil.getPath());
                Globals.prefs.put("ooJurtPath", jurt.getPath());
                return true;
            } else {
                return false;
            }

        } else if (Globals.ON_MAC) {
            File rootDir = new File("/Applications");
            File[] files = rootDir.listFiles();
            for (File file : files) {
                if (file.isDirectory() && file.getName().equals("OpenOffice.org.app")) {
                    rootDir = file;
                    //System.out.println("Setting starting dir to: "+file.getPath());
                    break;
                }
            }
            //System.out.println("Searching for soffice.bin");
            File sOffice = findFileDir(rootDir, "soffice.bin");
            //System.out.println("Found: "+(sOffice != null ? sOffice.getPath() : "-"));
            if (fileSearchCancelled) {
                return false;
            }
            if (sOffice != null) {
                Globals.prefs.put("ooExecutablePath", new File(sOffice, "soffice.bin").getPath());
                //System.out.println("Searching for unoil.jar");
                File unoil = findFileDir(rootDir, "unoil.jar");
                //System.out.println("Found: "+(unoil != null ? unoil.getPath(): "-"));
                if (fileSearchCancelled) {
                    return false;
                }
                //System.out.println("Searching for jurt.jar");
                File jurt = findFileDir(rootDir, "jurt.jar");
                //System.out.println("Found: "+(jurt != null ? jurt.getPath(): "-"));
                if (fileSearchCancelled) {
                    return false;
                }
                if ((unoil != null) && (jurt != null)) {
                    Globals.prefs.put("ooUnoilPath", unoil.getPath());
                    Globals.prefs.put("ooJurtPath", jurt.getPath());
                    return true;
                } else {
                    return false;
                }
            } else {
                return false;
            }
        } else {
            // Linux:
            String usrRoot = "/usr/lib";
            File inUsr = findFileDir(new File("/usr/lib"), "soffice");
            if (fileSearchCancelled) {
                return false;
            }
            if (inUsr == null) {
                inUsr = findFileDir(new File("/usr/lib64"), "soffice");
                if (inUsr != null) {
                    usrRoot = "/usr/lib64";
                }
            }

            if (fileSearchCancelled) {
                return false;
            }
            File inOpt = findFileDir(new File("/opt"), "soffice");
            if (fileSearchCancelled) {
                return false;
            }
            if ((inUsr != null) && (inOpt == null)) {
                return setupPreferencesForOO(usrRoot, inUsr);
            } else if ((inOpt != null) && (inUsr == null)) {
                Globals.prefs.put("ooExecutablePath", new File(inOpt, "soffice.bin").getPath());
                File unoil = findFileDir(new File("/opt"), "unoil.jar");
                File jurt = findFileDir(new File("/opt"), "jurt.jar");
                if ((unoil != null) && (jurt != null)) {
                    Globals.prefs.put("ooUnoilPath", unoil.getPath());
                    Globals.prefs.put("ooJurtPath", jurt.getPath());
                    return true;
                } else {
                    return false;
                }
            } else if (inOpt != null) { // Found both
                JRadioButton optRB = new JRadioButton(inOpt.getPath(), true);
                JRadioButton usrRB = new JRadioButton(inUsr.getPath(), false);
                ButtonGroup bg = new ButtonGroup();
                bg.add(optRB);
                bg.add(usrRB);
                DefaultFormBuilder b = new DefaultFormBuilder(new FormLayout("left:pref", ""));
                b.append(Globals
                        .lang("Found more than one OpenOffice executable. Please choose which one to connect to:"));
                b.append(optRB);
                b.append(usrRB);
                int answer = JOptionPane.showConfirmDialog(null, b.getPanel(),
                        Globals.lang("Choose OpenOffice executable"), JOptionPane.OK_CANCEL_OPTION);
                if (answer == JOptionPane.CANCEL_OPTION) {
                    return false;
                } else {
                    if (optRB.isSelected()) {
                        return setupPreferencesForOO("/opt", inOpt);
                    } else {
                        return setupPreferencesForOO(usrRoot, inUsr);
                    }

                }
            } else {
                return false;
            }
        }

    }

    private boolean setupPreferencesForOO(String usrRoot, File inUsr) {
        Globals.prefs.put("ooExecutablePath", new File(inUsr, "soffice.bin").getPath());
        File unoil = findFileDir(new File(usrRoot), "unoil.jar");
        if (fileSearchCancelled) {
            return false;
        }
        File jurt = findFileDir(new File(usrRoot), "jurt.jar");
        if (fileSearchCancelled) {
            return false;
        }
        if ((unoil != null) && (jurt != null)) {
            Globals.prefs.put("ooUnoilPath", unoil.getPath());
            Globals.prefs.put("ooJurtPath", jurt.getPath());
            return true;
        } else {
            return false;
        }
    }

    /**
     * Search for Program files directory.
     * @return the File pointing to the Program files directory, or null if not found.
     *   Since we are not including a library for Windows integration, this method can't
     *   find the Program files dir in localized Windows installations.
     */
    private static java.util.List<File> findProgramFilesDir() {
        List<File> dirList = new ArrayList<File>();
        File root = new File("C:\\");
        File[] dirs = root.listFiles(new FileFilter() {

            @Override
            public boolean accept(File file) {
                return file.isDirectory();
            }
        });
        for (File dir : dirs) {
            if (dir.getName().toLowerCase().equals("program files")
                    || dir.getName().toLowerCase().equals("program files (x86)")) {
                dirList.add(dir);
            }
        }
        return dirList;
    }

    private static boolean checkAutoDetectedPaths() {

        if (Globals.prefs.hasKey("ooUnoilPath") && Globals.prefs.hasKey("ooJurtPath")
                && Globals.prefs.hasKey("ooExecutablePath")) {
            return new File(Globals.prefs.get("ooUnoilPath"), "unoil.jar").exists()
                    && new File(Globals.prefs.get("ooJurtPath"), "jurt.jar").exists()
                    && new File(Globals.prefs.get("ooExecutablePath")).exists();
        } else {
            return false;
        }
    }

    /**
     * Search for a file, starting at the given directory.
     * @param startDir The starting point.
     * @param filename The name of the file to search for.
     * @return The directory where the file was first found, or null if not found.
     */
    private File findFileDir(File startDir, String filename) {
        if (fileSearchCancelled) {
            return null;
        }
        File[] files = startDir.listFiles();
        if (files == null) {
            return null;
        }
        File result = null;
        for (File file : files) {
            if (fileSearchCancelled) {
                return null;
            }
            if (file.isDirectory()) {
                result = findFileDir(file, filename);
                if (result != null) {
                    break;
                }
            } else if (file.getName().equals(filename)) {
                result = startDir;
                break;
            }
        }
        return result;
    }

    public JDialog showProgressDialog(JDialog parent, String title, String message, boolean includeCancelButton) {
        fileSearchCancelled = false;
        final JDialog prog;
        JProgressBar bar = new JProgressBar(SwingConstants.HORIZONTAL);
        JButton cancel = new JButton(Globals.lang("Cancel"));
        cancel.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent event) {
                fileSearchCancelled = true;
                ((JButton) event.getSource()).setEnabled(false);
            }
        });
        prog = new JDialog(parent, title, false);
        bar.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
        bar.setIndeterminate(true);
        if (includeCancelButton) {
            prog.add(cancel, BorderLayout.SOUTH);
        }
        prog.add(new JLabel(message), BorderLayout.NORTH);
        prog.add(bar, BorderLayout.CENTER);
        prog.pack();
        prog.setLocationRelativeTo(null);//parent);
        //SwingUtilities.invokeLater(new Runnable() {
        //    public void run() {
        prog.setVisible(true);
        //    }
        //});
        return prog;
    }
}