/* * #%~ * org.overture.ide.plugins.poviewer * %% * 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.plugins.poviewer.view; import java.util.List; import org.eclipse.core.resources.IFile; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.jface.action.Action; import org.eclipse.jface.viewers.ColumnWeightData; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.ITableLabelProvider; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.TableLayout; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.ui.ISelectionListener; import org.eclipse.ui.IViewPart; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.part.ViewPart; import org.eclipse.ui.progress.UIJob; import org.overture.ide.core.ElementChangedEvent; import org.overture.ide.core.ElementChangedEvent.DeltaType; import org.overture.ide.core.IElementChangedListener; import org.overture.ide.core.IVdmElement; import org.overture.ide.core.IVdmElementDelta; import org.overture.ide.core.IVdmModel; import org.overture.ide.core.VdmCore; import org.overture.ide.core.resources.IVdmProject; import org.overture.ide.plugins.poviewer.IPoviewerConstants; import org.overture.ide.plugins.poviewer.PoGeneratorUtil; import org.overture.ide.ui.utility.EditorUtility; import org.overture.pog.obligation.ProofObligation; import org.overture.pog.pub.IProofObligation; public class PoOverviewTableView extends ViewPart implements ISelectionListener { protected TableViewer viewer; protected Action doubleClickAction; protected Display display = Display.getCurrent(); protected IVdmProject project; protected class ViewContentProvider implements IStructuredContentProvider { public void inputChanged(Viewer v, Object oldInput, Object newInput) { } public void dispose() { } public Object[] getElements(Object inputElement) { if (inputElement instanceof List) { @SuppressWarnings("rawtypes") List list = (List) inputElement; return list.toArray(); } return new Object[0]; } } class ViewLabelProvider extends LabelProvider implements ITableLabelProvider { public void resetCounter() { count = 0; } private Integer count = 0; public String getColumnText(Object element, int columnIndex) { ProofObligation data = (ProofObligation) element; String columnText; switch (columnIndex) { case 0: count++; columnText = new Integer(data.number).toString();// count.toString(); break; case 1: if (!data.getLocation().getModule().equals("DEFAULT")) columnText = data.getLocation().getModule() + "`" + data.name; else columnText = data.name; break; case 2: columnText = data.kind.toString(); break; default: columnText = "not set"; } return columnText; } @Override public Image getColumnImage(Object element, int columnIndex) { return null; } } private IElementChangedListener vdmlistner = new IElementChangedListener() { @Override public void elementChanged(ElementChangedEvent event) { if (event.getType() == DeltaType.POST_RECONCILE) { if (event.getDelta().getKind() == IVdmElementDelta.F_TYPE_CHECKED) { final IVdmElement source = event.getDelta().getElement(); final UIJob showJob = new UIJob("Generating Proof Obligations") { @Override public IStatus runInUIThread(IProgressMonitor monitor) { if (source instanceof IVdmModel) { IVdmModel castSource = (IVdmModel) source; IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); if (!page.getPerspective().getId().equals(IPoviewerConstants.ProofObligationPerspectiveId)) { return new Status(IStatus.OK, "org.overture.ide.plugins.poviewer", "Ok"); } PoGeneratorUtil util = new PoGeneratorUtil( display.getActiveShell(), page .getActivePart().getSite()); if (!util.isPoggedModel(castSource)){ return new Status(IStatus.OK, "org.overture.ide.plugins.poviewer", "Ok"); } util.generate(castSource); System.out.println("built something"); } if (viewer != null && viewer.getControl() != null && viewer.getControl().getDisplay() != null) viewer.getControl().getDisplay() .asyncExec(new Runnable() { /* * (non-Javadoc) * * @see java.lang.Runnable#run() */ public void run() { if (!viewer.getControl() .isDisposed()) { viewer.refresh(); } } }); return new Status(IStatus.OK, "org.overture.ide.plugins.poviewer", "Ok"); } }; showJob.schedule(); } } } }; /** * The constructor. */ public PoOverviewTableView() { VdmCore.addElementChangedListener(vdmlistner); } @Override public void dispose() { super.dispose(); VdmCore.removeElementChangedListener(vdmlistner); } /** * This is a callback that will allow us to create the viewer and initialize * it. */ @Override public void createPartControl(Composite parent) { viewer = new TableViewer(parent, SWT.FULL_SELECTION | SWT.H_SCROLL | SWT.V_SCROLL); // test setup columns... TableLayout layout = new TableLayout(); layout.addColumnData(new ColumnWeightData(20, true)); layout.addColumnData(new ColumnWeightData(30, true)); layout.addColumnData(new ColumnWeightData(50, false)); viewer.getTable().setLayout(layout); viewer.getTable().setLinesVisible(true); viewer.getTable().setHeaderVisible(true); viewer.getTable().setSortDirection(SWT.NONE); viewer.setSorter(null); TableColumn column01 = new TableColumn(viewer.getTable(), SWT.LEFT); column01.setText("No."); column01.setToolTipText("No."); TableColumn column = new TableColumn(viewer.getTable(), SWT.LEFT); column.setText("PO Name"); column.setToolTipText("PO Name"); TableColumn column2 = new TableColumn(viewer.getTable(), SWT.LEFT); column2.setText("Type"); column2.setToolTipText("Show Type"); viewer.setContentProvider(new ViewContentProvider()); viewer.setLabelProvider(new ViewLabelProvider()); makeActions(); hookDoubleClickAction(); viewer.addSelectionChangedListener(new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent event) { Object first = ((IStructuredSelection) event.getSelection()) .getFirstElement(); if (first instanceof ProofObligation) { try { IViewPart v = getSite().getPage().showView( IPoviewerConstants.PoTableViewId); if (v instanceof PoTableView) ((PoTableView) v).setDataList(project, (ProofObligation) first); } catch (PartInitException e) { e.printStackTrace(); } } } }); } protected void makeActions() { doubleClickAction = new Action() { @Override public void run() { ISelection selection = viewer.getSelection(); Object obj = ((IStructuredSelection) selection) .getFirstElement(); if (obj instanceof ProofObligation) { gotoDefinition((ProofObligation) obj); // showMessage(((ProofObligation) obj).toString()); } } private void gotoDefinition(ProofObligation po) { IFile file = project.findIFile(po.getLocation().getFile()); if (IVdmProject.externalFileContentType.isAssociatedWith(file .getName())) { EditorUtility.gotoLocation( IPoviewerConstants.ExternalEditorId, file, po.getLocation(), po.name); } else { EditorUtility.gotoLocation(file, po.getLocation(), po.name); } } }; } protected void hookDoubleClickAction() { viewer.addDoubleClickListener(new IDoubleClickListener() { public void doubleClick(DoubleClickEvent event) { doubleClickAction.run(); } }); } // private void showMessage(String message) // { // MessageDialog.openInformation( // viewer.getControl().getShell(), // "PO Test", // message); // } /** * Passing the focus request to the viewer's control. */ @Override public void setFocus() { viewer.getControl().setFocus(); } public void selectionChanged(IWorkbenchPart part, ISelection selection) { if (selection instanceof IStructuredSelection && part instanceof PoOverviewTableView) { Object first = ((IStructuredSelection) selection).getFirstElement(); if (first instanceof ProofObligation) { try { IViewPart v = part .getSite() .getPage() .showView( "org.overture.ide.plugins.poviewer.views.PoTableView"); if (v instanceof PoTableView) ((PoTableView) v).setDataList(project, (ProofObligation) first); } catch (PartInitException e) { e.printStackTrace(); } } } } public void refreshList() { display.asyncExec(new Runnable() { public void run() { viewer.refresh(); } }); } public void setDataList(final IVdmProject project, final List<IProofObligation> data) { this.project = project; display.asyncExec(new Runnable() { public void run() { if (viewer.getLabelProvider() instanceof ViewLabelProvider) ((ViewLabelProvider) viewer.getLabelProvider()) .resetCounter(); // this // is // needed // to // reset // the // numbering viewer.setInput(data); for (TableColumn col : viewer.getTable().getColumns()) { col.pack(); } } }); } }