package org.eclipse.papyrus.infra.widgets.editors; import java.io.File; import java.util.ArrayList; import java.util.Arrays; import java.util.LinkedList; import java.util.List; import org.eclipse.core.resources.IFile; import org.eclipse.jface.window.Window; import org.eclipse.papyrus.infra.widgets.Activator; import org.eclipse.papyrus.infra.widgets.providers.WorkspaceContentProvider; import org.eclipse.papyrus.infra.widgets.selectors.NullSelector; import org.eclipse.papyrus.infra.widgets.selectors.ReferenceSelector; import org.eclipse.papyrus.infra.widgets.util.FileUtil; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.FileDialog; import org.eclipse.ui.model.WorkbenchLabelProvider; /** * A Widget for editing multi-valued Strings with File paths * The file paths may be absolute (FileSystem paths) or relative to the workspace (Workspace paths) * * @author Camille Letavernier */ public class MultipleStringFileEditor extends MultipleValueEditor { protected boolean allowBrowseWorkspace = true; protected boolean allowBrowseFileSystem = true; protected Button browseFileSystem; protected Button browseWorkspace; protected final List<String> filterNames; protected final List<String> filterExtensions; public static final String browseWorkspaceIcon = "icons/browse-workspace_12x12.png"; //$NON-NLS-1$ public static final String browseFileSystemIcon = "icons/browse-filesystem_12x12.png"; //$NON-NLS-1$ public MultipleStringFileEditor(Composite parent, int style) { super(parent, style, NullSelector.instance); setDirectCreation(true); filterNames = new LinkedList<String>(); filterExtensions = new LinkedList<String>(); } @Override protected void createListControls() { super.createListControls(); add.dispose(); edit.dispose(); browseFileSystem = createButton(Activator.getDefault().getImageFromPlugin(browseFileSystemIcon), "Browse file system"); browseWorkspace = createButton(Activator.getDefault().getImageFromPlugin(browseWorkspaceIcon), "Browse workspace"); browseWorkspace.moveAbove(remove); browseFileSystem.moveAbove(remove); } @Override public void setDirectCreation(boolean directCreation) { super.setDirectCreation(true); //Always true } @Override protected void updateControls() { remove.setEnabled(!readOnly); up.setEnabled(ordered && !readOnly); down.setEnabled(ordered && !readOnly); browseWorkspace.setEnabled(allowBrowseWorkspace && !readOnly); browseFileSystem.setEnabled(allowBrowseFileSystem && !readOnly); } public void allowBrowseWorkspace(boolean allowBrowseWorkspace) { this.allowBrowseWorkspace = allowBrowseWorkspace; } public void allowBrowseFileSystem(boolean allowBrowseFileSystem) { this.allowBrowseFileSystem = allowBrowseFileSystem; } /** * Handle events occuring on controls * * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent) * * @param e */ @Override public void widgetSelected(SelectionEvent e) { super.widgetSelected(e); if(e.widget == browseFileSystem) { browseFileSystem(); } else if(e.widget == browseWorkspace) { browseWorkspace(); } } protected void browseFileSystem() { // File file = FileUtil.getFile(text.getText()); FileDialog dialog = new FileDialog(getShell(), SWT.MULTI | SWT.OPEN); dialog.setFilterExtensions(filterExtensions.toArray(new String[filterExtensions.size()])); dialog.setFilterNames(filterNames.toArray(new String[filterNames.size()])); if(dialog.open() != null) { List<String> filePathList = new ArrayList<String>(modelProperty.size() + dialog.getFileNames().length); filePathList.addAll(modelProperty); for(String fileName : dialog.getFileNames()) { filePathList.add(dialog.getFilterPath() + File.separator + fileName); } modelProperty.clear(); modelProperty.addAll(filePathList); commit(); } } protected void browseWorkspace() { ReferenceSelector selector = new ReferenceSelector(); selector.setLabelProvider(WorkbenchLabelProvider.getDecoratingWorkbenchLabelProvider()); selector.setContentProvider(new WorkspaceContentProvider()); MultipleValueSelectorDialog dialog = new MultipleValueSelectorDialog(getShell(), selector); if(labelText != null) { dialog.setTitle(labelText); } dialog.setLabelProvider(WorkbenchLabelProvider.getDecoratingWorkbenchLabelProvider()); dialog.setOrdered(true); dialog.setUnique(true); selector.setUnique(true); int code = dialog.open(); if(code == Window.OK) { Object[] result = dialog.getResult(); if(result.length > 0) { List<String> filePathResult = new ArrayList<String>(result.length + modelProperty.size()); filePathResult.addAll(modelProperty); for(Object file : result) { if(file instanceof IFile) { filePathResult.add(FileUtil.getPath((IFile)file, false)); } } modelProperty.clear(); modelProperty.addAll(filePathResult); commit(); } } } public void setFilters(String[] filterExtensions, String[] filterNames) { if(filterExtensions.length != filterNames.length) { //This is a simple warning. Only valid filters will be retained. Activator.log.warn("FilterExtensions and FilterNames do not match"); } setFilterNames(getFilterLabels(filterNames, filterExtensions)); setFilterExtensions(filterExtensions); } protected String[] getFilterLabels(String[] filterNames, String[] filterExtensions) { int size = Math.min(filterNames.length, filterExtensions.length); String[] filters = new String[size]; for(int i = 0; i < size; i++) { filters[i] = filterNames[i] + " (" + filterExtensions[i] + ")"; } return filters; } public void setFilterExtensions(String[] filterExtensions) { this.filterExtensions.clear(); this.filterExtensions.addAll(Arrays.asList(filterExtensions)); } public void setFilterNames(String[] filterNames) { this.filterNames.clear(); this.filterNames.addAll(Arrays.asList(filterNames)); } }