From 269cca164e8da5efc15e4f3c7a69c1980586b4d6 Mon Sep 17 00:00:00 2001 From: Mikhail Khodjaiants Date: Mon, 30 Jun 2003 02:59:10 +0000 Subject: [PATCH] Fix for PR 39101: No hilight when changing the value of register. --- debug/org.eclipse.cdt.debug.ui/ChangeLog | 5 ++ .../ui/views/registers/RegistersView.java | 78 ++++++++++++++++++- .../ui/views/registers/RegistersViewer.java | 68 ---------------- 3 files changed, 82 insertions(+), 69 deletions(-) diff --git a/debug/org.eclipse.cdt.debug.ui/ChangeLog b/debug/org.eclipse.cdt.debug.ui/ChangeLog index 506627e6b3c..5dcf2956fc9 100644 --- a/debug/org.eclipse.cdt.debug.ui/ChangeLog +++ b/debug/org.eclipse.cdt.debug.ui/ChangeLog @@ -1,3 +1,8 @@ +2003-06-29 Mikhail Khodjaiants + Fix for PR 39101: No hilight when changing the value of register. + * RegistersView.java + * RegistersViewer.java + 2003-06-26 Mikhail Khodjaiants New icon for shared libraries with loaded symbols. * icons/full/ovr16/symbols_ovr.gif: new diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/registers/RegistersView.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/registers/RegistersView.java index 0bbe8445180..026bec1f4b4 100644 --- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/registers/RegistersView.java +++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/registers/RegistersView.java @@ -23,6 +23,7 @@ import org.eclipse.cdt.debug.internal.ui.views.ViewerState; import org.eclipse.cdt.debug.ui.CDebugUIPlugin; import org.eclipse.cdt.debug.ui.ICDebugUIConstants; import org.eclipse.debug.core.DebugException; +import org.eclipse.debug.core.model.IRegister; import org.eclipse.debug.core.model.IStackFrame; import org.eclipse.debug.ui.DebugUITools; import org.eclipse.debug.ui.IDebugModelPresentation; @@ -33,12 +34,17 @@ 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.IColorProvider; import org.eclipse.jface.viewers.IContentProvider; +import org.eclipse.jface.viewers.ILabelProvider; +import org.eclipse.jface.viewers.ILabelProviderListener; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Color; +import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.ISelectionListener; import org.eclipse.ui.IWorkbenchActionConstants; @@ -56,6 +62,76 @@ public class RegistersView extends AbstractDebugEventHandlerView IPropertyChangeListener, IDebugExceptionHandler { + /** + * A label provider that delegates to a debug model + * presentation and adds coloring to registers to + * reflect their changed state + */ + class VariablesViewLabelProvider implements ILabelProvider, IColorProvider + { + private IDebugModelPresentation fPresentation; + + public VariablesViewLabelProvider( IDebugModelPresentation presentation ) + { + fPresentation = presentation; + } + + public IDebugModelPresentation getPresentation() + { + return fPresentation; + } + + public Image getImage( Object element ) + { + return fPresentation.getImage( element ); + } + public String getText( Object element ) + { + return fPresentation.getText( element ); + } + public void addListener( ILabelProviderListener listener ) + { + fPresentation.addListener( listener ); + } + public void dispose() + { + fPresentation.dispose(); + } + public boolean isLabelProperty( Object element, String property ) + { + return fPresentation.isLabelProperty( element, property ); + } + public void removeListener( ILabelProviderListener listener ) + { + fPresentation.removeListener( listener ); + } + + public Color getForeground( Object element ) + { + if ( element instanceof IRegister ) + { + IRegister register = (IRegister)element; + try + { + if ( register.hasValueChanged() ) + { + return CDebugUIPlugin.getPreferenceColor( ICDebugPreferenceConstants.CHANGED_REGISTER_RGB ); + } + } + catch( DebugException e ) + { + CDebugUIPlugin.log( e ); + } + } + return null; + } + + public Color getBackground( Object element ) + { + return null; + } + } + /** * The model presentation used as the label provider for the tree viewer. */ @@ -81,7 +157,7 @@ public class RegistersView extends AbstractDebugEventHandlerView // add tree viewer final TreeViewer vv = new RegistersViewer( parent, SWT.MULTI | SWT.V_SCROLL | SWT.H_SCROLL ); vv.setContentProvider( createContentProvider() ); - vv.setLabelProvider( getModelPresentation() ); + vv.setLabelProvider( new VariablesViewLabelProvider( getModelPresentation() ) ); vv.setUseHashlookup( true ); setAction( SELECT_ALL_ACTION, getAction( VARIABLES_SELECT_ALL_ACTION ) ); getViewSite().getActionBars().updateActionBars(); diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/registers/RegistersViewer.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/registers/RegistersViewer.java index 0de96162677..a1c10a33098 100644 --- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/registers/RegistersViewer.java +++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/registers/RegistersViewer.java @@ -5,17 +5,10 @@ */ package org.eclipse.cdt.debug.internal.ui.views.registers; -import org.eclipse.cdt.debug.internal.ui.preferences.ICDebugPreferenceConstants; -import org.eclipse.cdt.debug.ui.CDebugUIPlugin; -import org.eclipse.debug.core.DebugException; -import org.eclipse.debug.core.model.IVariable; -import org.eclipse.debug.internal.ui.DebugUIPlugin; import org.eclipse.jface.viewers.TreeViewer; -import org.eclipse.swt.graphics.Color; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Item; import org.eclipse.swt.widgets.Tree; -import org.eclipse.swt.widgets.TreeItem; import org.eclipse.swt.widgets.Widget; /** @@ -60,33 +53,10 @@ public class RegistersViewer extends TreeViewer super( tree ); } - /** - * Refresh the view, and then do another pass to - * update the foreground color for values that have changed - * since the last refresh. Values that have not - * changed are drawn with the default system foreground color. - * If the viewer has no selection, ensure that new items - * are visible. - * - * @see Viewer#refresh() - */ public void refresh() { - getControl().setRedraw( false ); super.refresh(); - Item[] children = getChildren( getControl() ); - if ( children != null ) - { - Color c = CDebugUIPlugin.getPreferenceColor( ICDebugPreferenceConstants.CHANGED_REGISTER_RGB ); - for( int i = 0; i < children.length; i++ ) - { - updateColor( (TreeItem)children[i], c ); - } - } - - getControl().setRedraw( true ); - if ( getSelection().isEmpty() && getNewItem() != null ) { if ( !getNewItem().isDisposed() ) @@ -99,44 +69,6 @@ public class RegistersViewer extends TreeViewer //expandToLevel( 2 ); } - /** - * Updates the color of the given item as well - * as all of its children. If the item corresponds - * to a variable that has changed in value, - * it is rendered with the CHANGED_VARIABLE_RGB - * generated foreground color, otherwise the default system - * color is used. - * - * @param item tree item - */ - protected void updateColor( TreeItem item, Color c ) - { - if ( item.getData() instanceof IVariable ) - { - IVariable var = (IVariable)item.getData(); - try - { - if ( var.hasValueChanged() ) - { - item.setForeground( c ); - } - else - { - item.setForeground( null ); - } - } - catch( DebugException e ) - { - DebugUIPlugin.log( e ); - } - } - TreeItem[] children = item.getItems(); - for( int i = 0; i < children.length; i++ ) - { - updateColor( children[i], c ); - } - } - /** * @see AbstractTreeViewer#newItem(Widget, int, int) */