package org.insightech.er.preference; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.StringTokenizer; import org.eclipse.jface.preference.ListEditor; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.FileDialog; import org.eclipse.swt.widgets.MessageBox; import org.eclipse.ui.PlatformUI; import org.insightech.er.Activator; import org.insightech.er.ResourceString; import org.insightech.er.util.io.FileUtils; public abstract class FileListEditor extends ListEditor { public static final String VALUE_SEPARATOR = "/"; private String lastPath; private Composite parent; private Map<String, String> namePathMap; private String extention; public FileListEditor(String name, String labelText, Composite parent, String extention) { super(name, labelText, parent); this.parent = parent; this.namePathMap = new HashMap<String, String>(); this.setPreferenceStore(Activator.getDefault().getPreferenceStore()); this.extention = extention; } /** * {@inheritDoc} */ @Override protected String getNewInputObject() { FileDialog dialog = new FileDialog(getShell()); if (lastPath != null) { if (new File(lastPath).exists()) { dialog.setFilterPath(lastPath); } } String[] filterExtensions = new String[] { extention }; dialog.setFilterExtensions(filterExtensions); String filePath = dialog.open(); if (filePath != null) { File file = new File(filePath); String fileName = file.getName(); if (this.contains(fileName)) { MessageBox messageBox = new MessageBox(PlatformUI .getWorkbench().getActiveWorkbenchWindow().getShell(), SWT.ICON_WARNING | SWT.OK | SWT.CANCEL); messageBox.setText(ResourceString .getResourceString("dialog.title.warning")); messageBox.setMessage(ResourceString .getResourceString("dialog.message.update.file")); if (messageBox.open() == SWT.CANCEL) { return null; } this.namePathMap.put(fileName, filePath); return null; } this.namePathMap.put(fileName, filePath); try { lastPath = file.getParentFile().getCanonicalPath(); } catch (IOException e) { } return fileName; } return null; } /** * {@inheritDoc} */ @Override protected String[] parseString(String stringList) { StringTokenizer st = new StringTokenizer(stringList, VALUE_SEPARATOR); List<String> list = new ArrayList<String>(); while (st.hasMoreElements()) { list.add(st.nextToken()); } return (String[]) list.toArray(new String[list.size()]); } /** * {@inheritDoc} */ @Override protected String createList(String[] items) { StringBuilder path = new StringBuilder(""); for (int i = 0; i < items.length; i++) { path.append(items[i]); path.append(VALUE_SEPARATOR); } return path.toString(); } protected abstract String getStorePath(String name); /** * {@inheritDoc} */ @Override protected void doStore() { try { File dir = new File(this.getStorePath("")); dir.mkdirs(); for (String name : this.namePathMap.keySet()) { File from = new File(this.namePathMap.get(name)); File to = new File(this.getStorePath(name)); FileUtils.copyFile(from, to); } } catch (IOException e) { Activator.showErrorDialog(ResourceString .getResourceString("error.read.file")); } super.doStore(); } private boolean contains(String name) { org.eclipse.swt.widgets.List list = this.getListControl(this.parent); String[] items = list.getItems(); for (String item : items) { if (name.equals(item)) { return true; } } return false; } /** * {@inheritDoc} */ @Override protected void doLoad() { org.eclipse.swt.widgets.List list = this.getListControl(this.parent); String s = getPreferenceStore().getString(getPreferenceName()); String[] array = parseString(s); Set<String> names = new HashSet<String>(); for (int i = 0; i < array.length; i++) { File file = new File(this.getStorePath(array[i])); if (file.exists() && !names.contains(array[i])) { list.add(array[i]); names.add(array[i]); } } } }