/*******************************************************************************
* Copyright (c) 2010 Martin Schnabel <mb0@mb0.org>.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
******************************************************************************/
package org.axdt.common.preferences.fields;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.jface.preference.StringButtonFieldEditor;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.dialogs.ResourceListSelectionDialog;
public class ResourceFieldEditor extends StringButtonFieldEditor {
private IWorkspaceRoot workspaceroot;
private String[] extensions;
public ResourceFieldEditor(String key, String desc, Composite parent) {
init(key, desc);
createControl(parent);
workspaceroot = ResourcesPlugin.getWorkspace().getRoot();
}
@Override
protected String changePressed() {
IResource d = getResource();
if (d == null) {
return null;
}
return d.getFullPath().toPortableString();
}
private IResource getResource() {
ResourceListSelectionDialog dialog = new FilteredResourceSelectionDialog(getShell(), workspaceroot, IResource.FILE);
dialog.setTitle(getLabelText());
if (dialog.open() == Window.OK) {
Object[] files = dialog.getResult();
if (files.length > 0) {
return (IFile) files[0];
}
}
return null;
}
@Override
protected boolean checkState() {
IResource member = workspaceroot.findMember(getTextControl().getText());
if (member instanceof IFile) {
if (checkFileExtension(member.getFileExtension())) {
return true;
}
StringBuilder buf = new StringBuilder("Resource must have a ");
for (String ext:extensions)
buf.append(ext).append(" or ");
buf.replace(buf.length()-3, buf.length(), "extensions.");
showErrorMessage(buf.toString());
return false;
}
showErrorMessage("Resource does not exist.");
return false;
}
private boolean checkFileExtension(String ext) {
if (extensions == null|| extensions.length == 0)
return true;
for (String acExt:extensions)
if (acExt.equals(ext))
return true;
return false;
}
public void setFileExtensions(String[] extensions) {
this.extensions = extensions;
}
private class FilteredResourceSelectionDialog extends ResourceListSelectionDialog {
public FilteredResourceSelectionDialog(Shell shell,
IWorkspaceRoot root, int type) {
super(shell, root, type);
}
@Override
protected boolean select(IResource resource) {
return checkFileExtension(resource.getFileExtension());
}
}
}