/*
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;
}
}