/*- * Copyright © 2009 Diamond Light Source Ltd. * * This file is part of GDA. * * GDA is free software: you can redistribute it and/or modify it under the * terms of the GNU General Public License version 3 as published by the Free * Software Foundation. * * GDA 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 GDA. If not, see <http://www.gnu.org/licenses/>. */ package uk.ac.gda.ui.content; import java.io.File; import java.io.FileFilter; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.eclipse.jface.fieldassist.IContentProposal; import org.eclipse.jface.fieldassist.IContentProposalProvider; /** * File proposals. You must set the proposal adapter to replace if using this: * * <code> * <p> FileContentProposalProvider prov = new FileContentProposalProvider();<br> ContentProposalAdapter ad = new ContentProposalAdapter(filePath, new TextContentAdapter(), prov, null, null);<br> ad.setProposalAcceptanceStyle(<b>ContentProposalAdapter.PROPOSAL_REPLACE</b>);<br> </p> </code> * * @author Matthew Gerring * */ public class FileContentProposalProvider implements IContentProposalProvider { private class FilenameChecker implements FileFilter { @Override public boolean accept(File file) { if (file == null) return true; if (file.isDirectory()) return true; if (filterExtensionProv==null) return true; final String [] filters = filterExtensionProv.getFilterExtensions(); if (filters==null) return true; for (int i = 0; i < filters.length; i++) { String filter = filters[i].replace(".", "\\."); filter = filters[i].replace("*", ".*"); if (file.getName().matches(filter)) return true; } return false; } } private IFilterExtensionProvider filterExtensionProv; private IContentProposal[] currentProposals; public int getSize() { return currentProposals!=null ? currentProposals.length : -1; } @Override public IContentProposal[] getProposals(String contents, int position) { final File dir = getDirectory(contents, position); if (dir == null) return new IContentProposal[0]; IContentProposal[] ret = getProposals(contents, dir); if (ret == null) return new IContentProposal[0]; return ret; } public String getFirstPath() { return currentProposals!=null ? currentProposals[0].getContent() : null; } private IContentProposal[] getProposals(String existing, File dir) { final File [] fa = dir.listFiles(new FilenameChecker()); if (fa == null) return null; List<IContentProposal> ret = new ArrayList<IContentProposal>(fa.length); //ret.add(new FileContentProposal(dir)); for (int i = 0; i < fa.length; i++) { final File file = fa[i]; try { final String path = file.getCanonicalPath(); final int index = path.indexOf(existing); if (index!=0) continue; } catch (IOException e) { continue; } ret.add(new FileContentProposal(file)); } if (ret.isEmpty()) return null; this.currentProposals = ret.toArray(new IContentProposal[ret.size()]); return currentProposals; } private File getDirectory(String contents, int position) { if (contents==null) return null; if (position>-1) contents = contents.substring(0,position); int index = contents.lastIndexOf('/'); if (index<0) index = contents.lastIndexOf('\\'); if (index>-1)contents = contents.substring(0,index); return new File(contents); } class FileContentProposal implements IContentProposal { private final File file; FileContentProposal(final File file) { this.file = file; } @Override public String getContent() { return getLabel(); } @Override public int getCursorPosition() { return getLabel().length(); } @Override public String getDescription() { //return FileUtils.getSystemInfo(file); return null; } @Override public String getLabel() { return file.getAbsolutePath(); } } /** * @return Returns the filterExtensionProv. */ public IFilterExtensionProvider getFilterExtensionProv() { return filterExtensionProv; } /** * @param filterExtensionProv The filterExtensionProv to set. */ public void setFilterExtensionProv(IFilterExtensionProvider filterExtensionProv) { this.filterExtensionProv = filterExtensionProv; } }