/* * Copyright (c) 2013 Data Harmonisation Panel * * All rights reserved. This program and the accompanying materials are made * available under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of the License, * or (at your option) any later version. * * You should have received a copy of the GNU Lesser General Public License * along with this distribution. If not, see <http://www.gnu.org/licenses/>. * * Contributors: * Data Harmonisation Panel <http://www.dhpanel.eu> */ package eu.esdihumboldt.hale.ui.io.source; import java.net.URI; import java.util.List; import java.util.Set; import javax.annotation.Nullable; import org.eclipse.core.runtime.content.IContentType; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.MenuItem; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.PlatformUI; import com.google.common.base.Predicate; import com.google.common.base.Predicates; import eu.esdihumboldt.hale.ui.common.CommonSharedImages; import eu.esdihumboldt.hale.ui.service.project.RecentProjectsMenu; import eu.esdihumboldt.hale.ui.service.project.RecentResources; import eu.esdihumboldt.hale.ui.util.io.URIFieldEditor; import eu.esdihumboldt.util.Pair; /** * Field editor for the {@link URLSource}. * * @author Simon Templer */ public class URLSourceURIFieldEditor extends URIFieldEditor { private Button historyButton; private Predicate<? super URI> filter; /** * @see URIFieldEditor#URIFieldEditor() */ public URLSourceURIFieldEditor() { super(); } /** * @see URIFieldEditor#URIFieldEditor(String, String, Composite) */ public URLSourceURIFieldEditor(String name, String labelText, Composite parent) { super(name, labelText, parent); } // recent resources support @Override protected void adjustForNumColumns(int numColumns) { ((GridData) getTextControl().getLayoutData()).horizontalSpan = numColumns - 1; } @Override protected void doFillIntoGrid(Composite parent, int numColumns) { super.doFillIntoGrid(parent, numColumns - 1); } @Override public Text getTextControl(Composite parent) { // ensure resource control is added before the text control historyButton = new Button(parent, SWT.PUSH | SWT.FLAT); historyButton.setToolTipText("Choose from recent URLs"); historyButton.setImage( CommonSharedImages.getImageRegistry().get(CommonSharedImages.IMG_HISTORY)); historyButton.setEnabled(false); return super.getTextControl(parent); } /** * Set a custom filter to apply to URIs. Should be called before any * {@link #setContentTypes(Set)} call. * * @param filter the filter */ public void setURIFilter(@Nullable Predicate<? super URI> filter) { this.filter = filter; } /** * Set the allowed content types and enable the history button if * applicable. * * @param types the supported content types */ public void setContentTypes(Set<IContentType> types) { RecentResources rr = PlatformUI.getWorkbench().getService(RecentResources.class); if (rr != null) { Predicate<URI> selectUris = new Predicate<URI>() { @Override public boolean apply(URI uri) { // exclude files return !"file".equals(uri.getScheme()); } }; if (filter != null) { selectUris = Predicates.and(selectUris, filter); } final List<Pair<URI, IContentType>> locations = rr.getRecent(types, selectUris); if (!locations.isEmpty()) { historyButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { Menu filesMenu = new Menu(historyButton); for (Pair<URI, IContentType> pair : locations) { final URI location = pair.getFirst(); final IContentType contentType = pair.getSecond(); try { MenuItem item = new MenuItem(filesMenu, SWT.PUSH); item.setText( RecentProjectsMenu.shorten(location.toString(), 80, 20)); item.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { getTextControl().setText(location.toString()); getTextControl().setFocus(); valueChanged(); onHistorySelected(location, contentType); } }); } catch (Exception e1) { // ignore } } Point histLoc = historyButton.getParent() .toDisplay(historyButton.getLocation()); filesMenu.setLocation(histLoc.x, histLoc.y + historyButton.getSize().y); filesMenu.setVisible(true); } }); historyButton.setEnabled(true); } } } /** * Called when an element from the recent resources was selected. * * @param location the location * @param contentType the content type */ protected void onHistorySelected(URI location, IContentType contentType) { // override me } @Override public int getNumberOfControls() { return super.getNumberOfControls() + 1; } }