X-Git-Url: http://secure.phpeclipse.com diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/views/PHPConsole.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/views/PHPConsole.java index e2e1395..e3408c8 100644 --- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/views/PHPConsole.java +++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/views/PHPConsole.java @@ -12,13 +12,18 @@ Contributors: 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; @@ -27,21 +32,32 @@ 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 @@ -49,202 +65,379 @@ import org.eclipse.ui.part.ViewPart; */ public class PHPConsole extends ViewPart { - public static final String CONSOLE_ID = - "net.sourceforge.phpeclipse.views.phpconsoleview"; - - private TextViewer viewer = null; - private Document document = null; - private StyledText widget; - private Action cutAction = new Action() { - public void run() { - viewer.getTextWidget().cut(); - } - }; - private Action copyAction = new Action() { - public void run() { - widget.copy(); - } - }; - private Action pasteAction = new Action() { - public void run() { - viewer.getTextWidget().paste(); - } - }; - private Action selectAllAction = new Action() { - public void run() { - widget.selectAll(); - } - }; - private Action clearAction = new Action() { - public void run() { - widget.setText(""); - } - }; - /** - * The constructor. - */ - public PHPConsole() { - } - - /** - * Insert the method's description here. - * @see ViewPart#createPartControl - */ - public void createPartControl(Composite parent) { - viewer = new TextViewer(parent, SWT.WRAP | SWT.V_SCROLL | SWT.H_SCROLL); - GridData viewerData = new GridData(GridData.FILL_BOTH); - viewer.getControl().setLayoutData(viewerData); - viewer.setEditable(true); - - widget = viewer.getTextWidget(); - widget.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(); - - - } - - 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(viewer.getControl()); - viewer.getControl().setMenu(menu); - getSite().registerContextMenu(menuMgr, viewer); - } - - 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() { - } - - /** - * Set the text for the viewer - */ - public void setOutputText(String text) { - document = new Document(text); - viewer.setDocument(document); - } - - public void appendOutputText(String text) { - try { - if (document == null) { - document = new Document(text); - viewer.setDocument(document); - } else { - document.replace(document.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 buffer - */ - 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(); - } + 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; + } }