/* ******************************************************************************
* Copyright (c) 2006-2012 XMind Ltd. and others.
*
* This file is a part of XMind 3. XMind releases 3 and
* above are dual-licensed under the Eclipse Public License (EPL),
* which is available at http://www.eclipse.org/legal/epl-v10.html
* and the GNU Lesser General Public License (LGPL),
* which is available at http://www.gnu.org/licenses/lgpl.html
* See http://www.xmind.net/license.html for details.
*
* Contributors:
* XMind Ltd. - initial API and implementation
*******************************************************************************/
package org.xmind.ui.internal.dialogs;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Shell;
import org.xmind.ui.internal.MindMapUIPlugin;
import org.xmind.ui.mindmap.MindMapUI;
import org.xmind.ui.util.ImageFormat;
/**
*
* @author Frank Shaka
*
*/
public class DialogUtils {
private static final String OLD_FILE_EXT = ".xmap"; //$NON-NLS-1$
private static final String OPEN_DIALOG_SETTINGS_ID = "org.xmind.ui.openDialog"; //$NON-NLS-1$
private static final String FILTER_INDEX = "filterIndex"; //$NON-NLS-1$
private static final String FILTER_PATH = "filterPath"; //$NON-NLS-1$
private DialogUtils() {
}
public static void makeDefaultImageSelectorDialog(FileDialog dialog,
boolean withAllFileFilter) {
makeImageSelectorDialog(dialog, withAllFileFilter,
ImageFormat.values());
}
public static void makeImageSelectorDialog(FileDialog dialog,
boolean withAllFileFilter, ImageFormat... imageFormats) {
Collection<String> extensions = new ArrayList<String>();
Collection<String> names = new ArrayList<String>();
if (withAllFileFilter) {
extensions.add("*.*"); //$NON-NLS-1$
names.add(NLS.bind("{0} (*.*)", //$NON-NLS-1$
DialogMessages.AllFilesFilterName));
}
for (ImageFormat format : imageFormats) {
List<String> exts = format.getExtensions();
if (!exts.isEmpty()) {
StringBuilder extBuilder = new StringBuilder(exts.size() * 5);
StringBuilder extDescBuilder = new StringBuilder(
exts.size() * 5);
for (String ext : exts) {
String pattern = "*" + ext; //$NON-NLS-1$
if (extBuilder.length() > 0)
extBuilder.append(";"); //$NON-NLS-1$
extBuilder.append(pattern);
if (extDescBuilder.length() > 0)
extDescBuilder.append(", "); //$NON-NLS-1$
extDescBuilder.append(pattern);
}
extensions.add(extBuilder.toString());
names.add(NLS.bind("{0} ({1})", //$NON-NLS-1$
format.getDescription(), extDescBuilder.toString()));
}
}
dialog.setFilterExtensions(
extensions.toArray(new String[extensions.size()]));
dialog.setFilterNames(names.toArray(new String[names.size()]));
}
public static boolean confirmOverwrite(Shell shell, String filePath) {
return MessageDialog.openConfirm(shell,
DialogMessages.ConfirmOverwrite_title,
NLS.bind(DialogMessages.ConfirmOverwrite_message, filePath));
}
public static boolean confirmRestart(Shell shell) {
return new MessageDialog(null, DialogMessages.ConfirmRestart_title,
null, DialogMessages.ConfirmRestart_message,
MessageDialog.QUESTION,
new String[] { DialogMessages.ConfirmRestart_Restart,
DialogMessages.ConfirmRestart_Continue },
1).open() == MessageDialog.OK;
}
public static String save(Shell shell, String title, String proposalName,
String[] filterExtensions, String[] filterNames, int filterIndex,
String dirPath) {
FileDialog dialog = new FileDialog(shell, SWT.SAVE);
dialog.setOverwrite(false);
dialog.setText(title == null ? DialogMessages.Save_title : title);
if (proposalName != null)
dialog.setFileName(proposalName);
if (dirPath != null)
dialog.setFilterPath(dirPath);
if (filterExtensions != null)
dialog.setFilterExtensions(filterExtensions);
if (filterNames != null)
dialog.setFilterNames(filterNames);
if (filterIndex >= 0)
dialog.setFilterIndex(filterIndex);
return save(shell, dialog);
}
public static String save(Shell shell, String proposalName,
String[] filterExtensions, String[] filterNames, int filterIndex,
String dirPath) {
return save(shell, null, proposalName, filterExtensions, filterNames,
filterIndex, dirPath);
}
public static String save(Shell shell, FileDialog dialog) {
String fileName = dialog.open();
if (fileName != null) {
int filterIndex = dialog.getFilterIndex();
if (filterIndex >= 0) {
String extension = dialog.getFilterExtensions()[filterIndex];
fileName = adaptFileName(fileName, extension);
if (new File(fileName).exists()
&& !DialogUtils.confirmOverwrite(shell, fileName))
return save(shell, dialog);
}
}
return fileName;
}
private static String adaptFileName(String fileName, String extension) {
if (extension != null && !"".equals(extension)) { //$NON-NLS-1$
String defaultExt = null;
for (String ext : extension.split(";")) { //$NON-NLS-1$
ext = ext.trim();
if (ext.startsWith("*")) //$NON-NLS-1$
ext = ext.substring(1);
if (defaultExt == null)
defaultExt = ext;
if (fileName.endsWith(ext))
return fileName;
}
if (defaultExt != null)
return fileName + defaultExt;
}
return fileName;
}
/**
*
* @param parentShell
* @param style
* SWT.NONE, SWT.MULTI, SWT.SHEET
* @return
*/
public static List<File> openXMindFiles(Shell parentShell, int style) {
FileDialog dialog = new FileDialog(parentShell, SWT.OPEN | style);
String xmindExt = "*" + MindMapUI.FILE_EXT_XMIND; //$NON-NLS-1$
String xmtExt = "*" + MindMapUI.FILE_EXT_TEMPLATE; //$NON-NLS-1$
String oldExt = "*" + OLD_FILE_EXT; //$NON-NLS-1$
String allSupportedFileExt = String.format("%s;%s;%s", //$NON-NLS-1$
xmindExt, xmtExt, oldExt);
String allExt = "*.*"; //$NON-NLS-1$
List<String> filterExtensions = new ArrayList<String>(
Arrays.asList(dialog.getFilterExtensions()));
filterExtensions.add(xmindExt);
filterExtensions.add(oldExt);
filterExtensions.add(allSupportedFileExt);
filterExtensions.add(allExt);
dialog.setFilterExtensions(
filterExtensions.toArray(new String[filterExtensions.size()]));
List<String> filterNames = new ArrayList<String>(
Arrays.asList(dialog.getFilterNames()));
filterNames.add(NLS.bind("{0} ({1})", //$NON-NLS-1$
DialogMessages.WorkbookFilterName, xmindExt));
filterNames.add(NLS.bind("{0} ({1})", //$NON-NLS-1$
DialogMessages.OldWorkbookFilterName, oldExt));
filterNames
.add(NLS.bind("{0} ({1}, {2}, {3})", //$NON-NLS-1$
new Object[] {
DialogMessages.AllSupportedFilesFilterName,
xmindExt, xmtExt, oldExt }));
filterNames.add(NLS.bind("{0} ({1})", //$NON-NLS-1$
DialogMessages.AllFilesFilterName, allExt));
dialog.setFilterNames(
filterNames.toArray(new String[filterNames.size()]));
IDialogSettings globalSettings = MindMapUIPlugin.getDefault()
.getDialogSettings();
IDialogSettings settings = globalSettings
.getSection(OPEN_DIALOG_SETTINGS_ID);
if (settings == null) {
settings = globalSettings.addNewSection(OPEN_DIALOG_SETTINGS_ID);
}
int filterIndex = 0;
try {
filterIndex = settings.getInt(FILTER_INDEX);
if (filterIndex < 0 || filterIndex > 2)
filterIndex = 0;
} catch (NumberFormatException ignore) {
}
dialog.setFilterIndex(filterIndex);
String filterPath = settings.get(FILTER_PATH);
if (filterPath != null && !"".equals(filterPath)) { //$NON-NLS-1$
dialog.setFilterPath(filterPath);
}
String selection = dialog.open();
if (selection == null)
return Collections.emptyList();
filterIndex = dialog.getFilterIndex();
settings.put(FILTER_INDEX, filterIndex);
filterPath = dialog.getFilterPath();
settings.put(FILTER_PATH, filterPath);
String[] fileNames = dialog.getFileNames();
List<File> files = new ArrayList<File>(fileNames.length);
for (int i = 0; i < fileNames.length; i++) {
files.add(new File(filterPath, fileNames[i]));
}
return files;
}
}