From 9b091e5b6635e806bc3e3f288a4f67d4b351b7a0 Mon Sep 17 00:00:00 2001 From: Anton Leherbauer Date: Tue, 8 Mar 2011 08:31:36 +0000 Subject: [PATCH] Bug 338908 - Turn the Signals view into a flexible hierarchy view --- debug/org.eclipse.cdt.debug.ui/plugin.xml | 28 +- .../adapters/CDebugElementAdapterFactory.java | 11 +- .../CDebugElementLabelProviderFactory.java | 11 +- .../adapters/CDebugElementProxyFactory.java | 10 +- .../adapters/CDebugTargetContentProvider.java | 23 +- .../adapters/CDefaultViewerInputProvider.java | 11 +- .../CStackFrameViewerInputProvider.java | 17 +- .../DefaultViewColumnPresentationFactory.java | 33 +++ .../ui/views/signals/FlexibleSignalsView.java | 244 ++++++++++++++++++ .../FlexibleSignalsViewEventHandler.java | 93 +++++++ .../ui/views/signals/SignalLabelProvider.java | 75 ++++++ .../views/signals/SignalsContentProvider.java | 53 ++++ .../SignalsViewColumnPresentation.java | 94 +++++++ .../views/signals/SignalsViewModelProxy.java | 42 +++ 14 files changed, 714 insertions(+), 31 deletions(-) create mode 100644 debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/elements/adapters/DefaultViewColumnPresentationFactory.java create mode 100644 debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/signals/FlexibleSignalsView.java create mode 100644 debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/signals/FlexibleSignalsViewEventHandler.java create mode 100644 debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/signals/SignalLabelProvider.java create mode 100644 debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/signals/SignalsContentProvider.java create mode 100644 debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/signals/SignalsViewColumnPresentation.java create mode 100644 debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/signals/SignalsViewModelProxy.java diff --git a/debug/org.eclipse.cdt.debug.ui/plugin.xml b/debug/org.eclipse.cdt.debug.ui/plugin.xml index 555114b217b..367410544cf 100644 --- a/debug/org.eclipse.cdt.debug.ui/plugin.xml +++ b/debug/org.eclipse.cdt.debug.ui/plugin.xml @@ -165,7 +165,7 @@ name="%SignalsView.name" icon="icons/view16/signals_view.gif" category="org.eclipse.debug.ui" - class="org.eclipse.cdt.debug.internal.ui.views.signals.SignalsView" + class="org.eclipse.cdt.debug.internal.ui.views.signals.FlexibleSignalsView" id="org.eclipse.cdt.debug.ui.SignalsView"> @@ -1365,9 +1365,8 @@ class="org.eclipse.cdt.debug.internal.ui.elements.adapters.CDebugElementAdapterFactory"> - - + + - - + - - - - + + - - @@ -1425,6 +1414,11 @@ + + + diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/elements/adapters/CDebugElementAdapterFactory.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/elements/adapters/CDebugElementAdapterFactory.java index 5103fe0be8b..2b109383e9b 100644 --- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/elements/adapters/CDebugElementAdapterFactory.java +++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/elements/adapters/CDebugElementAdapterFactory.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2004, 2010 QNX Software Systems and others. + * Copyright (c) 2004, 2011 QNX Software Systems 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 @@ -10,11 +10,13 @@ * IBM Corporation * ARM Limited - https://bugs.eclipse.org/bugs/show_bug.cgi?id=186981 * Wind River Systems - adapted to work with platform Modules view (bug 210558) + * Wind River Systems - flexible hierarchy Signals view (bug 338908) *******************************************************************************/ package org.eclipse.cdt.debug.internal.ui.elements.adapters; import org.eclipse.cdt.core.model.ICElement; import org.eclipse.cdt.debug.core.disassembly.IDisassemblyContextProvider; +import org.eclipse.cdt.debug.core.model.ICDebugElement; import org.eclipse.cdt.debug.core.model.ICDebugTarget; import org.eclipse.cdt.debug.core.model.ICModule; import org.eclipse.cdt.debug.core.model.ICStackFrame; @@ -60,6 +62,7 @@ public class CDebugElementAdapterFactory implements IAdapterFactory { private static IViewerInputProvider fgDefaultViewerInputProvider = new CDefaultViewerInputProvider(); private static IViewerInputProvider fgStackFrameViewerInputProvider = new CStackFrameViewerInputProvider(); private static IColumnPresentationFactory fgRegistersViewColumnPresentationFactory = new RegistersViewColumnPresentationFactory(); + private static IColumnPresentationFactory fgDefaultViewColumnPresentationFactory = new DefaultViewColumnPresentationFactory(); private static IElementMementoProvider fgRegisterManagerProxyMementoProvider = new CRegisterManagerProxyMementoProvider(); /* (non-Javadoc) @@ -84,8 +87,8 @@ public class CDebugElementAdapterFactory implements IAdapterFactory { return fgCRegisterManagerContentProvider; } if ( adaptableObject instanceof ICModule || - adaptableObject instanceof ICElement ) { - return fgModuleContentProvider; + adaptableObject instanceof ICElement ) { + return fgModuleContentProvider; } } if ( adapterType.equals( IModelProxyFactory.class ) ) { @@ -158,6 +161,8 @@ public class CDebugElementAdapterFactory implements IAdapterFactory { if ( adapterType.equals( IColumnPresentationFactory.class ) ) { if ( adaptableObject instanceof CRegisterManagerProxy ) { return fgRegistersViewColumnPresentationFactory; + } else if (adaptableObject instanceof ICDebugElement) { + return fgDefaultViewColumnPresentationFactory; } } return null; diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/elements/adapters/CDebugElementLabelProviderFactory.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/elements/adapters/CDebugElementLabelProviderFactory.java index 0de9403d919..3bb793a3aa2 100644 --- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/elements/adapters/CDebugElementLabelProviderFactory.java +++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/elements/adapters/CDebugElementLabelProviderFactory.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2007 ARM Limited and others. + * Copyright (c) 2007, 2011 ARM Limited 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 @@ -7,13 +7,16 @@ * * Contributors: * ARM Limited - Initial API and implementation + * Wind River Systems - flexible hierarchy Signals view (bug 338908) *******************************************************************************/ package org.eclipse.cdt.debug.internal.ui.elements.adapters; import org.eclipse.cdt.core.model.ICElement; import org.eclipse.cdt.debug.core.model.ICModule; +import org.eclipse.cdt.debug.core.model.ICSignal; import org.eclipse.cdt.debug.core.model.ICVariable; import org.eclipse.cdt.debug.internal.ui.views.modules.ModuleLabelProvider; +import org.eclipse.cdt.debug.internal.ui.views.signals.SignalLabelProvider; import org.eclipse.core.runtime.IAdapterFactory; import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementLabelProvider; @@ -24,10 +27,12 @@ public class CDebugElementLabelProviderFactory implements IAdapterFactory { private static IElementLabelProvider fgModuleLabelProvider = new ModuleLabelProvider(); private static IElementLabelProvider fgVariableLabelProvider = new CVariableLabelProvider(); + private static IElementLabelProvider fgSignalLabelProvider = new SignalLabelProvider(); /* (non-Javadoc) * @see org.eclipse.core.runtime.IAdapterFactory#getAdapter(java.lang.Object, java.lang.Class) */ + @SuppressWarnings("rawtypes") public Object getAdapter( Object adaptableObject, Class adapterType ) { if ( adapterType.equals( IElementLabelProvider.class ) ) { if ( adaptableObject instanceof ICModule ) { @@ -39,6 +44,9 @@ public class CDebugElementLabelProviderFactory implements IAdapterFactory { if ( adaptableObject instanceof ICVariable ) { return fgVariableLabelProvider; } + if ( adaptableObject instanceof ICSignal ) { + return fgSignalLabelProvider; + } } return null; } @@ -46,6 +54,7 @@ public class CDebugElementLabelProviderFactory implements IAdapterFactory { /* (non-Javadoc) * @see org.eclipse.core.runtime.IAdapterFactory#getAdapterList() */ + @SuppressWarnings("rawtypes") public Class[] getAdapterList() { return new Class[] { IElementLabelProvider.class, diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/elements/adapters/CDebugElementProxyFactory.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/elements/adapters/CDebugElementProxyFactory.java index fbfeea4a07d..cd90cd5c2ac 100644 --- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/elements/adapters/CDebugElementProxyFactory.java +++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/elements/adapters/CDebugElementProxyFactory.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2004, 2010 QNX Software Systems and others. + * Copyright (c) 2004, 2011 QNX Software Systems 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 @@ -9,6 +9,7 @@ * QNX Software Systems - Initial API and implementation * IBM Corporation * Wind River Systems - adapted to work with platform Modules view (bug 210558) + * Wind River Systems - flexible hierarchy Signals view (bug 338908) *******************************************************************************/ package org.eclipse.cdt.debug.internal.ui.elements.adapters; @@ -16,6 +17,7 @@ import org.eclipse.cdt.debug.core.model.ICDebugTarget; import org.eclipse.cdt.debug.core.model.IModuleRetrieval; import org.eclipse.cdt.debug.internal.core.model.DisassemblyRetrieval; import org.eclipse.cdt.debug.internal.ui.views.modules.ModulesViewModelProxy; +import org.eclipse.cdt.debug.internal.ui.views.signals.SignalsViewModelProxy; import org.eclipse.cdt.debug.ui.ICDebugUIConstants; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelProxy; @@ -28,6 +30,7 @@ public class CDebugElementProxyFactory extends DefaultModelProxyFactory { /* (non-Javadoc) * @see org.eclipse.debug.internal.ui.viewers.provisional.IModelProxyFactoryAdapter#createModelProxy(java.lang.Object, org.eclipse.debug.internal.ui.viewers.provisional.IPresentationContext) */ + @Override public IModelProxy createModelProxy( Object element, IPresentationContext context ) { if ( IDebugUIConstants.ID_MODULE_VIEW.equals( context.getId() ) ) { IModuleRetrieval mr = null; @@ -50,6 +53,11 @@ public class CDebugElementProxyFactory extends DefaultModelProxyFactory { return new DisassemblyElementProxy( element ); } } + else if ( ICDebugUIConstants.ID_SIGNALS_VIEW.equals( context.getId() ) ) { + if ( element instanceof ICDebugTarget ) { + return new SignalsViewModelProxy( element ); + } + } return super.createModelProxy( element, context ); } } diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/elements/adapters/CDebugTargetContentProvider.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/elements/adapters/CDebugTargetContentProvider.java index 4c148933546..b631dd2bf45 100644 --- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/elements/adapters/CDebugTargetContentProvider.java +++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/elements/adapters/CDebugTargetContentProvider.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2008 Wind River Systems and others. + * Copyright (c) 2008, 2011 Wind River Systems 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 @@ -7,10 +7,13 @@ * * Contributors: * Wind River Systems - initial API and implementation + * Wind River Systems - flexible hierarchy Signals view (bug 338908) *******************************************************************************/ package org.eclipse.cdt.debug.internal.ui.elements.adapters; import org.eclipse.cdt.debug.internal.ui.views.modules.ModuleContentProvider; +import org.eclipse.cdt.debug.internal.ui.views.signals.SignalsContentProvider; +import org.eclipse.cdt.debug.ui.ICDebugUIConstants; import org.eclipse.debug.internal.ui.model.elements.DebugTargetContentProvider; import org.eclipse.debug.internal.ui.viewers.model.provisional.IChildrenCountUpdate; import org.eclipse.debug.internal.ui.viewers.model.provisional.IChildrenUpdate; @@ -24,12 +27,16 @@ import org.eclipse.debug.ui.IDebugUIConstants; * implementation. */ public class CDebugTargetContentProvider extends DebugTargetContentProvider { - private ModuleContentProvider fModuleContentProvider = new ModuleContentProvider(); + private final ModuleContentProvider fModuleContentProvider = new ModuleContentProvider(); + private final SignalsContentProvider fSignalsContentProvider = new SignalsContentProvider(); @Override public void update(IChildrenCountUpdate[] updates) { - if (updates[0].getPresentationContext().getId().equals(IDebugUIConstants.ID_MODULE_VIEW)) { + String id = updates[0].getPresentationContext().getId(); + if (IDebugUIConstants.ID_MODULE_VIEW.equals(id)) { fModuleContentProvider.update(updates); + } else if (ICDebugUIConstants.ID_SIGNALS_VIEW.equals(id)) { + fSignalsContentProvider.update(updates); } else { super.update(updates); } @@ -37,8 +44,11 @@ public class CDebugTargetContentProvider extends DebugTargetContentProvider { @Override public void update(IHasChildrenUpdate[] updates) { - if (updates[0].getPresentationContext().getId().equals(IDebugUIConstants.ID_MODULE_VIEW)) { + String id = updates[0].getPresentationContext().getId(); + if (IDebugUIConstants.ID_MODULE_VIEW.equals(id)) { fModuleContentProvider.update(updates); + } else if (ICDebugUIConstants.ID_SIGNALS_VIEW.equals(id)) { + fSignalsContentProvider.update(updates); } else { super.update(updates); } @@ -46,8 +56,11 @@ public class CDebugTargetContentProvider extends DebugTargetContentProvider { @Override public void update(IChildrenUpdate[] updates) { - if (updates[0].getPresentationContext().getId().equals(IDebugUIConstants.ID_MODULE_VIEW)) { + String id = updates[0].getPresentationContext().getId(); + if (IDebugUIConstants.ID_MODULE_VIEW.equals(id)) { fModuleContentProvider.update(updates); + } else if (ICDebugUIConstants.ID_SIGNALS_VIEW.equals(id)) { + fSignalsContentProvider.update(updates); } else { super.update(updates); } diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/elements/adapters/CDefaultViewerInputProvider.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/elements/adapters/CDefaultViewerInputProvider.java index ea919caca48..607565b39a9 100644 --- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/elements/adapters/CDefaultViewerInputProvider.java +++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/elements/adapters/CDefaultViewerInputProvider.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2010 CodeSourcery and others. + * Copyright (c) 2010, 2011 CodeSourcery 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 @@ -7,13 +7,14 @@ * * Contributors: * CodeSourcery - Initial API and implementation + * Wind River Systems - flexible hierarchy Signals view (bug 338908) *******************************************************************************/ - package org.eclipse.cdt.debug.internal.ui.elements.adapters; import org.eclipse.cdt.debug.core.model.ICDebugElement; import org.eclipse.cdt.debug.core.model.ICDebugTarget; import org.eclipse.cdt.debug.internal.ui.CRegisterManagerProxies; +import org.eclipse.cdt.debug.ui.ICDebugUIConstants; import org.eclipse.core.runtime.CoreException; import org.eclipse.debug.internal.ui.elements.adapters.DefaultViewerInputProvider; import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext; @@ -32,6 +33,10 @@ public class CDefaultViewerInputProvider extends DefaultViewerInputProvider impl ICDebugTarget target = (ICDebugTarget)((ICDebugElement)source).getDebugTarget(); return CRegisterManagerProxies.getInstance().getRegisterManagerProxy( target ); } + if ( ICDebugUIConstants.ID_SIGNALS_VIEW.equals( context.getId() ) && source instanceof ICDebugElement ) { + ICDebugTarget target = (ICDebugTarget)((ICDebugElement)source).getDebugTarget(); + return target; + } return super.getViewerInput( source, context, update ); } @@ -42,6 +47,8 @@ public class CDefaultViewerInputProvider extends DefaultViewerInputProvider impl protected boolean supportsContextId( String id ) { if ( IDebugUIConstants.ID_REGISTER_VIEW.equals( id ) ) return true; + if ( ICDebugUIConstants.ID_SIGNALS_VIEW.equals( id ) ) + return true; return super.supportsContextId( id ); } } diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/elements/adapters/CStackFrameViewerInputProvider.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/elements/adapters/CStackFrameViewerInputProvider.java index 3d8bffba308..78b194ce452 100644 --- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/elements/adapters/CStackFrameViewerInputProvider.java +++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/elements/adapters/CStackFrameViewerInputProvider.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2010 CodeSourcery and others. + * Copyright (c) 2010, 2011 CodeSourcery 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 @@ -7,13 +7,15 @@ * * Contributors: * CodeSourcery - Initial API and implementation + * Wind River Systems - flexible hierarchy Signals view (bug 338908) *******************************************************************************/ - package org.eclipse.cdt.debug.internal.ui.elements.adapters; +import org.eclipse.cdt.debug.core.model.ICDebugElement; import org.eclipse.cdt.debug.core.model.ICDebugTarget; import org.eclipse.cdt.debug.core.model.ICStackFrame; import org.eclipse.cdt.debug.internal.ui.CRegisterManagerProxies; +import org.eclipse.cdt.debug.ui.ICDebugUIConstants; import org.eclipse.core.runtime.CoreException; import org.eclipse.debug.internal.ui.elements.adapters.StackFrameViewerInputProvider; import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext; @@ -31,6 +33,17 @@ public class CStackFrameViewerInputProvider extends StackFrameViewerInputProvide ICDebugTarget target = (ICDebugTarget)((ICStackFrame)source).getDebugTarget(); return CRegisterManagerProxies.getInstance().getRegisterManagerProxy( target ); } + if ( ICDebugUIConstants.ID_SIGNALS_VIEW.equals( context.getId() ) && source instanceof ICDebugElement ) { + ICDebugTarget target = (ICDebugTarget)((ICDebugElement)source).getDebugTarget(); + return target; + } return super.getViewerInput( source, context, update ); } + + @Override + protected boolean supportsContextId(String id) { + if ( ICDebugUIConstants.ID_SIGNALS_VIEW.equals( id ) ) + return true; + return super.supportsContextId(id); + } } diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/elements/adapters/DefaultViewColumnPresentationFactory.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/elements/adapters/DefaultViewColumnPresentationFactory.java new file mode 100644 index 00000000000..b4ec30a2ec3 --- /dev/null +++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/elements/adapters/DefaultViewColumnPresentationFactory.java @@ -0,0 +1,33 @@ +/******************************************************************************* + * Copyright (c) 2010, 2011 CodeSourcery 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: + * CodeSourcery - Initial API and implementation + * Wind River Systems - flexible hierarchy Signals view (bug 338908) + *******************************************************************************/ +package org.eclipse.cdt.debug.internal.ui.elements.adapters; + +import org.eclipse.cdt.debug.internal.ui.views.signals.SignalsViewColumnPresentation; +import org.eclipse.cdt.debug.ui.ICDebugUIConstants; +import org.eclipse.debug.internal.ui.viewers.model.provisional.IColumnPresentation; +import org.eclipse.debug.internal.ui.viewers.model.provisional.IColumnPresentationFactory; +import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext; + +public class DefaultViewColumnPresentationFactory implements IColumnPresentationFactory { + + public IColumnPresentation createColumnPresentation( IPresentationContext context, Object element ) { + if ( context.getId().equals( ICDebugUIConstants.ID_SIGNALS_VIEW ) ) + return new SignalsViewColumnPresentation(); + return null; + } + + public String getColumnPresentationId( IPresentationContext context, Object element ) { + if ( context.getId().equals( ICDebugUIConstants.ID_SIGNALS_VIEW ) ) + return SignalsViewColumnPresentation.ID; + return null; + } +} diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/signals/FlexibleSignalsView.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/signals/FlexibleSignalsView.java new file mode 100644 index 00000000000..99f65b7a6c3 --- /dev/null +++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/signals/FlexibleSignalsView.java @@ -0,0 +1,244 @@ +/******************************************************************************* + * Copyright (c) 2011 Wind River Systems, Inc. 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: + * Wind River Systems - initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.debug.internal.ui.views.signals; + +import org.eclipse.cdt.debug.internal.ui.ICDebugHelpContextIds; +import org.eclipse.cdt.debug.ui.ICDebugUIConstants; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.debug.internal.ui.DelegatingModelPresentation; +import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelChangedListener; +import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta; +import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelProxy; +import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext; +import org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerInputRequestor; +import org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerInputUpdate; +import org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdate; +import org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdateListener; +import org.eclipse.debug.internal.ui.viewers.model.provisional.PresentationContext; +import org.eclipse.debug.internal.ui.viewers.model.provisional.TreeModelViewer; +import org.eclipse.debug.internal.ui.viewers.model.provisional.ViewerInputService; +import org.eclipse.debug.internal.ui.views.DebugModelPresentationContext; +import org.eclipse.debug.ui.AbstractDebugView; +import org.eclipse.debug.ui.DebugUITools; +import org.eclipse.debug.ui.IDebugModelPresentation; +import org.eclipse.debug.ui.contexts.DebugContextEvent; +import org.eclipse.debug.ui.contexts.IDebugContextListener; +import org.eclipse.jface.action.IAction; +import org.eclipse.jface.action.IMenuManager; +import org.eclipse.jface.action.IToolBarManager; +import org.eclipse.jface.action.Separator; +import org.eclipse.jface.util.IPropertyChangeListener; +import org.eclipse.jface.util.PropertyChangeEvent; +import org.eclipse.jface.viewers.ISelection; +import org.eclipse.jface.viewers.IStructuredSelection; +import org.eclipse.jface.viewers.Viewer; +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.ui.IWorkbenchActionConstants; +import org.eclipse.ui.progress.IWorkbenchSiteProgressService; + +/** + * A Signals view based on flexible hierarchy. + */ +public class FlexibleSignalsView extends AbstractDebugView implements IViewerUpdateListener, IDebugContextListener, IModelChangedListener { + + private PresentationContext fPresentationContext; + + private DelegatingModelPresentation fModelPresentation; + + /** + * Viewer input requester used to update the viewer once the viewer input has been + * resolved. + */ + private IViewerInputRequestor fRequester = new IViewerInputRequestor() { + public void viewerInputComplete(IViewerInputUpdate update) { + if (!update.isCanceled()) { + viewerInputUpdateComplete(update); + } + } + }; + + private ViewerInputService fInputService; + + @Override + protected Viewer createViewer(Composite parent) { + getModelPresentation(); + TreeModelViewer signalsViewer = createTreeViewer(parent); + fInputService = new ViewerInputService(signalsViewer, fRequester); + getSite().setSelectionProvider(signalsViewer); + signalsViewer.addModelChangedListener(this); + signalsViewer.addViewerUpdateListener(this); + return signalsViewer; + } + + /** + * @return the model presentation to be used for this view + */ + protected IDebugModelPresentation getModelPresentation() { + if (fModelPresentation == null) { + fModelPresentation = new DelegatingModelPresentation(); + } + return fModelPresentation; + } + + protected TreeModelViewer createTreeViewer(Composite parent) { + int style = getViewerStyle(); + fPresentationContext = new DebugModelPresentationContext(getPresentationContextId(), this, fModelPresentation); + final TreeModelViewer variablesViewer = new TreeModelViewer(parent, style, fPresentationContext); + + variablesViewer.getPresentationContext().addPropertyChangeListener( + new IPropertyChangeListener() { + public void propertyChange(PropertyChangeEvent event) { + if (IPresentationContext.PROPERTY_COLUMNS.equals(event.getProperty())) { + IAction action = getAction("ShowTypeNames"); //$NON-NLS-1$ + if (action != null) { + action.setEnabled(event.getNewValue() == null); + } + } + } + }); + + DebugUITools.getDebugContextManager().getContextService(getSite().getWorkbenchWindow()).addDebugContextListener(this); + return variablesViewer; + } + + protected void viewerInputUpdateComplete(IViewerInputUpdate update) { + setViewerInput(update.getInputElement()); + } + + /** + * Sets the input to the viewer + * @param context the object context + */ + protected void setViewerInput(Object context) { + Object current = getViewer().getInput(); + + if (current == null && context == null) { + return; + } + + if (current != null && current.equals(context)) { + return; + } + + showViewer(); + getViewer().setInput(context); + } + + /** + * Returns the presentation context id for this view. + * + * @return context id + */ + protected String getPresentationContextId() { + return ICDebugUIConstants.ID_SIGNALS_VIEW; + } + + /** + * Returns the style bits for the viewer. + * + * @return SWT style + */ + protected int getViewerStyle() { + return SWT.MULTI | SWT.V_SCROLL | SWT.H_SCROLL | SWT.VIRTUAL | SWT.FULL_SELECTION; + } + + @Override + protected void createActions() { + } + + @Override + protected String getHelpContextId() { + return ICDebugHelpContextIds.SIGNALS_VIEW; + } + + @Override + protected void fillContextMenu(IMenuManager menu) { + menu.add( new Separator( IWorkbenchActionConstants.MB_ADDITIONS ) ); + updateObjects(); + } + + @Override + protected void configureToolBar(IToolBarManager tbm) { + } + + /* + * @see org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdateListener#viewerUpdatesBegin() + */ + public void viewerUpdatesBegin() { + IWorkbenchSiteProgressService progressService = + (IWorkbenchSiteProgressService)getSite().getAdapter(IWorkbenchSiteProgressService.class); + if (progressService != null) { + progressService.incrementBusy(); + } + } + + /* + * @see org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdateListener#viewerUpdatesComplete() + */ + public void viewerUpdatesComplete() { + IWorkbenchSiteProgressService progressService = + (IWorkbenchSiteProgressService)getSite().getAdapter(IWorkbenchSiteProgressService.class); + if (progressService != null) { + progressService.decrementBusy(); + } + } + + /* + * @see org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdateListener#updateStarted(org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdate) + */ + public void updateStarted(IViewerUpdate update) { + } + + /* + * @see org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdateListener#updateComplete(org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdate) + */ + public void updateComplete(IViewerUpdate update) { + IStatus status = update.getStatus(); + if (!update.isCanceled()) { + if (status != null && !status.isOK()) { + showMessage(status.getMessage()); + } else { + showViewer(); + } + } + } + + /* + * @see org.eclipse.debug.ui.contexts.IDebugContextListener#debugContextChanged(org.eclipse.debug.ui.contexts.DebugContextEvent) + */ + public void debugContextChanged(DebugContextEvent event) { + if ((event.getFlags() & DebugContextEvent.ACTIVATED) > 0) { + contextActivated(event.getContext()); + } + } + + /** + * Updates actions and sets the viewer input when a context is activated. + * @param selection + */ + protected void contextActivated(ISelection selection) { + if (!isAvailable() || !isVisible()) { + return; + } + if (selection instanceof IStructuredSelection) { + Object source = ((IStructuredSelection)selection).getFirstElement(); + fInputService.resolveViewerInput(source); + } + } + + /* + * @see org.eclipse.debug.internal.ui.viewers.model.provisional.IModelChangedListener#modelChanged(org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta, org.eclipse.debug.internal.ui.viewers.model.provisional.IModelProxy) + */ + public void modelChanged(IModelDelta delta, IModelProxy proxy) { + } + +} diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/signals/FlexibleSignalsViewEventHandler.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/signals/FlexibleSignalsViewEventHandler.java new file mode 100644 index 00000000000..f47c38fa180 --- /dev/null +++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/signals/FlexibleSignalsViewEventHandler.java @@ -0,0 +1,93 @@ +/******************************************************************************* + * Copyright (c) 2004, 2011 QNX Software Systems 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: + * QNX Software Systems - Initial API and implementation + * Wind River Systems - flexible hierarchy Signals view (bug 338908) + *******************************************************************************/ +package org.eclipse.cdt.debug.internal.ui.views.signals; + +import org.eclipse.cdt.debug.core.model.ICSignal; +import org.eclipse.debug.core.DebugEvent; +import org.eclipse.debug.core.model.IDebugTarget; +import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta; +import org.eclipse.debug.internal.ui.viewers.model.provisional.ModelDelta; +import org.eclipse.debug.internal.ui.viewers.provisional.AbstractModelProxy; +import org.eclipse.debug.internal.ui.viewers.update.DebugEventHandler; + +/** + */ +public class FlexibleSignalsViewEventHandler extends DebugEventHandler { + + private Object fTarget; + + /** + * Constructor for SignalsViewEventHandler. + */ + public FlexibleSignalsViewEventHandler( AbstractModelProxy proxy, Object target ) { + super( proxy ); + fTarget = target; + } + + @Override + protected boolean handlesEvent( DebugEvent event ) { + int kind = event.getKind(); + if ( kind == DebugEvent.CREATE || + kind == DebugEvent.TERMINATE || + kind == DebugEvent.CHANGE || + kind == DebugEvent.SUSPEND) + return true; + return false; + } + + @Override + protected void handleChange( DebugEvent event ) { + if ( event.getSource() instanceof ICSignal ) + fireDelta( (ICSignal)event.getSource(), IModelDelta.STATE ); + } + + @Override + protected void handleCreate( DebugEvent event ) { + Object source = event.getSource(); + if ( source instanceof IDebugTarget ) { + refreshRoot( event ); + } + else if ( source instanceof ICSignal ) { + if ( accept( (ICSignal)source ) ) { + ICSignal signal = (ICSignal)source; + fireDelta( signal, IModelDelta.ADDED ); + } + } + } + + @Override + protected void handleTerminate( DebugEvent event ) { + Object source = event.getSource(); + if ( source instanceof IDebugTarget ) { + refreshRoot( event ); + } + else if ( source instanceof ICSignal ) { + fireDelta( (ICSignal)source, IModelDelta.REMOVED ); + } + } + + private void fireDelta( ICSignal signal, int flags ) { + ModelDelta root = new ModelDelta( fTarget, IModelDelta.NO_CHANGE ); + root.addNode( signal, flags ); + fireDelta( root ); + } + + @Override + public synchronized void dispose() { + super.dispose(); + fTarget = null; + } + + private boolean accept( ICSignal signal ) { + return fTarget.equals( signal.getDebugTarget() ); + } +} diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/signals/SignalLabelProvider.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/signals/SignalLabelProvider.java new file mode 100644 index 00000000000..c120428863c --- /dev/null +++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/signals/SignalLabelProvider.java @@ -0,0 +1,75 @@ +/******************************************************************************* + * Copyright (c) 2004, 2011 QNX Software Systems 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: + * QNX Software Systems - Initial API and implementation + * Wind River Systems - flexible hierarchy Signals view (bug 338908) + *******************************************************************************/ +package org.eclipse.cdt.debug.internal.ui.views.signals; + +import java.util.Arrays; + +import org.eclipse.cdt.debug.core.model.ICSignal; +import org.eclipse.cdt.debug.internal.ui.CDebugImages; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.debug.core.DebugException; +import org.eclipse.debug.internal.ui.model.elements.ElementLabelProvider; +import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext; +import org.eclipse.jface.resource.ImageDescriptor; +import org.eclipse.jface.viewers.TreePath; + +/** + * Label provider for ICSignals. + */ +public class SignalLabelProvider extends ElementLabelProvider { + + @Override + protected String getLabel(TreePath elementPath, IPresentationContext presentationContext, String columnId) + throws CoreException { + Object element = elementPath.getLastSegment(); + String[] columns = presentationContext.getColumns(); + int columnIdx = columns != null ? Arrays.asList(columns).indexOf(columnId) : 0; + String label = getColumnText(element, columnIdx); + return label != null ? label : ""; //$NON-NLS-1$ + } + + @Override + protected ImageDescriptor getImageDescriptor(TreePath elementPath, IPresentationContext presentationContext, String columnId) + throws CoreException { + Object element = elementPath.getLastSegment(); + if (element instanceof ICSignal) { + String[] columns = presentationContext.getColumns(); + int columnIdx = columns != null ? Arrays.asList(columns).indexOf(columnId) : 0; + if (columnIdx == 0) { + return CDebugImages.DESC_OBJS_SIGNAL; + } + } + return super.getImageDescriptor(elementPath, presentationContext, columnId); + } + + private String getColumnText(Object element, int columnIndex) { + if (element instanceof ICSignal) { + try { + switch (columnIndex) { + case 0: + return ((ICSignal) element).getName(); + case 1: + return (((ICSignal) element).isPassEnabled()) ? SignalsViewer.YES_VALUE + : SignalsViewer.NO_VALUE; + case 2: + return (((ICSignal) element).isStopEnabled()) ? SignalsViewer.YES_VALUE + : SignalsViewer.NO_VALUE; + case 3: + return ((ICSignal) element).getDescription(); + } + } catch (DebugException e) { + } + } + return null; + } + +} diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/signals/SignalsContentProvider.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/signals/SignalsContentProvider.java new file mode 100644 index 00000000000..59557fbda0d --- /dev/null +++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/signals/SignalsContentProvider.java @@ -0,0 +1,53 @@ +/******************************************************************************* + * Copyright (c) 2004, 2011 QNX Software Systems 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: + * QNX Software Systems - Initial API and implementation + * Wind River Systems - flexible hierarchy Signals view (bug 338908) + *******************************************************************************/ +package org.eclipse.cdt.debug.internal.ui.views.signals; + +import org.eclipse.cdt.debug.core.model.ICDebugTarget; +import org.eclipse.cdt.debug.ui.CDebugUIPlugin; +import org.eclipse.cdt.debug.ui.ICDebugUIConstants; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.debug.core.DebugException; +import org.eclipse.debug.internal.ui.model.elements.ElementContentProvider; +import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext; +import org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdate; + +public class SignalsContentProvider extends ElementContentProvider { + + @Override + protected int getChildCount( Object element, IPresentationContext context, IViewerUpdate monitor ) throws CoreException { + return getAllChildren( element, context ).length; + } + + @Override + protected Object[] getChildren( Object parent, int index, int length, IPresentationContext context, IViewerUpdate monitor ) throws CoreException { + return getElements( getAllChildren( parent, context ), index, length ); + } + + @Override + protected boolean supportsContextId( String id ) { + return ICDebugUIConstants.ID_SIGNALS_VIEW.equals( id ); + } + + protected Object[] getAllChildren(Object parent, IPresentationContext context) throws CoreException { + if (parent instanceof ICDebugTarget) { + ICDebugTarget target = (ICDebugTarget) parent; + try { + Object[] signals = target.getSignals(); + if (signals != null) + return signals; + } catch (DebugException e) { + CDebugUIPlugin.log(e); + } + } + return EMPTY; + } +} diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/signals/SignalsViewColumnPresentation.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/signals/SignalsViewColumnPresentation.java new file mode 100644 index 00000000000..071e13b2cdb --- /dev/null +++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/signals/SignalsViewColumnPresentation.java @@ -0,0 +1,94 @@ +/******************************************************************************* + * Copyright (c) 2010, 2011 CodeSourcery 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: + * CodeSourcery - Initial API and implementation + * Wind River Systems - flexible hierarchy Signals view (bug 338908) + *******************************************************************************/ +package org.eclipse.cdt.debug.internal.ui.views.signals; + +import org.eclipse.cdt.debug.ui.CDebugUIPlugin; +import org.eclipse.debug.internal.ui.elements.adapters.VariableColumnPresentation; +import org.eclipse.debug.internal.ui.viewers.model.provisional.IColumnPresentation; +import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext; +import org.eclipse.jface.resource.ImageDescriptor; + +/** + * Signals view column presentation. + */ +public class SignalsViewColumnPresentation implements IColumnPresentation { + + private static final String PREFIX = CDebugUIPlugin.PLUGIN_ID + "."; //$NON-NLS-1$ + + public static final String ID = PREFIX + "signalsViewColumnPresentationId"; //$NON-NLS-1$ + + private static final String COLUMN_ID_NAME = VariableColumnPresentation.COLUMN_VARIABLE_NAME; + private static final String COLUMN_ID_PASS = PREFIX + "signalsColumn.pass"; //$NON-NLS-1$ + private static final String COLUMN_ID_STOP = PREFIX + "signalsColumn.stop"; //$NON-NLS-1$ + private static final String COLUMN_ID_DESC = PREFIX + "signalsColumn.desc"; //$NON-NLS-1$ + + private static final String CL_NAME = SignalsMessages.getString( "SignalsViewer.4" ); //$NON-NLS-1$ + private static final String CL_PASS = SignalsMessages.getString( "SignalsViewer.5" ); //$NON-NLS-1$ + private static final String CL_SUSPEND = SignalsMessages.getString( "SignalsViewer.6" ); //$NON-NLS-1$ + private static final String CL_DESCRIPTION = SignalsMessages.getString( "SignalsViewer.7" ); //$NON-NLS-1$ + + private static final String[] ALL_COLUMNS = new String[] { + COLUMN_ID_NAME, + COLUMN_ID_PASS, + COLUMN_ID_STOP, + COLUMN_ID_DESC + }; + + private static final String[] INITIAL_COLUMNS = new String[] { + COLUMN_ID_NAME, + COLUMN_ID_PASS, + COLUMN_ID_STOP, + COLUMN_ID_DESC + }; + + public void init( IPresentationContext context ) { + } + + public void dispose() { + } + + public String[] getAvailableColumns() { + return ALL_COLUMNS; + } + + public String[] getInitialColumns() { + return INITIAL_COLUMNS; + } + + public String getHeader( String id ) { + if ( COLUMN_ID_NAME.equals( id ) ) { + return CL_NAME; + } + if ( COLUMN_ID_PASS.equals( id ) ) { + return CL_PASS; + } + if ( COLUMN_ID_STOP.equals( id ) ) { + return CL_SUSPEND; + } + if ( COLUMN_ID_DESC.equals( id ) ) { + return CL_DESCRIPTION; + } + return null; + } + + public ImageDescriptor getImageDescriptor( String id ) { + return null; + } + + public String getId() { + return ID; + } + + public boolean isOptional() { + return true; + } +} diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/signals/SignalsViewModelProxy.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/signals/SignalsViewModelProxy.java new file mode 100644 index 00000000000..37dbedbc755 --- /dev/null +++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/signals/SignalsViewModelProxy.java @@ -0,0 +1,42 @@ +/******************************************************************************* + * Copyright (c) 2004, 2011 QNX Software Systems 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: + * QNX Software Systems - Initial API and implementation + * Wind River Systems - flexible hierarchy Signals view (bug 338908) + *******************************************************************************/ +package org.eclipse.cdt.debug.internal.ui.views.signals; + +import org.eclipse.debug.internal.ui.viewers.update.DebugEventHandler; +import org.eclipse.debug.internal.ui.viewers.update.EventHandlerModelProxy; + +/** + * Default update for Signals view. + */ +public class SignalsViewModelProxy extends EventHandlerModelProxy { + + private Object fTarget; + + /** + * Constructor for SignalesViewModelProxy. + */ + public SignalsViewModelProxy( Object target ) { + super(); + fTarget = target; + } + + @Override + protected DebugEventHandler[] createEventHandlers() { + return new DebugEventHandler[] { new FlexibleSignalsViewEventHandler( this, fTarget ) }; + } + + @Override + public synchronized void dispose() { + super.dispose(); + fTarget = null; + } +}