/*******************************************************************************
* 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.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.ui.PHPDebugUIMessages;
import org.eclipse.php.internal.ui.IPHPHelpContextIds;
import org.eclipse.php.ui.util.PartListenerAdapter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.SWTError;
import org.eclipse.swt.browser.Browser;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.ui.ISelectionListener;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchPartReference;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.progress.UIJob;
/**
* View for presenting debug output as rendered in a browser.
*/
@SuppressWarnings("restriction")
public class DebugBrowserView extends AbstractDebugOutputView implements ISelectionListener {
public static final String ID_PHPBrowserOutput = "org.eclipse.debug.ui.PHPBrowserOutput"; //$NON-NLS-1$
private final class Updater implements IUpdater {
private int fUpdateCount;
public void update(IPHPDebugTarget target) {
if (fSWTBrowser != null && !fSWTBrowser.isDisposed()) {
int oldcount = fUpdateCount;
DebugOutput debugOutput = null;
if (target != null) {
if ((target.isSuspended()) || (target.isTerminated()) || target.isWaiting()) {
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;
}
fSWTBrowser.setText(debugOutput.getOutput());
}
// Not Suspended or Terminated
else {
return;
}
}
}
}
}
/**
* 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 == DebugBrowserView.this) {
IPHPDebugTarget target = fDebugViewHelper.getSelectionElement(null);
update(target);
}
}
}
private Browser fSWTBrowser;
private IDebugEventSetListener fTerminateListener;
private DebugViewPartListener fPartListener;
/*
* (non-Javadoc)
*
* @see
* org.eclipse.ui.IWorkbenchPart#createPartControl(org.eclipse.swt.widgets
* .Composite)
*/
public void createPartControl(Composite parent) {
Composite container = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout();
layout.numColumns = 1;
layout.makeColumnsEqualWidth = true;
layout.marginHeight = 0;
layout.marginWidth = 0;
container.setLayout(layout);
RowLayout rowLayout = new RowLayout();
rowLayout.spacing = 1;
GridData gridData = new GridData();
gridData.grabExcessHorizontalSpace = true;
gridData.grabExcessVerticalSpace = true;
gridData.horizontalAlignment = SWT.FILL;
gridData.verticalAlignment = SWT.FILL;
try {
fSWTBrowser = new Browser(container, SWT.NONE);
fSWTBrowser.setLayoutData(gridData);
} catch (SWTError error) {
fSWTBrowser = null;
Label label = new Label(container, SWT.WRAP);
label.setText(PHPDebugUIMessages.DebugBrowserView_swtBrowserNotAvailable0);
label.setLayoutData(gridData);
}
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))
continue;
// Update when debug target is done
if (events[i].getKind() == DebugEvent.TERMINATE) {
final IPHPDebugTarget target = (IPHPDebugTarget) obj;
Job job = new UIJob(PHPDebugUIMessages.PHPDebugUIPlugin_0) {
public IStatus runInUIThread(IProgressMonitor monitor) {
update(target);
return Status.OK_STATUS;
}
};
job.schedule();
}
}
}
}
};
DebugPlugin.getDefault().addDebugEventListener(fTerminateListener);
getSite().getWorkbenchWindow().getSelectionService().addSelectionListener(IDebugUIConstants.ID_DEBUG_VIEW,
this);
if (fPartListener == null) {
fPartListener = new DebugViewPartListener();
getSite().getPage().addPartListener(fPartListener);
}
PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, IPHPHelpContextIds.BROWSER_OUTPUT_VIEW);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.part.WorkbenchPart#dispose()
*/
public void dispose() {
getSite().getWorkbenchWindow().getSelectionService().removeSelectionListener(IDebugUIConstants.ID_DEBUG_VIEW,
this);
DebugPlugin.getDefault().removeDebugEventListener(fTerminateListener);
if (fSWTBrowser != null && !fSWTBrowser.isDisposed()) {
fSWTBrowser.dispose();
}
if (fPartListener != null) {
fPartListener = new DebugViewPartListener();
getSite().getPage().removePartListener(fPartListener);
}
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.IWorkbenchPart#setFocus()
*/
public void setFocus() {
}
/*
* (non-Javadoc)
*
* @see org.eclipse.php.internal.debug.ui.views.AbstractDebugOutputView#
* createUpdater ()
*/
@Override
protected IUpdater createUpdater() {
return new Updater();
}
}