From 304f3b2500b6bdfc15c20f75cfc5cb688e00242a Mon Sep 17 00:00:00 2001 From: Mikhail Khodjaiants Date: Tue, 6 Apr 2010 00:49:45 +0000 Subject: [PATCH] Bug 306569: Dynamic content support for ICDebuggerPage --- .../cdt/debug/ui/AbstractCDebuggerPage.java | 48 +++++++++++++++++-- .../cdt/debug/ui/ICDebuggerPageExtension.java | 41 ++++++++++++++++ .../internal/ui/AbstractCDebuggerTab.java | 18 ++++++- 3 files changed, 103 insertions(+), 4 deletions(-) create mode 100644 debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/ui/ICDebuggerPageExtension.java diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/ui/AbstractCDebuggerPage.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/ui/AbstractCDebuggerPage.java index 6946141cf0f..a449e248452 100644 --- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/ui/AbstractCDebuggerPage.java +++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/ui/AbstractCDebuggerPage.java @@ -10,27 +10,69 @@ *******************************************************************************/ package org.eclipse.cdt.debug.ui; +import org.eclipse.core.runtime.ListenerList; import org.eclipse.debug.ui.AbstractLaunchConfigurationTab; /** * Common function for debugger pages. * @since 3.1 */ -abstract public class AbstractCDebuggerPage extends AbstractLaunchConfigurationTab implements ICDebuggerPage { +abstract public class AbstractCDebuggerPage + extends AbstractLaunchConfigurationTab + implements ICDebuggerPage, ICDebuggerPageExtension { private String fDebuggerID = null; + private ListenerList fContentListeners; - /* (non-Javadoc) + public AbstractCDebuggerPage() { + super(); + fContentListeners = new ListenerList(); + } + + /* (non-Javadoc) * @see org.eclipse.cdt.debug.ui.ICDebuggerPage#init(java.lang.String) */ public void init( String debuggerID ) { fDebuggerID = debuggerID; } - /* (non-Javadoc) + /* (non-Javadoc) + * @see org.eclipse.debug.ui.AbstractLaunchConfigurationTab#dispose() + */ + @Override + public void dispose() { + fContentListeners.clear(); + super.dispose(); + } + + /* (non-Javadoc) * @see org.eclipse.cdt.debug.ui.ICDebuggerPage#getDebuggerIdentifier() */ public String getDebuggerIdentifier() { return fDebuggerID; } + + /* (non-Javadoc) + * @see org.eclipse.cdt.debug.ui.ICDebuggerPageExtension#addContentChangeListener(org.eclipse.cdt.debug.ui.ICDebuggerPageExtension.IContentChangeListener) + */ + public void addContentChangeListener( IContentChangeListener listener ) { + fContentListeners.add( listener ); + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.debug.ui.ICDebuggerPageExtension#removeContentChangeListener(org.eclipse.cdt.debug.ui.ICDebuggerPageExtension.IContentChangeListener) + */ + public void removeContentChangeListener( IContentChangeListener listener ) { + fContentListeners.remove( listener ); + } + + /** + * Notifies the registered listeners that the page's content has changed. + * + * @since 7.0 + */ + protected void contentChanged() { + for ( Object l : fContentListeners.getListeners() ) + ((IContentChangeListener)l).contentChanged(); + } } diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/ui/ICDebuggerPageExtension.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/ui/ICDebuggerPageExtension.java new file mode 100644 index 00000000000..034b2aa3882 --- /dev/null +++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/ui/ICDebuggerPageExtension.java @@ -0,0 +1,41 @@ +/******************************************************************************* + * Copyright (c) 2010 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 + *******************************************************************************/ +package org.eclipse.cdt.debug.ui; + +/** + * This interface extension allows the registration of content listeners. + * Page implementors can use it to notify parents of changes in + * the page content which will force the parent tab to recalculate its size. + * + * @since 7.0 + */ +public interface ICDebuggerPageExtension extends ICDebuggerPage { + + /** + * @since 7.0 + */ + public interface IContentChangeListener { + + void contentChanged(); + } + + /** + * Adds a listener to this page. This method has no effect + * if the same listener is already registered. + */ + void addContentChangeListener( IContentChangeListener listener ); + + /** + * Removes a listener from this list. Has no effect if + * the same listener was not already registered. + */ + void removeContentChangeListener( IContentChangeListener listener ); +} diff --git a/launch/org.eclipse.cdt.launch/src/org/eclipse/cdt/launch/internal/ui/AbstractCDebuggerTab.java b/launch/org.eclipse.cdt.launch/src/org/eclipse/cdt/launch/internal/ui/AbstractCDebuggerTab.java index 074f25d69cd..27b9ad47544 100644 --- a/launch/org.eclipse.cdt.launch/src/org/eclipse/cdt/launch/internal/ui/AbstractCDebuggerTab.java +++ b/launch/org.eclipse.cdt.launch/src/org/eclipse/cdt/launch/internal/ui/AbstractCDebuggerTab.java @@ -17,6 +17,8 @@ import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants; import org.eclipse.cdt.debug.core.ICDebugConfiguration; import org.eclipse.cdt.debug.ui.CDebugUIPlugin; import org.eclipse.cdt.debug.ui.ICDebuggerPage; +import org.eclipse.cdt.debug.ui.ICDebuggerPageExtension; +import org.eclipse.cdt.debug.ui.ICDebuggerPageExtension.IContentChangeListener; import org.eclipse.cdt.launch.ui.CLaunchConfigurationTab; import org.eclipse.core.runtime.CoreException; import org.eclipse.debug.core.ILaunchConfiguration; @@ -48,7 +50,17 @@ public abstract class AbstractCDebuggerTab extends CLaunchConfigurationTab { private boolean fIsInitializing = false; private boolean fPageUpdated; - protected void setDebugConfig(ICDebugConfiguration config) { + private IContentChangeListener fContentListener = new IContentChangeListener() { + + /* (non-Javadoc) + * @see org.eclipse.cdt.debug.ui.ICDebuggerPageExtension.IContentChangeListener#contentChanged() + */ + public void contentChanged() { + contentsChanged(); + } + }; + + protected void setDebugConfig(ICDebugConfiguration config) { fCurrentDebugConfig = config; } @@ -61,7 +73,11 @@ public abstract class AbstractCDebuggerTab extends CLaunchConfigurationTab { } protected void setDynamicTab(ICDebuggerPage tab) { + if ( fDynamicTab instanceof ICDebuggerPageExtension ) + ((ICDebuggerPageExtension)fDynamicTab).removeContentChangeListener( fContentListener ); fDynamicTab = tab; + if ( fDynamicTab instanceof ICDebuggerPageExtension ) + ((ICDebuggerPageExtension)fDynamicTab).addContentChangeListener( fContentListener ); } protected Composite getDynamicTabHolder() {