Package org.eclipse.php.internal.debug.ui.views

Source Code of org.eclipse.php.internal.debug.ui.views.DebugOutputView

/*******************************************************************************
* Copyright (c) 2009, 2011 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
*     IBM Corporation - initial API and implementation
*     Zend Technologies
*******************************************************************************/
package org.eclipse.php.internal.debug.ui.views;

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.debug.core.DebugEvent;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.IDebugEventSetListener;
import org.eclipse.debug.ui.AbstractDebugView;
import org.eclipse.debug.ui.IDebugUIConstants;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.php.internal.debug.core.model.DebugOutput;
import org.eclipse.php.internal.debug.core.model.IPHPDebugTarget;
import org.eclipse.php.internal.debug.core.zend.model.PHPThread;
import org.eclipse.php.internal.ui.IPHPHelpContextIds;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.ISelectionListener;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.internal.editors.text.EditorsPlugin;
import org.eclipse.ui.progress.UIJob;
import org.eclipse.ui.texteditor.AbstractTextEditor;
import org.eclipse.wst.html.core.internal.encoding.HTMLDocumentLoader;
import org.eclipse.wst.html.ui.StructuredTextViewerConfigurationHTML;
import org.eclipse.wst.sse.core.internal.text.BasicStructuredDocument;
import org.eclipse.wst.sse.ui.internal.StructuredTextViewer;

