package org.geopublishing.atlasStyler; import java.awt.Component; import java.io.File; import javax.swing.JFileChooser; import javax.xml.parsers.FactoryConfigurationError; import org.apache.log4j.Level; import org.apache.log4j.Logger; import org.apache.log4j.xml.DOMConfigurator; import org.geopublishing.atlasStyler.ASProps.Keys; import org.geopublishing.geopublisher.GpUtil; import chrriis.dj.nativeswing.swtimpl.NativeInterface; import chrriis.dj.nativeswing.swtimpl.components.JFileDialog; import chrriis.dj.nativeswing.swtimpl.components.JFileDialog.DialogType; import chrriis.dj.nativeswing.swtimpl.components.JFileDialog.SelectionMode; import de.schmitzm.lang.LangUtil; import de.schmitzm.swing.ExceptionDialog; import de.schmitzm.swing.FileExtensionFilter; import de.schmitzm.versionnumber.ReleaseUtil; public class AsSwingUtil extends ASUtil { /** * Setting up the logger from a XML configuration file. We do that again in * GPPros, as it outputs log messages first. Does not change the * configuration if there are already appenders defined. */ public static void initAsLogging() throws FactoryConfigurationError { if (Logger.getRootLogger().getAllAppenders().hasMoreElements()) return; DOMConfigurator.configure(ASProps.class .getResource("/geopublishing_log4j.xml")); Logger.getRootLogger().addAppender( Logger.getLogger("dummy").getAppender("asFileLogger")); // Apply the LOG level configured in the user-specific application // .properties file String logLevelStr = ASProps.get(Keys.logLevel); if (logLevelStr != null) { Logger.getRootLogger().setLevel(Level.toLevel(logLevelStr)); } // # TODO bugreport@wikisquare.de from properties ExceptionDialog.setMailDestinationAddress("tzeggai@wikisquare.de"); // Add application version number to Exception mails ExceptionDialog.addAdditionalAppInfo(ReleaseUtil .getVersionInfo(GpUtil.class)); } /** * Performs a file choose using the Native OS-Dialog via SWT * * @param parent * component for the dialog (can be {@code null}) * @param startFolder * start folder for the chooser (if {@code null} "/" is used) * @param filter * defines which files can be selected * @return {@code null} if the dialog was not approved * * TODO move to schmitz-swt */ public static File chooseFileOpen(Component parent, File startFolder, String title, FileExtensionFilter... filters) { try { if (!NativeInterface.isOpen()) { NativeInterface.open(); new Thread(new Runnable() { public void run() { NativeInterface.runEventPump(); } }).start(); } JFileDialog fileDialog = new JFileDialog(); if (startFolder != null) { if (startFolder.isDirectory()) fileDialog .setParentDirectory(startFolder.getAbsolutePath()); else fileDialog.setParentDirectory(startFolder.getParent()); } fileDialog.setDialogType(DialogType.OPEN_DIALOG_TYPE); String[] extensions = new String[0]; for (FileExtensionFilter filter : filters) { extensions = LangUtil.extendArray(extensions, filter.toNativeFileFilter()[0]); } String[] descriptions = new String[0]; for (FileExtensionFilter filter : filters) { descriptions = LangUtil.extendArray(descriptions, filter.toNativeFileFilter()[1]); } fileDialog.setExtensionFilters(extensions, descriptions, 0); fileDialog.setTitle(title); fileDialog.show(parent); String selectedFileName = fileDialog.getSelectedFileName(); if (selectedFileName == null) return null; return new File(fileDialog.getParentDirectory(), selectedFileName); } catch (Exception e) { return GpUtil.chooseFileOpenFallback(parent, startFolder, title, filters); } } /** * Performs a file SAVE choose as a fallback * * @param parent * component for the dialog (can be {@code null}) * @param startFolder * start folder for the chooser (if {@code null} "/" is used) * @param filter * defines which files can be selected. Only the last filter in * the list will be offered due to limitations * @return {@code null} if the dialog was not approved * * TODO move to schmitz-swt */ public static File chooseFileSaveFallback(Component parent, File startFolder, String title, FileExtensionFilter... filters) { if (startFolder == null) startFolder = new File("/"); JFileChooser chooser = new JFileChooser(startFolder); chooser.setDialogType(JFileChooser.SAVE_DIALOG); if (filters != null) { chooser.setAcceptAllFileFilterUsed(false); chooser.setFileSelectionMode(JFileChooser.FILES_ONLY); chooser.setFileFilter(filters[filters.length - 1] .toJFileChooserFilter()); } if (title != null) chooser.setDialogTitle(title); int ret = chooser.showOpenDialog(parent); if (ret == JFileChooser.APPROVE_OPTION) return chooser.getSelectedFile(); return null; } public static File chooseFileSave(Component parent, File startFolder, String title, FileExtensionFilter... filters) { try { JFileDialog fileDialog = new JFileDialog(); // fileDialog.setTitle(GpSwingUtil.R("CreateAtlas.Dialog.Title")); if (startFolder != null) { if (startFolder.isDirectory()) fileDialog.setParentDirectory(startFolder .getCanonicalPath()); else { fileDialog.setParentDirectory(startFolder.getParent()); fileDialog.setSelectedFileName(startFolder.getName()); } } fileDialog.setDialogType(DialogType.SAVE_DIALOG_TYPE); fileDialog.setSelectionMode(SelectionMode.SINGLE_SELECTION); String[] extensions = new String[0]; for (FileExtensionFilter filter : filters) { extensions = LangUtil.extendArray(extensions, filter.toNativeFileFilter()[0]); } String[] descriptions = new String[0]; for (FileExtensionFilter filter : filters) { descriptions = LangUtil.extendArray(descriptions, filter.toNativeFileFilter()[1]); } fileDialog.setExtensionFilters(extensions, descriptions, 0); fileDialog.setTitle(title); fileDialog.show(parent); String selectedFileName = fileDialog.getSelectedFileName(); if (selectedFileName == null) return null; return new File(fileDialog.getParentDirectory(), selectedFileName); } catch (Exception e) { return chooseFileSaveFallback(parent, startFolder, title, filters); } } }