/* Soot - a J*va Optimization Framework * Copyright (C) 2004 Jennifer Lhotak * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ package ca.mcgill.sable.soot.resources; import org.eclipse.ui.*; import org.eclipse.core.resources.*; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.jdt.core.*; import org.eclipse.jface.text.ITextOperationTarget; import org.eclipse.jface.text.source.SourceViewer; import org.eclipse.ui.*; import org.eclipse.ui.texteditor.AbstractTextEditor; import ca.mcgill.sable.soot.attributes.*; import ca.mcgill.sable.soot.editors.JimpleEditor; import ca.mcgill.sable.soot.ui.*; import ca.mcgill.sable.soot.*; import java.util.*; public class SootPartManager { private boolean updateForOpen; public void updatePart(IEditorPart part){ if (part == null) return; if (part instanceof JimpleEditor){ AbstractAttributesComputer aac = new JimpleAttributesComputer(); SootAttributesJimpleColorer sajc = new SootAttributesJimpleColorer(); SootAttrJimpleIconGenerator saji = new SootAttrJimpleIconGenerator(); SourceViewer viewer = (SourceViewer)((AbstractTextEditor)part).getAdapter(ITextOperationTarget.class); SootAttributesHandler handler = aac.getAttributesHandler((AbstractTextEditor)part); if (handler != null){ if (isUpdateForOpen() || handler.isUpdate()){ sajc.setEditorPart(part); sajc.setViewer(viewer); sajc.setHandler(handler); Thread cThread = new Thread(sajc); cThread.start(); saji.setHandler(handler); saji.setRec((IFile)aac.getRec()); Thread iThread = new Thread(saji); iThread.start(); handler.setUpdate(false); } } handleKeys(handler); handleTypes(handler, (IFile)aac.getRec()); } else if (part instanceof AbstractTextEditor){ IEditorInput input= ((AbstractTextEditor)part).getEditorInput(); IJavaElement jElem = (IJavaElement) ((IAdaptable) input).getAdapter(IJavaElement.class); if (!(jElem instanceof ICompilationUnit)) return; AbstractAttributesComputer aac = new JavaAttributesComputer(); SootAttributesJavaColorer sajc = new SootAttributesJavaColorer(); SootAttrJavaIconGenerator saji = new SootAttrJavaIconGenerator(); SourceViewer viewer = (SourceViewer)((AbstractTextEditor)part).getAdapter(ITextOperationTarget.class); SootAttributesHandler handler = aac.getAttributesHandler((AbstractTextEditor)part); if (handler != null){ if (isUpdateForOpen() || handler.isUpdate()){ sajc.setEditorPart(part); sajc.setViewer(viewer); sajc.setHandler(handler); Thread cThread = new Thread(sajc); cThread.start(); saji.setHandler(handler); saji.setRec((IFile)aac.getRec()); Thread iThread = new Thread(saji); iThread.start(); handler.setUpdate(false); } } handleKeys(handler); handleTypes(handler, (IFile)aac.getRec()); } setUpdateForOpen(false); } private void handleTypes(SootAttributesHandler handler, IFile file){ IWorkbenchPage page = SootPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getActivePage(); ArrayList types = computeTypes(handler); if (!types.isEmpty()){ IViewPart view = page.findView(ISootConstants.ANALYSIS_TYPES_VIEW_ID); try { if (view == null) { IWorkbenchPart activePart = page.getActivePart(); page.showView(ISootConstants.ANALYSIS_TYPES_VIEW_ID); //restore focus stolen by the creation of the console IViewPart shownPart = page.findView(ISootConstants.ANALYSIS_TYPES_VIEW_ID); if (shownPart != null){ ((AnalysisTypeView)shownPart).setFile(file); ((AnalysisTypeView)shownPart).setAllTypesChecked(handler.isShowAllTypes()); ((AnalysisTypeView)shownPart).setTypesChecked(handler.getTypesToShow()); ((AnalysisTypeView)shownPart).setInputTypes(types); } page.activate(activePart); } else { if (view != null){ ((AnalysisTypeView)view).setFile(file); ((AnalysisTypeView)view).setAllTypesChecked(handler.isShowAllTypes()); ((AnalysisTypeView)view).setTypesChecked(handler.getTypesToShow()); ((AnalysisTypeView)view).setInputTypes(types); } } } catch (PartInitException pie) { System.out.println(pie.getMessage()); } } } private ArrayList computeTypes(SootAttributesHandler handler){ ArrayList types = new ArrayList(); if ((handler != null) && (handler.getAttrList() != null)){ Iterator attrsIt = handler.getAttrList().iterator(); while (attrsIt.hasNext()){ SootAttribute sa = (SootAttribute)attrsIt.next(); Iterator typesIt = sa.getAnalysisTypes().iterator(); while (typesIt.hasNext()){ String val = (String)typesIt.next(); if (!types.contains(val)){ types.add(val); } } } } return types; } private void handleKeys(SootAttributesHandler handler){ // make a new view and put it in properties // area (bring to top if necessary - make list of keys IWorkbenchPage page = SootPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getActivePage(); IViewPart viewPart = SootPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getActivePage().findView(ISootConstants.ANALYSIS_KEY_VIEW_ID); try { if (viewPart == null) { IWorkbenchPart activePart = page.getActivePart(); page.showView(ISootConstants.ANALYSIS_KEY_VIEW_ID); //restore focus stolen by the creation of the console IViewPart shownPart = SootPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getActivePage().findView(ISootConstants.ANALYSIS_KEY_VIEW_ID); if (shownPart != null){ ((AnalysisKeyView)shownPart).setInputKeys(handler.getKeyList()); } page.activate(activePart); } else { if (viewPart != null){ ((AnalysisKeyView)viewPart).setInputKeys(handler.getKeyList()); } } } catch (PartInitException pie) { System.out.println(pie.getMessage()); } if (viewPart != null){ ((AnalysisKeyView)viewPart).setInputKeys(handler.getKeyList()); } } /** * @return */ public boolean isUpdateForOpen() { return updateForOpen; } /** * @param b */ public void setUpdateForOpen(boolean b) { updateForOpen = b; } }