/* Soot - a J*va Optimization Framework * Copyright (C) 2003 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.launching; import java.io.PrintStream; import org.eclipse.jface.text.*; import org.eclipse.ui.*; import ca.mcgill.sable.soot.*; import ca.mcgill.sable.soot.ui.*; /** * Document for SootOutputView */ public class SootDocument extends Document implements ISootOutputEventListener { private SootOutputView viewer; private int newStreamWriteEnd = 0; private int oldStreamWriteEnd = 0; private boolean viewShown = false; protected PrintStream consoleStream; public SootDocument() { consoleStream = new PrintStream(SootPlugin.getDefault().getConsole().newMessageStream()); } public void startUp() { SootPlugin.getDefault().addSootOutputEventListener(this); } public void handleSootOutputEvent(SootOutputEvent event) { if (!viewShown) { showSootOutputView(); notifySootOutputView(); getViewer().getTextViewer().setDocument(this); viewShown = true; } switch (event.getEventType()) { case ISootOutputEventConstants.SOOT_CLEAR_EVENT: clearText(); break; case ISootOutputEventConstants.SOOT_NEW_TEXT_EVENT: appendText(event.getTextToAppend()); break; default: break; } } private void notifySootOutputView() { IWorkbench workbench= PlatformUI.getWorkbench(); IWorkbenchWindow[] windows= workbench.getWorkbenchWindows(); for (int i = 0; i < windows.length; i++) { IWorkbenchWindow iWorkbenchWindow = windows[i]; IWorkbenchPage[] pages= iWorkbenchWindow.getPages(); for (int j = 0; j < pages.length; j++) { IWorkbenchPage iWorkbenchPage = pages[j]; IViewPart part= iWorkbenchPage.findView(ISootConstants.SOOT_OUTPUT_VIEW_ID); if (part == null) { IViewReference refs [] = iWorkbenchPage.getViewReferences(); } if (part instanceof SootOutputView) { setViewer((SootOutputView)part); this.addDocumentListener(getViewer()); } } } } private void clearText() { // set(new String()); // setNewStreamWriteEnd(0); // setOldStreamWriteEnd(0); // showSootOutputView(); SootPlugin.getDefault().getConsole().clearConsole(); } private void appendText(final String text) { update(new Runnable() { public void run() { // int appendedLength= text.length(); // setNewStreamWriteEnd(getOldStreamWriteEnd() + appendedLength); // replace0(getOldStreamWriteEnd(), 0, text); // setOldStreamWriteEnd(getNewStreamWriteEnd()); // getViewer().getTextViewer().setTopIndex(getNumberOfLines()); consoleStream.print(text); SootPlugin.getDefault().showConsole(); } }); } protected void replace0(int pos, int replaceLength, String text) { try { super.replace(pos, replaceLength, text); } catch (BadLocationException ble) { } } private void showSootOutputView() { IWorkbenchWindow window = SootPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow(); if (window != null) { IWorkbenchPage page= window.getActivePage(); if (page != null) { try { IViewPart sootOutputViewer = page.findView("ca.mcgill.sable.soot.ui.sootoutputview.view"); if(sootOutputViewer == null) { IWorkbenchPart activePart= page.getActivePart(); page.showView("ca.mcgill.sable.soot.ui.sootoutputview.view"); //restore focus stolen by the creation of the console page.activate(activePart); sootOutputViewer = page.findView("ca.mcgill.sable.soot.ui.sootoutputview.view"); } else { page.bringToTop(sootOutputViewer); } } catch (PartInitException pie) { System.out.println(pie.getMessage()); } } } } private void update(Runnable runnable) { if (getViewer().getTextViewer() != null && getViewer().getTextViewer().getControl() != null && getViewer().getControl().getDisplay() != null) { getViewer().getTextViewer().getControl().getDisplay().asyncExec(runnable); } } /** * Returns the viewer. * @return SootOutputView */ public SootOutputView getViewer() { return viewer; } /** * Sets the viewer. * @param viewer The viewer to set */ public void setViewer(SootOutputView viewer) { this.viewer = viewer; } /** * Returns the newStreamWriteEnd. * @return int */ public int getNewStreamWriteEnd() { return newStreamWriteEnd; } /** * Returns the oldStreamWriteEnd. * @return int */ public int getOldStreamWriteEnd() { return oldStreamWriteEnd; } /** * Sets the newStreamWriteEnd. * @param newStreamWriteEnd The newStreamWriteEnd to set */ public void setNewStreamWriteEnd(int newStreamWriteEnd) { this.newStreamWriteEnd = newStreamWriteEnd; } /** * Sets the oldStreamWriteEnd. * @param oldStreamWriteEnd The oldStreamWriteEnd to set */ public void setOldStreamWriteEnd(int oldStreamWriteEnd) { this.oldStreamWriteEnd = oldStreamWriteEnd; } }