net.sourceforge.ganttproject.gui.options.InterfaceOptionPageProvider.java Source code

Java tutorial

Introduction

Here is the source code for net.sourceforge.ganttproject.gui.options.InterfaceOptionPageProvider.java

Source

/*
GanttProject is an opensource project management tool. License: GPL3
Copyright (C) 2011 Dmitry Barashev
    
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 3
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.sourceforge.ganttproject.gui.options;

import java.awt.BorderLayout;
import java.awt.Component;
import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;
import java.net.URL;
import java.text.DateFormat;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;

import javax.swing.BorderFactory;
import javax.swing.JEditorPane;
import javax.swing.JPanel;

import org.apache.commons.io.FileUtils;

import net.sourceforge.ganttproject.GPLogger;
import net.sourceforge.ganttproject.IGanttProject;
import net.sourceforge.ganttproject.gui.NotificationManager;
import net.sourceforge.ganttproject.gui.UIFacade;
import net.sourceforge.ganttproject.gui.UIUtil;
import net.sourceforge.ganttproject.language.GanttLanguage;
import net.sourceforge.ganttproject.util.collect.Pair;
import biz.ganttproject.core.option.ChangeValueEvent;
import biz.ganttproject.core.option.ChangeValueListener;
import biz.ganttproject.core.option.GPOptionGroup;

import com.google.common.base.Joiner;
import com.google.common.base.Strings;
import com.google.common.collect.Lists;

public class InterfaceOptionPageProvider extends OptionPageProviderBase {
    public static final String ID = "ui.general";
    private JEditorPane myLabel;

    public InterfaceOptionPageProvider() {
        super(ID);
    }

    @Override
    public void init(IGanttProject project, final UIFacade uiFacade) {
        super.init(project, uiFacade);
        uiFacade.getLanguageOption().addChangeValueListener(new ChangeValueListener() {
            @Override
            public void changeValue(ChangeValueEvent event) {
                Locale selectedLocale = uiFacade.getLanguageOption().getSelectedValue();
                if (selectedLocale != null && "gl".equals(selectedLocale.getLanguage().toLowerCase())
                        && myLabel != null) {
                    Pair<Boolean, File> localeTest = checkLocale(selectedLocale);
                    if (!localeTest.first() && localeTest.second() != null) {
                        GanttLanguage i18n = GanttLanguage.getInstance();
                        myLabel.setVisible(true);
                        myLabel.setText(i18n.formatText("optionPage.ui.general.localeInstallText",
                                i18n.getText("optionPage.ui.general.localeInstallUrl"),
                                localeTest.second().getAbsolutePath()));
                    }
                } else if (myLabel != null && myLabel.isVisible()) {
                    myLabel.setVisible(false);
                }
            }
        });
    }

    @Override
    public GPOptionGroup[] getOptionGroups() {
        List<GPOptionGroup> groups = Lists.newArrayList();
        groups.addAll(Arrays.asList(getUiFacade().getOptions()));
        return groups.toArray(new GPOptionGroup[groups.size()]);
    }

    @Override
    public boolean hasCustomComponent() {
        return true;
    }

    @Override
    public Component buildPageComponent() {
        OptionsPageBuilder builder = new OptionsPageBuilder();
        builder.setUiFacade(getUiFacade());
        Component component = builder.buildPage(getOptionGroups(), getPageID());
        myLabel = UIUtil.createHtmlPane("", NotificationManager.DEFAULT_HYPERLINK_LISTENER);
        myLabel.setBorder(BorderFactory.createEmptyBorder());
        myLabel.setVisible(false);

        JPanel wrapper = new JPanel(new BorderLayout());
        wrapper.add(component, BorderLayout.NORTH);
        wrapper.add(myLabel, BorderLayout.SOUTH);
        return wrapper;
    }

    private static Pair<Boolean, File> checkLocale(Locale l) {
        if (Arrays.asList(DateFormat.getAvailableLocales()).contains(l)) {
            return Pair.create(Boolean.TRUE, null);
        }
        File extDir = getExtDir();
        if (!extDir.exists()) {
            return Pair.create(Boolean.FALSE, null);
        }
        if (!extDir.isDirectory()) {
            return Pair.create(Boolean.FALSE, null);
        }
        if (extDir.canWrite()) {
            GPLogger.logToLogger("Java extensions directory " + extDir + " is writable");
            URL libUrl = InterfaceOptionPageProvider.class.getResource("lib");
            if (libUrl != null) {
                try {
                    File galicianLocaleJar = new File(new File(libUrl.toURI()), "javagalician.jar");
                    File targetJar = new File(extDir, galicianLocaleJar.getName());
                    GPLogger.logToLogger("Locale extension " + galicianLocaleJar);
                    if (galicianLocaleJar.exists() && !targetJar.exists()) {
                        GPLogger.logToLogger("Exists. Installing now");
                        FileUtils.copyFileToDirectory(galicianLocaleJar, extDir);
                        return Pair.create(Boolean.TRUE, extDir);
                    }
                } catch (IOException e) {
                    GPLogger.log(e);
                } catch (URISyntaxException e) {
                    GPLogger.log(e);
                }
            }
            return Pair.create(Boolean.FALSE, extDir);
        } else {
            GPLogger.logToLogger("Java extensions directory " + extDir + " is not writable");
        }
        return Pair.create(Boolean.FALSE, extDir);
    }

    private static File getExtDir() {
        File fallback = new File(System.getProperty("java.home"), Joiner.on(File.separatorChar).join("lib", "ext"));
        String extDirsProperty = System.getProperty("java.ext.dirs");
        if (Strings.isNullOrEmpty(extDirsProperty)) {
            return fallback;
        }
        for (String s : extDirsProperty.split(File.pathSeparator)) {
            File file = new File(s);
            if (!file.exists()) {
                continue;
            }
            if (!file.isDirectory()) {
                continue;
            }
            if (file.canWrite()) {
                return file;
            }
            fallback = file;
        }
        return fallback;
    }
}