/*******************************************************************************
* Copyright (c) 2008 Red Hat, Inc.
* 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:
* Elliott Baron <ebaron@redhat.com> - initial API and implementation
*******************************************************************************/
package org.eclipse.linuxtools.internal.valgrind.ui;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.ActionContributionItem;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.ToolBarManager;
import org.eclipse.linuxtools.internal.valgrind.core.ValgrindInfo;
import org.eclipse.linuxtools.valgrind.core.IValgrindMessage;
import org.eclipse.linuxtools.valgrind.ui.IValgrindToolView;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.ui.part.PageBook;
import org.eclipse.ui.part.ViewPart;
/**
* The view which display information and messages of an execution.
*/
public class ValgrindViewPart extends ViewPart {
private static final String TOOLBAR_LOC_GROUP_ID = "toolbarLocal"; //$NON-NLS-1$
private PageBook pageBook;
private Composite dynamicViewHolder;
private IValgrindToolView dynamicView;
private ActionContributionItem[] dynamicActions;
private IValgrindMessage[] messages;
private CoreMessagesViewer messagesViewer;
private Action showCoreAction;
private Action showToolAction;
private boolean hasDynamicContent = false;
@Override
public void createPartControl(Composite parent) {
setContentDescription(Messages.getString("ValgrindViewPart.No_Valgrind_output")); //$NON-NLS-1$
pageBook = new PageBook(parent, SWT.NONE);
pageBook.setLayoutData(new GridData(GridData.FILL_BOTH));
messagesViewer = new CoreMessagesViewer(pageBook, SWT.NONE);
dynamicViewHolder = new Composite(pageBook, SWT.NONE);
GridLayout dynamicViewLayout = new GridLayout();
dynamicViewLayout.marginWidth = dynamicViewLayout.marginHeight = 0;
dynamicViewHolder.setLayout(dynamicViewLayout);
dynamicViewHolder.setLayoutData(new GridData(GridData.FILL_BOTH));
showCoreAction = new Action(Messages.getString("ValgrindViewPart.Show_Core_Action"), IAction.AS_RADIO_BUTTON) { //$NON-NLS-1$
@Override
public void run() {
showCorePage();
}
};
showToolAction = new Action(Messages.getString("ValgrindViewPart.Show_Tool_Action"), IAction.AS_RADIO_BUTTON) { //$NON-NLS-1$
@Override
public void run() {
showToolPage();
}
};
ValgrindUIPlugin.getDefault().setView(this);
}
/**
* Returns a refreshable view specific of a Valgrind tool.
*
* @param description the content description
* @param toolID the Valgrind tool identifier
* @return the Valgrind tool view
* @throws CoreException the toolbar is disposed
*/
public IValgrindToolView createDynamicContent(String description, String toolID) throws CoreException {
setContentDescription(description);
// remove tool specific toolbar controls
IToolBarManager toolbar = getViewSite().getActionBars().getToolBarManager();
ToolBar tb = ((ToolBarManager) toolbar).getControl();
if (tb == null || tb.isDisposed()) {
throw new CoreException(new Status(IStatus.ERROR, ValgrindUIPlugin.PLUGIN_ID, "Toolbar is disposed")); //$NON-NLS-1$
}
if (dynamicActions != null) {
for (ActionContributionItem item : dynamicActions) {
toolbar.remove(item);
}
}
// remove old view controls
if (dynamicView != null) {
dynamicView.dispose();
}
// remove old messages
if (messages != null){
messagesViewer.getTreeViewer().setInput(null);
messages = null;
}
for (Control child : dynamicViewHolder.getChildren()) {
if (!child.isDisposed()) {
child.dispose();
}
}
if (toolID != null) {
dynamicView = ValgrindUIPlugin.getDefault().getToolView(toolID);
dynamicView.createPartControl(dynamicViewHolder);
// create toolbar items
IAction[] actions = dynamicView.getToolbarActions();
if (actions != null) {
dynamicActions = new ActionContributionItem[actions.length];
for (int i = 0; i < actions.length; i++) {
dynamicActions[i] = new ActionContributionItem(actions[i]);
toolbar.appendToGroup(TOOLBAR_LOC_GROUP_ID, dynamicActions[i]);
}
}
} else {
dynamicView = null;
}
// remove old menu items
IMenuManager menu = getViewSite().getActionBars().getMenuManager();
menu.removeAll();
// was content was created?
hasDynamicContent = dynamicViewHolder.getChildren().length > 0;
if (hasDynamicContent) {
menu.add(showCoreAction);
menu.add(showToolAction);
}
menu.update(true);
toolbar.update(true);
// Update to notify the workbench items have been changed
getViewSite().getActionBars().updateActionBars();
dynamicViewHolder.layout(true);
return dynamicView;
}
/**
* Set the messages that will appear in the view.
*
* @param messages the array of messages
*/
public void setMessages(IValgrindMessage[] messages) {
this.messages = messages;
}
/**
* Returns the messages displayed in the view.
*
* @return the array of messages
*/
public IValgrindMessage[] getMessages() {
return messages;
}
@Override
public void setFocus() {
if (dynamicView != null) {
dynamicView.setFocus();
}
}
/**
* Refresh the view.
*/
public void refreshView() {
if (messages != null && messages.length > 0) {
messagesViewer.getTreeViewer().setInput(messages);
// decide which page to show
if (hasDynamicContent && messages[0] instanceof ValgrindInfo) {
// no valgrind messages to show
showCoreAction.setEnabled(false);
showToolPage();
}
else {
showCoreAction.setEnabled(true);
showCorePage();
}
}
if (dynamicView != null) {
dynamicView.refreshView();
}
}
@Override
public void dispose() {
if (dynamicView != null) {
dynamicView.dispose();
}
// Unset this view in the UI plugin
ValgrindUIPlugin.getDefault().setView(null);
super.dispose();
}
/**
* Returns the refreshable view or null if not already created.
*
* @return the valgrind tool view
*/
public IValgrindToolView getDynamicView() {
return dynamicView;
}
/**
* Returns the core messages viewer for this view part.
*
* @return the inner core messages viewer
*/
public CoreMessagesViewer getMessagesViewer() {
return messagesViewer;
}
private void showCorePage() {
pageBook.showPage(messagesViewer.getTreeViewer().getControl());
showCoreAction.setChecked(true);
showToolAction.setChecked(false);
}
private void showToolPage() {
pageBook.showPage(dynamicViewHolder);
showToolAction.setChecked(true);
showCoreAction.setChecked(false);
}
}