/******************************************************************************* * Copyright (c) 2008, 2012 Obeo. * 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 * * Contributors: * Obeo - initial API and implementation *******************************************************************************/ package org.eclipse.emf.eef.runtime.ui.widgets; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.List; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.emf.ecore.util.FeatureMap; import org.eclipse.emf.edit.provider.IWrapperItemProvider; import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider; import org.eclipse.emf.eef.runtime.EEFRuntimePlugin; import org.eclipse.emf.eef.runtime.impl.utils.EEFUtils; import org.eclipse.emf.eef.runtime.ui.utils.EEFRuntimeUIMessages; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.model.WorkbenchContentProvider; import org.eclipse.ui.model.WorkbenchLabelProvider; /** * @author <a href="mailto:goulwen.lefur@obeo.fr">Goulwen Le Fur</a> */ public class ModelChooserDialog extends Dialog { private TreeViewer workspaceViewer; protected String modelExtension; protected IFile selectedModel; public ModelChooserDialog(String modelExtension) { super(Display.getDefault().getActiveShell()); this.modelExtension = modelExtension; setShellStyle(SWT.CLOSE | SWT.TITLE | SWT.BORDER | SWT.APPLICATION_MODAL | SWT.RESIZE); } public Shell getShell() { Shell s = super.getShell(); // Rectangle r = s.getBounds(); // s.setBounds(-1, -1, 500, 500); s.setText(EEFRuntimeUIMessages.ModelChooserDialog_title); return s; } protected Control createDialogArea(Composite parent) { Composite container = new Composite(parent, SWT.NONE); GridData containerData = new GridData(GridData.FILL_BOTH); container.setLayoutData(containerData); GridLayout containerLayout = new GridLayout(); container.setLayout(containerLayout); Label label = new Label(container, SWT.NONE); label.setText(EEFRuntimeUIMessages.ModelChooserDialog_choose_model); workspaceViewer = new TreeViewer(container); workspaceViewer.getTree().setLayoutData(new GridData(GridData.FILL_BOTH)); if (EEFUtils.isBundleLoaded("org.eclipse.ui.ide")) //$NON-NLS-1$ workspaceViewer.setContentProvider(new WorkbenchContentProvider()); else workspaceViewer.setContentProvider(new AdapterFactoryContentProvider(EEFRuntimePlugin .getDefault().getAdapterFactory())); workspaceViewer.setLabelProvider(new WorkbenchLabelProvider()); workspaceViewer.addFilter(new ViewerFilter() { /* * (non-Javadoc) * @see org.eclipse.jface.viewers.ViewerFilter#select(org.eclipse.jface .viewers.Viewer, * java.lang.Object, java.lang.Object) */ public boolean select(Viewer viewer, Object parentElement, Object element) { return valid(viewer, parentElement, element); } }); workspaceViewer.setInput(ResourcesPlugin.getWorkspace().getRoot()); workspaceViewer.addSelectionChangedListener(new OkButtonEnabler()); workspaceViewer.addDoubleClickListener(new IDoubleClickListener() { public void doubleClick(DoubleClickEvent event) { okPressed(); } }); return container; } /** * Cette methode filtre les dossiers ou projets ouverts qui contiennent des repertoires possedant des * modeles. * * @param p_viewer * @param p_parentElement * @param p_element * L'element en cours dans le Treeview. * @return */ protected boolean valid(final Viewer p_viewer, final Object p_parentElement, final Object p_element) { boolean retour = false; try { if (p_element instanceof IProject && ((IProject)p_element).isOpen() && !getFiles((IContainer)p_element).isEmpty()) { retour = true; } else if (p_element instanceof IFolder && !getFiles((IContainer)p_element).isEmpty()) { retour = true; } else if (p_element instanceof IFile && ((IFile)p_element).getFileExtension().equalsIgnoreCase(modelExtension)) { retour = true; } } catch (final Exception p_exception) { p_exception.printStackTrace(); } return retour; } /** * Cette methode rend la liste des modeles donnees presents dans un conteneur. * * @param p_container * Le conteneur de ressources * @return La liste des modeles donnees de ce conteneur. * @throws CoreException */ private Collection<IResource> getFiles(final IContainer p_container) throws CoreException { List<IResource> files = new ArrayList<IResource>(); List<IContainer> folders = new ArrayList<IContainer>(); IResource children[] = p_container.members(); for (int i = 0; i < children.length; i++) { IResource child = children[i]; int childType = child.getType(); if (childType == IResource.FILE && child.getFileExtension() != null && child.getFileExtension().equalsIgnoreCase(modelExtension)) { files.add(child); } else if (childType == IResource.FOLDER && !child.getName().startsWith(".")) { //$NON-NLS-1$ folders.add((IContainer)child); } } Iterator<IContainer> iter = folders.iterator(); while (iter.hasNext()) { files.addAll(getFiles(iter.next())); } return files; } protected void createButtonsForButtonBar(Composite parent) { super.createButtonsForButtonBar(parent); setOkButtonEnabled(false); } /** */ protected void setOkButtonEnabled(boolean enabled) { getButton(IDialogConstants.OK_ID).setEnabled(enabled); } protected class OkButtonEnabler implements ISelectionChangedListener { public void selectionChanged(SelectionChangedEvent event) { if (event.getSelection() instanceof IStructuredSelection) { IStructuredSelection selection = (IStructuredSelection)event.getSelection(); if (selection.size() == 1) { Object selectedElement = selection.getFirstElement(); if (selectedElement instanceof IWrapperItemProvider) { selectedElement = ((IWrapperItemProvider)selectedElement).getValue(); } if (selectedElement instanceof FeatureMap.Entry) { selectedElement = ((FeatureMap.Entry)selectedElement).getValue(); } if (selectedElement instanceof IFile) { IFile file = (IFile)selectedElement; String fileExtension = file.getFileExtension().toString(); if (fileExtension.equals(modelExtension)) { setOkButtonEnabled(true); selectedModel = file; return; } } } } selectedModel = null; setOkButtonEnabled(false); } } public IFile getSelectedModel() { return selectedModel; } }