fixed parser bug;
[phpeclipse.git] / net.sourceforge.phpeclipse / src / net / sourceforge / phpeclipse / views / PHPConsole.java
1 package net.sourceforge.phpeclipse.views;
2
3 /**********************************************************************
4 Copyright (c) 2000, 2002 IBM Corp. and others.
5 All rights reserved. This program and the accompanying materials
6 are made available under the terms of the Common Public License v1.0
7 which accompanies this distribution, and is available at
8 http://www.eclipse.org/legal/cpl-v10.html
9
10 Contributors:
11     IBM Corporation - Initial implementation
12     Klaus Hartlage - www.eclipseproject.de
13 **********************************************************************/
14
15 import java.io.BufferedReader;
16 import java.io.IOException;
17 import java.io.InputStream;
18 import java.io.InputStreamReader;
19
20 import net.sourceforge.phpdt.internal.ui.PHPUiImages;
21 import net.sourceforge.phpeclipse.PHPeclipsePlugin;
22 import net.sourceforge.phpeclipse.actions.PHPActionMessages;
23
24 import org.eclipse.core.runtime.IStatus;
25 import org.eclipse.core.runtime.Status;
26 import org.eclipse.jface.action.Action;
27 import org.eclipse.jface.action.IMenuListener;
28 import org.eclipse.jface.action.IMenuManager;
29 import org.eclipse.jface.action.IToolBarManager;
30 import org.eclipse.jface.action.MenuManager;
31 import org.eclipse.jface.action.Separator;
32 import org.eclipse.jface.resource.JFaceResources;
33 import org.eclipse.jface.text.BadLocationException;
34 import org.eclipse.jface.text.Document;
35 import org.eclipse.jface.text.TextViewer;
36 import org.eclipse.swt.SWT;
37 import org.eclipse.swt.custom.StyledText;
38 import org.eclipse.swt.layout.GridData;
39 import org.eclipse.swt.widgets.Composite;
40 import org.eclipse.swt.widgets.Menu;
41 import org.eclipse.ui.IActionBars;
42 import org.eclipse.ui.IWorkbenchActionConstants;
43 import org.eclipse.ui.IWorkbenchPage;
44 import org.eclipse.ui.PartInitException;
45 import org.eclipse.ui.part.ViewPart;
46
47 /**
48  * The PHPConsole is used to display the output if you start MySQL/Apache
49  * @see ViewPart
50  */
51 public class PHPConsole extends ViewPart {
52
53   public static final String CONSOLE_ID =
54     "net.sourceforge.phpeclipse.views.phpconsoleview";
55   private int COMMAND_COMBO_SIZE = 10;
56
57   private TextViewer fViewer = null;
58   private Document fDocument = null;
59   private StyledText fStyledText;
60   // private Combo fCommandCombo;
61   //  private ProcessOutputWriter consoleOut;
62   //  private ProcessOutputWriter consoleErr;
63
64   // private Action goAction;
65
66   private Action cutAction = new Action() {
67     public void run() {
68       fViewer.getTextWidget().cut();
69     }
70   };
71   private Action copyAction = new Action() {
72     public void run() {
73       fStyledText.copy();
74     }
75   };
76   //  private Action pasteAction = new Action() {
77   //    public void run() {
78   //      fViewer.getTextWidget().paste();
79   //    }
80   //  };
81   private Action selectAllAction = new Action() {
82     public void run() {
83       fStyledText.selectAll();
84     }
85   };
86   private Action clearAction = new Action() {
87     public void run() {
88       fStyledText.setText("");
89     }
90   };
91   /**
92    * The constructor.
93    */
94   public PHPConsole() {
95   }
96
97   /**
98    * Insert the method's description here.
99    * @see ViewPart#createPartControl
100    */
101   public void createPartControl(Composite parent) {
102     //    Composite container = new Composite(parent, SWT.NULL);
103     //    //   control = container;
104     //    GridLayout layout = new GridLayout();
105     //    layout.marginWidth = 0;
106     //    layout.marginHeight = 0;
107     //    layout.verticalSpacing = 0;
108     //    container.setLayout(layout);
109     //    Composite navContainer = new Composite(container, SWT.NONE);
110     //    layout = new GridLayout();
111     //    layout.numColumns = 2;
112     //    layout.marginHeight = 1;
113     //    navContainer.setLayout(layout);
114     //    createCommandBar(navContainer);
115     //    navContainer.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
116
117     fViewer = new TextViewer(parent, SWT.WRAP | SWT.V_SCROLL | SWT.H_SCROLL);
118     GridData viewerData = new GridData(GridData.FILL_BOTH);
119     fViewer.getControl().setLayoutData(viewerData);
120     fViewer.setEditable(false);
121
122     fStyledText = fViewer.getTextWidget();
123     fStyledText.setFont(
124       JFaceResources.getFontRegistry().get(JFaceResources.TEXT_FONT));
125
126     cutAction.setText("Cut");
127     copyAction.setText("Copy");
128     //   pasteAction.setText("Paste");
129     selectAllAction.setText("Select All");
130     clearAction.setText("Clear PHP Console");
131     clearAction.setImageDescriptor(PHPUiImages.DESC_CLEAR);
132     clearAction.setToolTipText("Clear PHP Console");
133
134     IActionBars bars = this.getViewSite().getActionBars();
135     bars.setGlobalActionHandler(IWorkbenchActionConstants.CUT, cutAction);
136     bars.setGlobalActionHandler(IWorkbenchActionConstants.COPY, copyAction);
137     //  bars.setGlobalActionHandler(IWorkbenchActionConstants.PASTE, pasteAction);
138
139     hookContextMenu();
140     //  hookDoubleClickAction();
141     contributeToActionBars();
142
143     //    appendOutputText("This is the PHP console.\n");
144     //    appendOutputText("Type: \"php $f\" to run the current editor file.\n");
145
146   }
147
148   private void createCommandBar(Composite parent) {
149     //    Label addressLabel = new Label(parent, SWT.NONE);
150     //    addressLabel.setText("Command:");
151
152     //    fCommandCombo = new Combo(parent, SWT.DROP_DOWN | SWT.BORDER);
153     //    fCommandCombo.addModifyListener(new ModifyListener() {
154     //      public void modifyText(ModifyEvent e) {
155     //        String text = fCommandCombo.getText();
156     //        //       goAction.setEnabled(text.length() > 0);
157     //      }
158     //    });
159     //    fCommandCombo.addSelectionListener(new SelectionListener() {
160     //      public void widgetSelected(SelectionEvent e) {
161     //        String text = fCommandCombo.getItem(fCommandCombo.getSelectionIndex());
162     //        if (text.length() > 0) {
163     //          fCommandCombo.setText(text);
164     //          //    executeCommand(text);
165     //        }
166     //      }
167     //      public void widgetDefaultSelected(SelectionEvent e) {
168     //        executeCommand(fCommandCombo.getText());
169     //      }
170     //    });
171     GridData gd = new GridData(GridData.FILL_HORIZONTAL);
172     //  fCommandCombo.setLayoutData(gd);
173   }
174
175   //  private void executeCommand(String command) {
176   //    command.trim();
177   //    if (command.equals("")) {
178   //      fCommandCombo.forceFocus();
179   //      return;
180   //    }
181   //    execute(command);
182   //
183   //    fCommandCombo.forceFocus();
184   //    // add to Combo history
185   //    String[] items = fCommandCombo.getItems();
186   //    int loc = -1;
187   //    String normURL = command;
188   //    for (int i = 0; i < items.length; i++) {
189   //      String normItem = items[i];
190   //      if (normURL.equals(normItem)) {
191   //        // match 
192   //        loc = i;
193   //        break;
194   //      }
195   //    }
196   //    if (loc != -1) {
197   //      fCommandCombo.remove(loc);
198   //    }
199   //    fCommandCombo.add(command, 0);
200   //    if (fCommandCombo.getItemCount() > COMMAND_COMBO_SIZE) {
201   //      fCommandCombo.remove(fCommandCombo.getItemCount() - 1);
202   //    }
203   //    fCommandCombo.getParent().layout(true);
204   //  }
205
206   //  private void execute(String command) {  
207   //    
208   //    ArrayList args = new ArrayList();
209   //
210   //    command = command.replace('\\', '§');
211   //
212   //    StreamTokenizer tokenizer = new StreamTokenizer(new StringReader(command));
213   //    tokenizer.resetSyntax();
214   //
215   //    tokenizer.whitespaceChars(0, ' ');
216   //    tokenizer.wordChars('!', 255);
217   //
218   //    tokenizer.quoteChar('"');
219   //    tokenizer.quoteChar('\'');
220   //
221   //    int token;
222   //    try {
223   //      while ((token = tokenizer.nextToken()) != StreamTokenizer.TT_EOF) {
224   //        if (token == StreamTokenizer.TT_WORD) {
225   //          args.add(tokenizer.sval);
226   //        }
227   //      }
228   //    } catch (IOException e) {
229   //      // 
230   //    }
231   //    String arg = "";
232   //    // replace variables in arguments
233   //
234   ////    IFile file = getFile();
235   //    IFile file = PHPeclipsePlugin.getDefault().getLastEditorFile();
236   //    if (file != null) {
237   //      String fileLocation = file.getLocation().toString();
238   //      for (int i = 0; i < args.size(); i++) {
239   //        arg = args.get(i).toString();
240   //        if (arg.equals("$f")) {
241   //          //current php editor file
242   //          if (File.separatorChar == '\\') {
243   //            fileLocation = fileLocation.replace('/', '\\');
244   //          }
245   //          args.set(i, fileLocation);
246   //        }
247   //      }
248   //    }
249   //
250   //    final IPreferenceStore store = PHPeclipsePlugin.getDefault().getPreferenceStore();
251   //
252   //    String arg0 = "";
253   //    String temp;
254   //    StringBuffer commandBuffer = new StringBuffer(1024);
255   //    //    Program.launch(command);
256   //    if (args.size() > 0) {
257   //      arg0 = (String) args.get(0);
258   //      arg0 = arg0.replace('§', '\\');
259   //      args.remove(0);
260   //      if (arg0.equals("php")) {
261   //        temp = store.getString(PHPeclipsePlugin.PHP_RUN_PREF);
262   //        if (temp != null) {
263   //          arg0 = temp;
264   //        }
265   //      }
266   //      commandBuffer.append(arg0 + " ");
267   //    }
268   //    String[] stringArgs = new String[args.size()];
269   //    for (int i = 0; i < args.size(); i++) {
270   //      arg = (String) args.get(i);
271   //      arg = arg.replace('§', '\\');
272   //      stringArgs[i] = arg;
273   //      commandBuffer.append(arg + " ");
274   //    }
275   //    commandBuffer.append("\n");
276   //
277   //    try {
278   //      command = commandBuffer.toString();
279   //      write(command+"\n");
280   //      Runtime runtime = Runtime.getRuntime();
281   //
282   //      // runs the command
283   //      Process process = runtime.exec(command);
284   //      
285   //      consoleOut = new ProcessOutputWriter(process.getInputStream());
286   //      consoleOut.start();
287   //      consoleErr = new ProcessOutputWriter(process.getErrorStream());
288   //      consoleErr.start();
289   //            
290   //      //process.waitFor();
291   ////      InputStream in = process.getInputStream();
292   ////      String output = getStringFromStream(in);
293   ////      write(output);
294   ////      in.close();
295   ////    } catch (InterruptedException e) {
296   ////      write(e.toString());
297   //    } catch (IOException e) {
298   //      write(e.toString());
299   //    }
300   //  }
301
302   private void hookContextMenu() {
303     MenuManager menuMgr = new MenuManager("#PopupMenu");
304     menuMgr.setRemoveAllWhenShown(true);
305     menuMgr.addMenuListener(new IMenuListener() {
306       public void menuAboutToShow(IMenuManager manager) {
307         PHPConsole.this.fillContextMenu(manager);
308       }
309     });
310     Menu menu = menuMgr.createContextMenu(fViewer.getControl());
311     fViewer.getControl().setMenu(menu);
312     getSite().registerContextMenu(menuMgr, fViewer);
313   }
314
315   private void contributeToActionBars() {
316     IActionBars bars = getViewSite().getActionBars();
317     fillLocalPullDown(bars.getMenuManager());
318     fillLocalToolBar(bars.getToolBarManager());
319   }
320
321   private void fillLocalPullDown(IMenuManager manager) {
322     manager.add(cutAction);
323     manager.add(copyAction);
324     //   manager.add(pasteAction);
325     manager.add(selectAllAction);
326   }
327
328   private void fillContextMenu(IMenuManager manager) {
329     manager.add(cutAction);
330     manager.add(copyAction);
331     //  manager.add(pasteAction);
332     manager.add(selectAllAction);
333     // Other plug-ins can contribute there actions here
334     manager.add(new Separator("Additions"));
335   }
336
337   private void fillLocalToolBar(IToolBarManager manager) {
338     manager.add(clearAction);
339   }
340   /**
341    * Insert the method's description here.
342    * @see ViewPart#setFocus
343    */
344   public void setFocus() {
345     //   fCommandCombo.forceFocus();
346   }
347
348   /**
349    * Set the text for the viewer
350    */
351   public void setOutputText(String text) {
352     fDocument = new Document(text);
353     fViewer.setDocument(fDocument);
354   }
355
356   public void appendOutputText(String text) {
357     try {
358       if (fDocument == null) {
359         fDocument = new Document(text);
360         fViewer.setDocument(fDocument);
361       } else {
362         fDocument.replace(fDocument.getLength(), 0, text);
363       }
364     } catch (BadLocationException e) {
365     }
366     //  viewer.setDocument(document);
367   }
368
369   public static PHPConsole getInstance() {
370     // IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
371     IWorkbenchPage page =
372       PHPeclipsePlugin
373         .getDefault()
374         .getWorkbench()
375         .getActiveWorkbenchWindow()
376         .getActivePage();
377     PHPConsole console = (PHPConsole) page.findView(PHPConsole.CONSOLE_ID);
378
379     if (PHPeclipsePlugin
380       .getDefault()
381       .getPreferenceStore()
382       .getBoolean(PHPeclipsePlugin.SHOW_OUTPUT_IN_CONSOLE) 
383       == true) {
384       try {
385         page.showView(PHPConsole.CONSOLE_ID);
386         if (console == null) {
387           console = (PHPConsole) page.findView(PHPConsole.CONSOLE_ID);
388         }
389       } catch (PartInitException e) {
390         PHPeclipsePlugin.getDefault().getLog().log(
391           new Status(
392             IStatus.ERROR,
393             PHPeclipsePlugin.getPluginId(),
394             0,
395             PHPActionMessages.getString(
396               "PHPStartApacheAction.consoleViewOpeningProblem"),
397             e));
398       }
399     }
400     return console;
401   }
402
403   /**
404    * Prints out the string represented by the string 
405    */
406   public synchronized void write(String output) {
407     appendOutputText(output);
408   }
409
410   /**
411    * Creates a string buffer from the given input stream
412    */
413   public static String getStringFromStream(InputStream stream)
414     throws IOException {
415     StringBuffer buffer = new StringBuffer();
416     byte[] b = new byte[100];
417     int finished = 0;
418     while (finished != -1) {
419       finished = stream.read(b);
420       if (finished != -1) {
421         String current = new String(b, 0, finished);
422         buffer.append(current);
423       }
424     }
425     return buffer.toString();
426   }
427
428   /**
429    * Finds the file that's currently opened in the PHP Text Editor
430    */
431   //  protected IFile getFile() {
432   //    ITextEditor editor = PHPeclipsePlugin.getDefault().getLastEditorFile();
433   //
434   //    IEditorInput editorInput = null;
435   //    if (editor != null) {
436   //      editorInput = editor.getEditorInput();
437   //    }
438   //
439   //    if (editorInput instanceof IFileEditorInput)
440   //      return ((IFileEditorInput) editorInput).getFile();
441   //
442   //    // if nothing was found, which should never happen
443   //    return null;
444   //  }
445
446   class ProcessOutputWriter extends Thread {
447     boolean fStreamClosed;
448     InputStream fInputStream;
449
450     ProcessOutputWriter(InputStream inputStream) {
451       fInputStream = inputStream;
452       fStreamClosed = false;
453     }
454
455     public void closeStream() {
456       fStreamClosed = true;
457       try {
458         fInputStream.close();
459       } catch (IOException io) {
460       }
461     }
462
463     public void run() {
464       try {
465         BufferedReader in =
466           new BufferedReader(new InputStreamReader(fInputStream));
467
468         String line;
469         while ((line = in.readLine()) != null) {
470           write(line);
471         }
472         in.close();
473       } catch (Exception e) {
474         e.printStackTrace(System.out);
475         if (!fStreamClosed) {
476           //  write("\nPHP Console Exception: "+ e.toString() );
477         }
478       } finally {
479       }
480     }
481   }
482
483 }