/**
* View of the PHP parameter stack
*/
public class DebugOutputView extends AbstractDebugView implements
    ISelectionListener {

  public static final String ID_PHPDebugOutput = "org.eclipse.debug.ui.PHPDebugOutput"; //$NON-NLS-1$

  private IPHPDebugTarget fTarget;
  private int fUpdateCount;
  private IDebugEventSetListener terminateListener;
  private DebugViewHelper debugViewHelper;
  private StructuredTextViewer fSourceViewer;

  public DebugOutputView() {
    super();
  }

  /*
   * (non-Javadoc)
   *
   * @see
   * org.eclipse.debug.ui.AbstractDebugView#createViewer(org.eclipse.swt.widgets
   * .Composite)
   */
  protected Viewer createViewer(Composite parent) {

    int styles = SWT.V_SCROLL | SWT.H_SCROLL | SWT.MULTI
        | SWT.FULL_SELECTION;
    fSourceViewer = new StructuredTextViewer(parent, null, null, false,
        styles);
    fSourceViewer.setEditable(false);
    getSite().getWorkbenchWindow().getSelectionService()
        .addSelectionListener(IDebugUIConstants.ID_DEBUG_VIEW, this);
    getSite().setSelectionProvider(fSourceViewer.getSelectionProvider());

    setBackgroundColor();

    terminateListener = new IDebugEventSetListener() {
      IPHPDebugTarget target;

      public void handleDebugEvents(DebugEvent[] events) {
        if (events != null) {
          int size = events.length;
          for (int i = 0; i < size; i++) {
            Object obj = events[i].getSource();
            // 386462: [Regression] Debug Output does not refresh
            // depending on the focus
            // https://bugs.eclipse.org/bugs/show_bug.cgi?id=386462
            if (!(obj instanceof IPHPDebugTarget || obj instanceof PHPThread))
              continue;

            if (events[i].getKind() == DebugEvent.TERMINATE
                || events[i].getKind() == DebugEvent.SUSPEND) {
              if (obj instanceof IPHPDebugTarget) {

                target = (IPHPDebugTarget) obj;
              } else {
                target = (IPHPDebugTarget) ((PHPThread) obj)
                    .getDebugTarget();
              }
              Job job = new UIJob("debug output") { //$NON-NLS-1$
                public IStatus runInUIThread(
                    IProgressMonitor monitor) {
                  update(target);
                  return Status.OK_STATUS;
                }
              };
              job.schedule();
            }
          }
        }
      }
    };
    DebugPlugin.getDefault().addDebugEventListener(terminateListener);

    debugViewHelper = new DebugViewHelper();

    return fSourceViewer;
  }

  private void setBackgroundColor() {
    IPreferenceStore store = EditorsPlugin.getDefault()
        .getPreferenceStore();

    fSourceViewer.getTextWidget().setBackground(getBackgroundColor(store));
    IPropertyChangeListener listener = new IPropertyChangeListener() {

      public void propertyChange(PropertyChangeEvent event) {
        IPreferenceStore store = EditorsPlugin.getDefault()
            .getPreferenceStore();
        String prop = event.getProperty();
        if (prop.equals(AbstractTextEditor.PREFERENCE_COLOR_BACKGROUND_SYSTEM_DEFAULT)
            || prop.equals(AbstractTextEditor.PREFERENCE_COLOR_BACKGROUND)) {
          fSourceViewer.getTextWidget().setBackground(
              getBackgroundColor(store));
        }

      }
    };
    store.addPropertyChangeListener(listener);

  }

  /**
   * Get background color
   *
   * @return background color
   */
  private Color getBackgroundColor(IPreferenceStore store) {
    String useDefault = store
        .getString(AbstractTextEditor.PREFERENCE_COLOR_BACKGROUND_SYSTEM_DEFAULT);

    Color dflt = Display.getDefault().getSystemColor(
        SWT.COLOR_LIST_BACKGROUND);

    if ("true".equalsIgnoreCase(useDefault)) { //$NON-NLS-1$
      return dflt;
    }

    String bgColor = store
        .getString(AbstractTextEditor.PREFERENCE_COLOR_BACKGROUND);
    if (bgColor == null || bgColor.equals("")) { //$NON-NLS-1$
      return dflt;
    }

    String[] rgb = bgColor.split(","); //$NON-NLS-1$
    RGB color;
    try {
      color = new RGB(Integer.parseInt(rgb[0]), Integer.parseInt(rgb[1]),
          Integer.parseInt(rgb[2]));
    } catch (Throwable ex) {
      return dflt;
    }

    return new Color(Display.getDefault(), color);
  }

  /*
   * (non-Javadoc)
   *
   * @see org.eclipse.debug.ui.AbstractDebugView#getHelpContextId()
   */
  protected String getHelpContextId() {
    return IPHPHelpContextIds.DEBUG_OUTPUT_VIEW;
  }

  /*
   * (non-Javadoc)
   *
   * @see
   * org.eclipse.debug.ui.AbstractDebugView#configureToolBar(org.eclipse.jface
   * .action.IToolBarManager)
   */
  protected void configureToolBar(IToolBarManager tbm) {

  }

  /*
   * (non-Javadoc)
   *
   * @see org.eclipse.ui.IWorkbenchPart#dispose()
   */
  public void dispose() {
    getSite().getWorkbenchWindow().getSelectionService()
        .removeSelectionListener(IDebugUIConstants.ID_DEBUG_VIEW, this);
    DebugPlugin.getDefault().removeDebugEventListener(terminateListener);
    // fTarget = null;
    super.dispose();
  }

  /*
   * (non-Javadoc)
   *
   * @seeorg.eclipse.ui.ISelectionListener#selectionChanged(org.eclipse.ui.
   * IWorkbenchPart, org.eclipse.jface.viewers.ISelection)
   */
  public void selectionChanged(IWorkbenchPart part, ISelection selection) {

    IPHPDebugTarget target = debugViewHelper.getSelectionElement(selection);
    update(target);
  }

  private synchronized void update(IPHPDebugTarget target) {
    IPHPDebugTarget oldTarget = fTarget;
    int oldcount = fUpdateCount;
    fTarget = target;
    HTMLDocumentLoader ss = new HTMLDocumentLoader();
    BasicStructuredDocument dd = (BasicStructuredDocument) ss
        .createNewStructuredDocument();
    Object input = dd;
    if (fTarget != null) {
      if ((fTarget.isSuspended()) || (fTarget.isTerminated())
          || (fTarget.isWaiting())) {
        DebugOutput outputBuffer = fTarget.getOutputBuffer();
        fUpdateCount = outputBuffer.getUpdateCount();

        // check if output hasn't been updated
        if (fTarget == oldTarget && fUpdateCount == oldcount)
          return;

        String output = outputBuffer.toString();
        dd.setText(this, output);
      } else {
        // Not Suspended or Terminated

        // the following is a fix for bug
        // https://bugs.eclipse.org/bugs/show_bug.cgi?id=205688
        // if the target is not suspended or terminated fTarget should
        // get back its old value
        // so that in the next time the function is called it will not
        // consider this target
        // as it was already set to the view
        fTarget = oldTarget;
        return;
      }
    }
    try {
      fSourceViewer.setInput(input);
    } catch (Exception e) {
      // Don't handle - it may be NPE in LineStyleProviderForEmbeddedCSS
    }
    fSourceViewer.configure(new StructuredTextViewerConfigurationHTML());
    fSourceViewer.refresh();
  }

  /*
   * (non-Javadoc)
   *
   * @see org.eclipse.debug.ui.AbstractDebugView#createActions()
   */
  protected void createActions() {

  }

  /*
   * (non-Javadoc)
   *
   * @see
   * org.eclipse.debug.ui.AbstractDebugView#fillContextMenu(org.eclipse.jface
   * .action.IMenuManager)
   */
  protected void fillContextMenu(IMenuManager menu) {
    menu.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));

  }

  public void updateObjects() {
    super.updateObjects();
    // update();

  }

  protected void becomesVisible() {
    super.becomesVisible();
    IPHPDebugTarget target = debugViewHelper.getSelectionElement(null);
    update(target);
  }
}
TOP

Related Classes of org.eclipse.php.internal.debug.ui.views.DebugOutputView

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.