/*******************************************************************************
* Copyright (c) 2009, 2015 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.IDebugUIConstants;
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.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.debug.ui.PHPDebugUIMessages;
import org.eclipse.php.ui.util.PartListenerAdapter;
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.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchPartReference;
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 for presenting debug output as raw text.
*/
@SuppressWarnings("restriction")
public class DebugOutputView extends AbstractDebugOutputView implements ISelectionListener {
public static final String ID_PHPDebugOutput = "org.eclipse.debug.ui.PHPDebugOutput"; //$NON-NLS-1$
private final class Updater implements IUpdater {
private int fUpdateCount;
/*
* (non-Javadoc)
*
* @see org.eclipse.php.internal.debug.ui.views.AbstractDebugOutputView.
* IUpdater
* #update(org.eclipse.php.internal.debug.core.model.IPHPDebugTarget)
*/
@Override
public void update(IPHPDebugTarget target) {
int oldcount = fUpdateCount;
HTMLDocumentLoader ss = new HTMLDocumentLoader();
BasicStructuredDocument input = (BasicStructuredDocument) ss.createNewStructuredDocument();
if (target != null) {
if ((target.isSuspended()) || (target.isTerminated()) || (target.isWaiting())) {
DebugOutput debugOutput = target.getOutputBuffer();
fUpdateCount = debugOutput.getUpdateCount();
// check if output hasn't been updated
if (fUpdateCount == oldcount)
return;
String contentType = debugOutput.getContentType();
// we don't show garbage anymore
if (contentType != null && !contentType.startsWith("text")) { //$NON-NLS-1$
return;
}
input.setText(this, debugOutput.getOutput());
}
// Not Suspended or Terminated
else {
return;
}
}
try {
fSourceViewer.setInput(input);
} catch (Exception e) {
// Don't handle
}
fSourceViewer.refresh();
}
}
/**
* Part listener that re-enables updating when the view appears.
*/
private final class DebugViewPartListener extends PartListenerAdapter {
public void partVisible(IWorkbenchPartReference ref) {
IWorkbenchPart part = ref.getPart(false);
if (part == DebugOutputView.this) {
IPHPDebugTarget target = fDebugViewHelper.getSelectionElement(null);
update(target);
}
}
}
private IDebugEventSetListener fTerminateListener;
private StructuredTextViewer fSourceViewer;
private DebugViewPartListener fPartListener;
private IPropertyChangeListener fPropertyChangeListener;
public DebugOutputView() {
super();
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.
* widgets .Composite)
*/
@Override
public void createPartControl(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);
fSourceViewer.configure(new StructuredTextViewerConfigurationHTML());
getSite().getWorkbenchWindow().getSelectionService().addSelectionListener(IDebugUIConstants.ID_DEBUG_VIEW,
this);
getSite().setSelectionProvider(fSourceViewer.getSelectionProvider());
setBackgroundColor();
fTerminateListener = new IDebugEventSetListener() {
public void handleDebugEvents(DebugEvent[] events) {
if (events != null) {
int size = events.length;
for (int i = 0; i < size; i++) {
Object obj = events[i].getSource();
if (!(obj instanceof IPHPDebugTarget || obj instanceof PHPThread))
continue;
if (events[i].getKind() == DebugEvent.TERMINATE || events[i].getKind() == DebugEvent.SUSPEND) {
final IPHPDebugTarget target;
if (obj instanceof IPHPDebugTarget) {
target = (IPHPDebugTarget) obj;
} else {
target = (IPHPDebugTarget) ((PHPThread) obj).getDebugTarget();
}
Job job = new UIJob(PHPDebugUIMessages.PHPDebugUIPlugin_1) {
public IStatus runInUIThread(IProgressMonitor monitor) {
update(target);
return Status.OK_STATUS;
}
};
job.schedule();
}
}
}
}
};
DebugPlugin.getDefault().addDebugEventListener(fTerminateListener);
if (fPartListener == null) {
fPartListener = new DebugViewPartListener();
getSite().getPage().addPartListener(fPartListener);
}
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.IWorkbenchPart#dispose()
*/
public void dispose() {
getSite().getWorkbenchWindow().getSelectionService().removeSelectionListener(IDebugUIConstants.ID_DEBUG_VIEW,
this);
DebugPlugin.getDefault().removeDebugEventListener(fTerminateListener);
if (fPartListener != null) {
getSite().getPage().removePartListener(fPartListener);
fPartListener = null;
}
if (fPropertyChangeListener != null) {
EditorsPlugin.getDefault().getPreferenceStore().removePropertyChangeListener(fPropertyChangeListener);
fPropertyChangeListener = 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 = fDebugViewHelper.getSelectionElement(selection);
update(target);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.part.WorkbenchPart#setFocus()
*/
@Override
public void setFocus() {
}
/*
* (non-Javadoc)
*
* @see org.eclipse.php.internal.debug.ui.views.AbstractDebugOutputView#
* createUpdater ()
*/
@Override
protected IUpdater createUpdater() {
return new Updater();
}
/**
* 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);
}
private void setBackgroundColor() {
IPreferenceStore store = EditorsPlugin.getDefault().getPreferenceStore();
fSourceViewer.getTextWidget().setBackground(getBackgroundColor(store));
if (fPropertyChangeListener == null) {
fPropertyChangeListener = 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)) {
if (fSourceViewer == null || fSourceViewer.getTextWidget() == null
|| fSourceViewer.getTextWidget().isDisposed()) {
return;
}
fSourceViewer.getTextWidget().setBackground(getBackgroundColor(store));
}
}
};
store.addPropertyChangeListener(fPropertyChangeListener);
}
}
}