/* * #%~ * org.overture.ide.ui * %% * Copyright (C) 2008 - 2014 Overture * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program 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 this program. If not, see * <http://www.gnu.org/licenses/gpl-3.0.html>. * #~% */ package org.overture.ide.ui.property; import java.util.List; import java.util.Vector; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.ITreeSelection; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerComparator; import org.eclipse.jface.window.Window; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.ui.IWorkbenchPropertyPage; import org.eclipse.ui.dialogs.ElementTreeSelectionDialog; import org.eclipse.ui.dialogs.PropertyPage; import org.eclipse.ui.internal.WorkbenchPlugin; import org.eclipse.ui.model.BaseWorkbenchContentProvider; import org.eclipse.ui.model.WorkbenchLabelProvider; import org.overture.ide.core.resources.IVdmProject; import org.overture.ide.core.resources.ModelBuildPath; import org.overture.ide.ui.VdmUIPlugin; import org.overture.ide.ui.utility.VdmTypeCheckerUi; @SuppressWarnings("restriction") public class VdmBuildPathPropertyPage extends PropertyPage implements IWorkbenchPropertyPage { private static class ModelPathContentProvider implements ITreeContentProvider { public Object[] getChildren(Object parentElement) { return null; } public Object getParent(Object element) { return null; } public boolean hasChildren(Object element) { return false; } @SuppressWarnings("rawtypes") public Object[] getElements(Object inputElement) { if(inputElement instanceof ModelBuildPath) { return ((ModelBuildPath)inputElement).getModelSrcPaths().toArray(); } if (inputElement instanceof List) { return ((List) inputElement).toArray(); } return new Object[] {}; } public void dispose() { } public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { } } ModelBuildPath modelpath = null; TreeViewer tree = null; // List<IContainer> data = null; @Override protected Control createContents(Composite parent) { Composite myComposite = new Composite(parent, SWT.NONE); GridData gd = new GridData(GridData.FILL_HORIZONTAL); myComposite.setLayoutData(gd); GridLayout layout = new GridLayout(); layout.makeColumnsEqualWidth = false; layout.numColumns = 2; myComposite.setLayout(layout); // FillLayout layout = new FillLayout(); // // layout.type = SWT.VERTICAL; // myComposite.setLayout(layout); Composite myCompositeTree = new Composite(myComposite, SWT.NONE); FillLayout layout1 = new FillLayout(); layout1.type = SWT.VERTICAL; myCompositeTree.setLayout(layout1); tree = new TreeViewer(myCompositeTree, SWT.BORDER); gd = new GridData(GridData.FILL_HORIZONTAL | GridData.FILL_VERTICAL); myCompositeTree.setLayoutData(gd); IProject project = getSelectedProject(); // modelpath = new ModelBuildPath((IVdmProject) project.getAdapter(IVdmProject.class)); // data = modelpath.getModelSrcPaths(); modelpath =((IVdmProject) project.getAdapter(IVdmProject.class)).getModelBuildPath(); tree.setLabelProvider(new WorkbenchLabelProvider()); tree.setContentProvider(new ModelPathContentProvider()); tree.setInput(modelpath); Button addFolderButtom = createPushButton(myComposite, "Add...", null); gd = new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_BEGINNING); addFolderButtom.setLayoutData(gd); addFolderButtom.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { class SrcContentProvider extends BaseWorkbenchContentProvider { @Override public boolean hasChildren(Object element) { if (element instanceof IProject || element instanceof IFolder) { return super.hasChildren(element); } return false; } @Override public Object[] getElements(Object element) { List<IFolder> elements = new Vector<IFolder>(); Object[] arr = super.getElements(element); if (arr != null) { for (Object object : arr) { if (// object instanceof IFile || object instanceof IFolder) { elements.add((IFolder) object); } } return elements.toArray(); } return null; } @Override public Object[] getChildren(Object element) { List<IFolder> elements = new Vector<IFolder>(); Object[] arr = super.getChildren(element); if (arr != null) { for (Object object : arr) { if (// object instanceof IFile || object instanceof IFolder) { elements.add((IFolder) object); } } return elements.toArray(); } return null; } } ; ElementTreeSelectionDialog dialog = new ElementTreeSelectionDialog(getShell(), new WorkbenchLabelProvider(), new SrcContentProvider()); dialog.setTitle("Select source folder"); dialog.setMessage("Select a source folder:"); dialog.setComparator(new ViewerComparator()); dialog.setInput(getSelectedProject()); if (dialog.open() == Window.OK) { if (dialog.getFirstResult() != null // && dialog.getFirstResult() instanceof IProject // && ((IProject) dialog.getFirstResult()).getAdapter(IVdmProject.class) != null) ) { Object o = dialog.getFirstResult(); if (o instanceof IContainer) { IContainer source = (IContainer) o; // if (!data.contains(source)) // { modelpath.add(source); // data.add(source); tree.refresh(); // } } // fScenarioText.setText(((IFile) dialog.getFirstResult()).getProjectRelativePath().toString()); } } } }); addFolderButtom.setEnabled(false); return myComposite; } @SuppressWarnings( { "deprecation" }) public static IProject getSelectedProject() { ISelection selectedItem = WorkbenchPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getActivePage().getSelection(); IProject selectedProject = null; if (selectedItem instanceof ITreeSelection) { ITreeSelection selection = (ITreeSelection) selectedItem; if (selection.getPaths().length > 0) { Object project = selection.getPaths()[0].getFirstSegment(); if (project instanceof IProject) selectedProject = (IProject) project; } } else if (selectedItem instanceof IStructuredSelection) { IStructuredSelection selection = (IStructuredSelection) selectedItem; if (selection.getFirstElement() instanceof IProject) selectedProject = (IProject) selection.getFirstElement(); } return selectedProject; } /** * Creates and returns a new push button with the given label and/or image. * * @param parent * parent control * @param label * button label or <code>null</code> * @param image * image of <code>null</code> * @return a new push button */ public static Button createPushButton(Composite parent, String label, Image image) { Button button = new Button(parent, SWT.PUSH); button.setFont(parent.getFont()); if (image != null) { button.setImage(image); } if (label != null) { button.setText(label); } GridData gd = new GridData(); button.setLayoutData(gd); return button; } @Override public boolean performOk() { if (modelpath != null) { try { modelpath.save(); // modelpath.save(data, modelpath.getOutput()); IVdmProject vdmProject = (IVdmProject) getSelectedProject().getAdapter(IVdmProject.class); VdmTypeCheckerUi.typeCheck(getShell(), vdmProject); } catch (CoreException e) { VdmUIPlugin.log("Faild to save model path changed", e); } return true; } return false; } }