package net.sourceforge.phpeclipse.views; /********************************************************************** Copyright (c) 2000, 2002 IBM Corp. and others. All rights reserved. This program and the accompanying materials are made available under the terms of the Common Public License v1.0 which accompanies this distribution, and is available at http://www.eclipse.org/legal/cpl-v10.html Contributors: IBM Corporation - Initial implementation Klaus Hartlage - www.eclipseproject.de **********************************************************************/ import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.StreamTokenizer; import java.io.StringReader; import java.util.ArrayList; import net.sourceforge.phpdt.internal.ui.PHPUiImages; import net.sourceforge.phpeclipse.PHPeclipsePlugin; import net.sourceforge.phpeclipse.actions.PHPActionMessages; import org.eclipse.core.resources.IFile; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IMenuListener; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.IToolBarManager; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.action.Separator; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.resource.JFaceResources; import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.Document; import org.eclipse.jface.text.TextViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.StyledText; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Menu; import org.eclipse.ui.IActionBars; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IFileEditorInput; import org.eclipse.ui.IWorkbenchActionConstants; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.part.ViewPart; import org.eclipse.ui.texteditor.ITextEditor; /** * The PHPConsole is used to display the output if you start MySQL/Apache * @see ViewPart */ public class PHPConsole extends ViewPart { public static final String CONSOLE_ID = "net.sourceforge.phpeclipse.views.phpconsoleview"; private int COMMAND_COMBO_SIZE = 10; private TextViewer fViewer = null; private Document fDocument = null; private StyledText fStyledText; private Combo fCommandCombo; // private Action goAction; private Action cutAction = new Action() { public void run() { fViewer.getTextWidget().cut(); } }; private Action copyAction = new Action() { public void run() { fStyledText.copy(); } }; // private Action pasteAction = new Action() { // public void run() { // fViewer.getTextWidget().paste(); // } // }; private Action selectAllAction = new Action() { public void run() { fStyledText.selectAll(); } }; private Action clearAction = new Action() { public void run() { fStyledText.setText(""); } }; /** * The constructor. */ public PHPConsole() { } /** * Insert the method's description here. * @see ViewPart#createPartControl */ public void createPartControl(Composite parent) { Composite container = new Composite(parent, SWT.NULL); // control = container; GridLayout layout = new GridLayout(); layout.marginWidth = 0; layout.marginHeight = 0; layout.verticalSpacing = 0; container.setLayout(layout); Composite navContainer = new Composite(container, SWT.NONE); layout = new GridLayout(); layout.numColumns = 2; layout.marginHeight = 1; navContainer.setLayout(layout); createCommandBar(navContainer); navContainer.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); fViewer = new TextViewer(container, SWT.WRAP | SWT.V_SCROLL | SWT.H_SCROLL); GridData viewerData = new GridData(GridData.FILL_BOTH); fViewer.getControl().setLayoutData(viewerData); fViewer.setEditable(false); fStyledText = fViewer.getTextWidget(); fStyledText.setFont(JFaceResources.getFontRegistry().get(JFaceResources.TEXT_FONT)); cutAction.setText("Cut"); copyAction.setText("Copy"); // pasteAction.setText("Paste"); selectAllAction.setText("Select All"); clearAction.setText("Clear PHP Console"); clearAction.setImageDescriptor(PHPUiImages.DESC_CLEAR); clearAction.setToolTipText("Clear PHP Console"); IActionBars bars = this.getViewSite().getActionBars(); bars.setGlobalActionHandler(IWorkbenchActionConstants.CUT, cutAction); bars.setGlobalActionHandler(IWorkbenchActionConstants.COPY, copyAction); // bars.setGlobalActionHandler(IWorkbenchActionConstants.PASTE, pasteAction); hookContextMenu(); // hookDoubleClickAction(); contributeToActionBars(); appendOutputText("This is the PHP console.\n"); appendOutputText("Type: \"php $f\" to run the current editor file.\n"); } private void createCommandBar(Composite parent) { Label addressLabel = new Label(parent, SWT.NONE); addressLabel.setText("Command:"); fCommandCombo = new Combo(parent, SWT.DROP_DOWN | SWT.BORDER); fCommandCombo.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { String text = fCommandCombo.getText(); // goAction.setEnabled(text.length() > 0); } }); fCommandCombo.addSelectionListener(new SelectionListener() { public void widgetSelected(SelectionEvent e) { String text = fCommandCombo.getItem(fCommandCombo.getSelectionIndex()); if (text.length() > 0) { fCommandCombo.setText(text); // executeCommand(text); } } public void widgetDefaultSelected(SelectionEvent e) { executeCommand(fCommandCombo.getText()); } }); GridData gd = new GridData(GridData.FILL_HORIZONTAL); fCommandCombo.setLayoutData(gd); // ToolBar toolbar = new ToolBar(parent, SWT.FLAT | SWT.HORIZONTAL); // toolBarManager = new ToolBarManager(toolbar); // makeActions(); // IToolBarManager localBar = // getViewSite().getActionBars().getToolBarManager(); // localBar.add(backwardAction); // localBar.add(forwardAction); } private void executeCommand(String command) { command.trim(); if (command.equals("")) { fCommandCombo.forceFocus(); return; } execute(command); fCommandCombo.forceFocus(); // add to Combo history String[] items = fCommandCombo.getItems(); int loc = -1; String normURL = command; for (int i = 0; i < items.length; i++) { String normItem = items[i]; if (normURL.equals(normItem)) { // match loc = i; break; } } if (loc != -1) { fCommandCombo.remove(loc); } fCommandCombo.add(command, 0); if (fCommandCombo.getItemCount() > COMMAND_COMBO_SIZE) { fCommandCombo.remove(fCommandCombo.getItemCount() - 1); } fCommandCombo.getParent().layout(true); } private void execute(String command) { ArrayList args = new ArrayList(); command = command.replace('\\', '§'); StreamTokenizer tokenizer = new StreamTokenizer(new StringReader(command)); tokenizer.resetSyntax(); tokenizer.whitespaceChars(0, ' '); tokenizer.wordChars('!', 255); tokenizer.quoteChar('"'); tokenizer.quoteChar('\''); int token; try { while ((token = tokenizer.nextToken()) != StreamTokenizer.TT_EOF) { if (token == StreamTokenizer.TT_WORD) { args.add(tokenizer.sval); } } } catch (IOException e) { // } String arg = ""; // replace variables in arguments IFile file = getFile(); if (file != null) { String fileLocation = file.getLocation().toString(); for (int i = 0; i < args.size(); i++) { arg = args.get(i).toString(); if (arg.equals("$f")) { //current php editor file if (File.separatorChar == '\\') { fileLocation = fileLocation.replace('/', '\\'); } args.set(i, fileLocation); } } } final IPreferenceStore store = PHPeclipsePlugin.getDefault().getPreferenceStore(); String arg0 = ""; String temp; StringBuffer commandBuffer = new StringBuffer(1024); // Program.launch(command); if (args.size() > 0) { arg0 = (String) args.get(0); arg0 = arg0.replace('§', '\\'); args.remove(0); if (arg0.equals("php")) { temp = store.getString(PHPeclipsePlugin.PHP_RUN_PREF); if (temp != null) { arg0 = temp; } } commandBuffer.append(arg0 + " "); } String[] stringArgs = new String[args.size()]; for (int i = 0; i < args.size(); i++) { arg = (String) args.get(i); arg = arg.replace('§', '\\'); stringArgs[i] = arg; commandBuffer.append(arg + " "); } commandBuffer.append("\n"); try { command = commandBuffer.toString(); write(command); Runtime runtime = Runtime.getRuntime(); // runs the command Process process = runtime.exec(command); //process.waitFor(); InputStream in = process.getInputStream(); String output = getStringFromStream(in); write(output); in.close(); // } catch (InterruptedException e) { // write(e.toString()); } catch (IOException e) { write(e.toString()); } } private void hookContextMenu() { MenuManager menuMgr = new MenuManager("#PopupMenu"); menuMgr.setRemoveAllWhenShown(true); menuMgr.addMenuListener(new IMenuListener() { public void menuAboutToShow(IMenuManager manager) { PHPConsole.this.fillContextMenu(manager); } }); Menu menu = menuMgr.createContextMenu(fViewer.getControl()); fViewer.getControl().setMenu(menu); getSite().registerContextMenu(menuMgr, fViewer); } private void contributeToActionBars() { IActionBars bars = getViewSite().getActionBars(); fillLocalPullDown(bars.getMenuManager()); fillLocalToolBar(bars.getToolBarManager()); } private void fillLocalPullDown(IMenuManager manager) { manager.add(cutAction); manager.add(copyAction); // manager.add(pasteAction); manager.add(selectAllAction); } private void fillContextMenu(IMenuManager manager) { manager.add(cutAction); manager.add(copyAction); // manager.add(pasteAction); manager.add(selectAllAction); // Other plug-ins can contribute there actions here manager.add(new Separator("Additions")); } private void fillLocalToolBar(IToolBarManager manager) { manager.add(clearAction); } /** * Insert the method's description here. * @see ViewPart#setFocus */ public void setFocus() { fCommandCombo.forceFocus(); } /** * Set the text for the viewer */ public void setOutputText(String text) { fDocument = new Document(text); fViewer.setDocument(fDocument); } public void appendOutputText(String text) { try { if (fDocument == null) { fDocument = new Document(text); fViewer.setDocument(fDocument); } else { fDocument.replace(fDocument.getLength(), 0, text); } } catch (BadLocationException e) { } // viewer.setDocument(document); } public static PHPConsole getInstance() { IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); PHPConsole console = (PHPConsole) page.findView(PHPConsole.CONSOLE_ID); if (PHPeclipsePlugin.getDefault().getPreferenceStore().getBoolean(PHPeclipsePlugin.SHOW_OUTPUT_IN_CONSOLE) == true) { try { page.showView(PHPConsole.CONSOLE_ID); if (console == null) { console = (PHPConsole) page.findView(PHPConsole.CONSOLE_ID); } } catch (PartInitException e) { PHPeclipsePlugin.getDefault().getLog().log( new Status( IStatus.ERROR, PHPeclipsePlugin.getPluginId(), 0, PHPActionMessages.getString("PHPStartApacheAction.consoleViewOpeningProblem"), e)); } } return console; } /** * Prints out the string represented by the string */ public synchronized void write(String output) { appendOutputText(output); } /** * Creates a string buffer from the given input stream */ public static String getStringFromStream(InputStream stream) throws IOException { StringBuffer buffer = new StringBuffer(); byte[] b = new byte[100]; int finished = 0; while (finished != -1) { finished = stream.read(b); if (finished != -1) { String current = new String(b, 0, finished); buffer.append(current); } } return buffer.toString(); } /** * Finds the file that's currently opened in the PHP Text Editor */ protected IFile getFile() { ITextEditor editor = PHPeclipsePlugin.getDefault().getTextEditor(); IEditorInput editorInput = null; if (editor != null) { editorInput = editor.getEditorInput(); } if (editorInput instanceof IFileEditorInput) return ((IFileEditorInput) editorInput).getFile(); // if nothing was found, which should never happen return null; } }