mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-29 19:45:01 +02:00
[239390] [update policy] Update Scopes -- update only visible, update all elements
This commit is contained in:
parent
9384592322
commit
257254880f
29 changed files with 924 additions and 14 deletions
|
@ -36,6 +36,14 @@ action.breakpointHitUpdatePolicy.label = Breakpoint Hit
|
||||||
action.manualUpdatePolicy.label = Manual
|
action.manualUpdatePolicy.label = Manual
|
||||||
action.automaticUpdatePolicy.label = Automatic
|
action.automaticUpdatePolicy.label = Automatic
|
||||||
|
|
||||||
|
menu.updatePolicyAtomic = Updates Atomic
|
||||||
|
action.updatePolicyAtomic.label = Delay run control until updates are complete
|
||||||
|
action.updatePolicyNotAtomic.label = Do NOT Delay run control until updates are complete
|
||||||
|
|
||||||
|
menu.updateScope = Update Scope
|
||||||
|
action.visibleUpdateScope.label = Visible
|
||||||
|
action.allUpdateScope.label = Expanded
|
||||||
|
|
||||||
menu.numberFormat = Number Format
|
menu.numberFormat = Number Format
|
||||||
action.setDefaultNumberFormatHex.label = Hex
|
action.setDefaultNumberFormatHex.label = Hex
|
||||||
action.setDefaultNumberFormatDecimal.label = Decimal
|
action.setDefaultNumberFormatDecimal.label = Decimal
|
||||||
|
@ -43,6 +51,6 @@ action.setDefaultNumberFormatOctal.label = Octal
|
||||||
action.setDefaultNumberFormatBinary.label = Binary
|
action.setDefaultNumberFormatBinary.label = Binary
|
||||||
action.setDefaultNumberFormatNatural.label = Natural
|
action.setDefaultNumberFormatNatural.label = Natural
|
||||||
|
|
||||||
preferencePage.name = DSF Debugging
|
preferencePage.name = DSF Performance
|
||||||
|
|
||||||
action.expandStack.label = E&xpand Stack
|
action.expandStack.label = E&xpand Stack
|
||||||
|
|
|
@ -114,6 +114,26 @@
|
||||||
style="radio">
|
style="radio">
|
||||||
</action>
|
</action>
|
||||||
|
|
||||||
|
<menu id="updateScope"
|
||||||
|
label="%menu.updateScope"
|
||||||
|
path="additions"/>
|
||||||
|
<action
|
||||||
|
class="org.eclipse.dd.dsf.debug.internal.provisional.ui.viewmodel.update.actions.AllUpdateScopeAction"
|
||||||
|
id="org.eclipse.dd.dsf.debug.ui.UpdateScope_All"
|
||||||
|
label="%action.allUpdateScope.label"
|
||||||
|
state="false"
|
||||||
|
menubarPath="updateScope/additions"
|
||||||
|
style="radio">
|
||||||
|
</action>
|
||||||
|
<action
|
||||||
|
class="org.eclipse.dd.dsf.debug.internal.provisional.ui.viewmodel.update.actions.VisibleUpdateScopeAction"
|
||||||
|
id="org.eclipse.dd.dsf.debug.ui.UpdateScope_Visible"
|
||||||
|
label="%action.visibleUpdateScope.label"
|
||||||
|
menubarPath="updateScope/additions"
|
||||||
|
state="true"
|
||||||
|
style="radio">
|
||||||
|
</action>
|
||||||
|
|
||||||
<menu id="updatePolicy"
|
<menu id="updatePolicy"
|
||||||
label="%menu.updatePolicy"
|
label="%menu.updatePolicy"
|
||||||
path="additions"/>
|
path="additions"/>
|
||||||
|
@ -142,6 +162,9 @@
|
||||||
state="true"
|
state="true"
|
||||||
style="radio">
|
style="radio">
|
||||||
</action>
|
</action>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</viewContribution>
|
</viewContribution>
|
||||||
|
|
||||||
<!-- Registers View menu contributions -->
|
<!-- Registers View menu contributions -->
|
||||||
|
@ -201,6 +224,25 @@
|
||||||
style="radio">
|
style="radio">
|
||||||
</action>
|
</action>
|
||||||
|
|
||||||
|
<menu id="updateScope"
|
||||||
|
label="%menu.updateScope"
|
||||||
|
path="additions"/>
|
||||||
|
<action
|
||||||
|
class="org.eclipse.dd.dsf.debug.internal.provisional.ui.viewmodel.update.actions.AllUpdateScopeAction"
|
||||||
|
id="org.eclipse.dd.dsf.debug.ui.UpdateScope_All"
|
||||||
|
label="%action.allUpdateScope.label"
|
||||||
|
menubarPath="updateScope/additions"
|
||||||
|
style="radio">
|
||||||
|
</action>
|
||||||
|
<action
|
||||||
|
class="org.eclipse.dd.dsf.debug.internal.provisional.ui.viewmodel.update.actions.VisibleUpdateScopeAction"
|
||||||
|
id="org.eclipse.dd.dsf.debug.ui.UpdateScope_Visible"
|
||||||
|
label="%action.visibleUpdateScope.label"
|
||||||
|
menubarPath="updateScope/additions"
|
||||||
|
state="true"
|
||||||
|
style="radio">
|
||||||
|
</action>
|
||||||
|
|
||||||
<menu id="updatePolicy"
|
<menu id="updatePolicy"
|
||||||
label="%menu.updatePolicy"
|
label="%menu.updatePolicy"
|
||||||
path="additions"/>
|
path="additions"/>
|
||||||
|
@ -289,6 +331,26 @@
|
||||||
style="radio">
|
style="radio">
|
||||||
</action>
|
</action>
|
||||||
|
|
||||||
|
<menu id="updateScope"
|
||||||
|
label="%menu.updateScope"
|
||||||
|
path="additions"/>
|
||||||
|
<action
|
||||||
|
class="org.eclipse.dd.dsf.debug.internal.provisional.ui.viewmodel.update.actions.AllUpdateScopeAction"
|
||||||
|
id="org.eclipse.dd.dsf.debug.ui.UpdateScope_All"
|
||||||
|
label="%action.allUpdateScope.label"
|
||||||
|
state="false"
|
||||||
|
menubarPath="updateScope/additions"
|
||||||
|
style="radio">
|
||||||
|
</action>
|
||||||
|
<action
|
||||||
|
class="org.eclipse.dd.dsf.debug.internal.provisional.ui.viewmodel.update.actions.VisibleUpdateScopeAction"
|
||||||
|
id="org.eclipse.dd.dsf.debug.ui.UpdateScope_Visible"
|
||||||
|
label="%action.visibleUpdateScope.label"
|
||||||
|
menubarPath="updateScope/additions"
|
||||||
|
state="true"
|
||||||
|
style="radio">
|
||||||
|
</action>
|
||||||
|
|
||||||
<menu id="updatePolicy"
|
<menu id="updatePolicy"
|
||||||
label="%menu.updatePolicy"
|
label="%menu.updatePolicy"
|
||||||
path="additions"/>
|
path="additions"/>
|
||||||
|
@ -352,6 +414,28 @@
|
||||||
state="true"
|
state="true"
|
||||||
style="radio">
|
style="radio">
|
||||||
</action>
|
</action>
|
||||||
|
|
||||||
|
<menu id="updatesAtomic"
|
||||||
|
label="%menu.updatePolicyAtomic"
|
||||||
|
path="additions"/>
|
||||||
|
<action
|
||||||
|
class="org.eclipse.dd.dsf.debug.internal.provisional.ui.viewmodel.update.actions.AtomicUpdatePolicyAction"
|
||||||
|
id="org.eclipse.dd.dsf.debug.ui.UpdatePolicy_Atomic"
|
||||||
|
label="%action.updatePolicyAtomic.label"
|
||||||
|
menubarPath="updatesAtomic/additions"
|
||||||
|
style="radio">
|
||||||
|
</action>
|
||||||
|
<action
|
||||||
|
class="org.eclipse.dd.dsf.debug.internal.provisional.ui.viewmodel.update.actions.NonAtomicUpdatePolicyAction"
|
||||||
|
id="org.eclipse.dd.dsf.debug.ui.UpdatePolicy_NonAtomic"
|
||||||
|
label="%action.updatePolicyNotAtomic.label"
|
||||||
|
menubarPath="updatesAtomic/additions"
|
||||||
|
state="true"
|
||||||
|
style="radio">
|
||||||
|
</action>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</viewContribution>
|
</viewContribution>
|
||||||
|
|
||||||
</extension>
|
</extension>
|
||||||
|
|
|
@ -37,7 +37,7 @@ public class AbstractDebugVMAdapter extends AbstractDMVMAdapter
|
||||||
|
|
||||||
private SteppingController fController;
|
private SteppingController fController;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected IVMProvider createViewModelProvider(IPresentationContext context) {
|
protected IVMProvider createViewModelProvider(IPresentationContext context) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,6 +31,8 @@ import org.eclipse.dd.dsf.debug.service.ICachingService;
|
||||||
import org.eclipse.dd.dsf.debug.service.IExpressions;
|
import org.eclipse.dd.dsf.debug.service.IExpressions;
|
||||||
import org.eclipse.dd.dsf.debug.service.IRegisters;
|
import org.eclipse.dd.dsf.debug.service.IRegisters;
|
||||||
import org.eclipse.dd.dsf.debug.service.IRunControl.ISuspendedDMEvent;
|
import org.eclipse.dd.dsf.debug.service.IRunControl.ISuspendedDMEvent;
|
||||||
|
import org.eclipse.dd.dsf.debug.ui.DsfDebugUITools;
|
||||||
|
import org.eclipse.dd.dsf.debug.ui.IDsfDebugUIConstants;
|
||||||
import org.eclipse.dd.dsf.service.DsfServicesTracker;
|
import org.eclipse.dd.dsf.service.DsfServicesTracker;
|
||||||
import org.eclipse.dd.dsf.service.DsfSession;
|
import org.eclipse.dd.dsf.service.DsfSession;
|
||||||
import org.eclipse.dd.dsf.ui.viewmodel.AbstractVMAdapter;
|
import org.eclipse.dd.dsf.ui.viewmodel.AbstractVMAdapter;
|
||||||
|
@ -51,6 +53,7 @@ import org.eclipse.debug.internal.core.IExpressionsListener2;
|
||||||
import org.eclipse.debug.internal.ui.viewers.model.provisional.IColumnPresentation;
|
import org.eclipse.debug.internal.ui.viewers.model.provisional.IColumnPresentation;
|
||||||
import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
|
import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
|
||||||
import org.eclipse.debug.internal.ui.viewers.model.provisional.ModelDelta;
|
import org.eclipse.debug.internal.ui.viewers.model.provisional.ModelDelta;
|
||||||
|
import org.eclipse.jface.preference.IPreferenceStore;
|
||||||
import org.eclipse.jface.util.IPropertyChangeListener;
|
import org.eclipse.jface.util.IPropertyChangeListener;
|
||||||
import org.eclipse.jface.util.PropertyChangeEvent;
|
import org.eclipse.jface.util.PropertyChangeEvent;
|
||||||
import org.eclipse.jface.viewers.TreePath;
|
import org.eclipse.jface.viewers.TreePath;
|
||||||
|
@ -95,6 +98,15 @@ public class ExpressionVMProvider extends AbstractDMVMProvider
|
||||||
DebugPlugin.getDefault().getExpressionManager().addExpressionListener(this);
|
DebugPlugin.getDefault().getExpressionManager().addExpressionListener(this);
|
||||||
|
|
||||||
configureLayout();
|
configureLayout();
|
||||||
|
|
||||||
|
final IPreferenceStore store = DsfDebugUITools.getPreferenceStore();
|
||||||
|
store.addPropertyChangeListener(new IPropertyChangeListener()
|
||||||
|
{
|
||||||
|
public void propertyChange(PropertyChangeEvent event) {
|
||||||
|
setAtomicUpdate(store.getBoolean(IDsfDebugUIConstants.PREF_ATOMIC_UPDATE_ENABLE));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
setAtomicUpdate(store.getBoolean(IDsfDebugUIConstants.PREF_ATOMIC_UPDATE_ENABLE));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -22,6 +22,8 @@ import org.eclipse.dd.dsf.debug.service.ICachingService;
|
||||||
import org.eclipse.dd.dsf.debug.service.IRegisters;
|
import org.eclipse.dd.dsf.debug.service.IRegisters;
|
||||||
import org.eclipse.dd.dsf.debug.service.IRunControl.IExecutionDMContext;
|
import org.eclipse.dd.dsf.debug.service.IRunControl.IExecutionDMContext;
|
||||||
import org.eclipse.dd.dsf.debug.service.IRunControl.ISuspendedDMEvent;
|
import org.eclipse.dd.dsf.debug.service.IRunControl.ISuspendedDMEvent;
|
||||||
|
import org.eclipse.dd.dsf.debug.ui.DsfDebugUITools;
|
||||||
|
import org.eclipse.dd.dsf.debug.ui.IDsfDebugUIConstants;
|
||||||
import org.eclipse.dd.dsf.service.DsfServicesTracker;
|
import org.eclipse.dd.dsf.service.DsfServicesTracker;
|
||||||
import org.eclipse.dd.dsf.service.DsfSession;
|
import org.eclipse.dd.dsf.service.DsfSession;
|
||||||
import org.eclipse.dd.dsf.ui.viewmodel.AbstractVMAdapter;
|
import org.eclipse.dd.dsf.ui.viewmodel.AbstractVMAdapter;
|
||||||
|
@ -36,6 +38,7 @@ import org.eclipse.dd.dsf.ui.viewmodel.update.ManualUpdatePolicy;
|
||||||
import org.eclipse.debug.internal.ui.viewers.model.provisional.IColumnPresentation;
|
import org.eclipse.debug.internal.ui.viewers.model.provisional.IColumnPresentation;
|
||||||
import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
|
import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
|
||||||
import org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerInputUpdate;
|
import org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerInputUpdate;
|
||||||
|
import org.eclipse.jface.preference.IPreferenceStore;
|
||||||
import org.eclipse.jface.util.IPropertyChangeListener;
|
import org.eclipse.jface.util.IPropertyChangeListener;
|
||||||
import org.eclipse.jface.util.PropertyChangeEvent;
|
import org.eclipse.jface.util.PropertyChangeEvent;
|
||||||
|
|
||||||
|
@ -86,6 +89,15 @@ public class RegisterVMProvider extends AbstractDMVMProvider
|
||||||
* Now set this schema set as the layout set.
|
* Now set this schema set as the layout set.
|
||||||
*/
|
*/
|
||||||
setRootNode(rootNode);
|
setRootNode(rootNode);
|
||||||
|
|
||||||
|
final IPreferenceStore store = DsfDebugUITools.getPreferenceStore();
|
||||||
|
store.addPropertyChangeListener(new IPropertyChangeListener()
|
||||||
|
{
|
||||||
|
public void propertyChange(PropertyChangeEvent event) {
|
||||||
|
setAtomicUpdate(store.getBoolean(IDsfDebugUIConstants.PREF_ATOMIC_UPDATE_ENABLE));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
setAtomicUpdate(store.getBoolean(IDsfDebugUIConstants.PREF_ATOMIC_UPDATE_ENABLE));
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -0,0 +1,23 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2008 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
|
||||||
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* Wind River Systems - initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
package org.eclipse.dd.dsf.debug.internal.provisional.ui.viewmodel.update.actions;
|
||||||
|
|
||||||
|
import org.eclipse.dd.dsf.ui.viewmodel.update.AllUpdateScope;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class AllUpdateScopeAction extends SelectUpdateScopeAction {
|
||||||
|
|
||||||
|
public AllUpdateScopeAction() {
|
||||||
|
super(AllUpdateScope.ALL_UPDATE_SCOPE_ID);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,35 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2008 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
|
||||||
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* Wind River Systems - initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
package org.eclipse.dd.dsf.debug.internal.provisional.ui.viewmodel.update.actions;
|
||||||
|
|
||||||
|
import org.eclipse.dd.dsf.debug.internal.provisional.ui.viewmodel.actions.AbstractVMProviderActionDelegate;
|
||||||
|
import org.eclipse.dd.dsf.debug.internal.ui.DsfDebugUIPlugin;
|
||||||
|
import org.eclipse.jface.action.IAction;
|
||||||
|
import org.eclipse.jface.viewers.ISelection;
|
||||||
|
|
||||||
|
public class AtomicUpdatePolicyAction extends AbstractVMProviderActionDelegate {
|
||||||
|
|
||||||
|
private final static String ATOMIC_UPDATE = "ATOMIC_UPDATE";
|
||||||
|
|
||||||
|
public void run(IAction action) {
|
||||||
|
DsfDebugUIPlugin.getDefault().getPreferenceStore().setValue(ATOMIC_UPDATE, "true");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void selectionChanged(IAction action, ISelection selection) {
|
||||||
|
super.selectionChanged(action, selection);
|
||||||
|
|
||||||
|
this.getAction().setChecked(DsfDebugUIPlugin.getDefault().getPreferenceStore().getBoolean(ATOMIC_UPDATE));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,34 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2008 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
|
||||||
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* Wind River Systems - initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
package org.eclipse.dd.dsf.debug.internal.provisional.ui.viewmodel.update.actions;
|
||||||
|
|
||||||
|
import org.eclipse.dd.dsf.debug.internal.provisional.ui.viewmodel.actions.AbstractVMProviderActionDelegate;
|
||||||
|
import org.eclipse.dd.dsf.debug.internal.ui.DsfDebugUIPlugin;
|
||||||
|
import org.eclipse.jface.action.IAction;
|
||||||
|
import org.eclipse.jface.viewers.ISelection;
|
||||||
|
|
||||||
|
public class NonAtomicUpdatePolicyAction extends AbstractVMProviderActionDelegate {
|
||||||
|
|
||||||
|
private final static String ATOMIC_UPDATE = "ATOMIC_UPDATE";
|
||||||
|
|
||||||
|
public void run(IAction action) {
|
||||||
|
DsfDebugUIPlugin.getDefault().getPreferenceStore().setValue(ATOMIC_UPDATE, "false");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void selectionChanged(IAction action, ISelection selection) {
|
||||||
|
super.selectionChanged(action, selection);
|
||||||
|
|
||||||
|
getAction().setChecked(DsfDebugUIPlugin.getDefault().getPreferenceStore().getBoolean(ATOMIC_UPDATE));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,88 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2007, 2008 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
|
||||||
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* Wind River Systems - initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
package org.eclipse.dd.dsf.debug.internal.provisional.ui.viewmodel.update.actions;
|
||||||
|
|
||||||
|
import org.eclipse.dd.dsf.debug.internal.provisional.ui.viewmodel.actions.AbstractVMProviderActionDelegate;
|
||||||
|
import org.eclipse.dd.dsf.ui.viewmodel.IVMProvider;
|
||||||
|
import org.eclipse.dd.dsf.ui.viewmodel.update.ICachingVMProvider;
|
||||||
|
import org.eclipse.dd.dsf.ui.viewmodel.update.IVMUpdateScope;
|
||||||
|
import org.eclipse.debug.ui.contexts.DebugContextEvent;
|
||||||
|
import org.eclipse.jface.action.IAction;
|
||||||
|
import org.eclipse.jface.viewers.ISelection;
|
||||||
|
import org.eclipse.ui.IViewPart;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class SelectUpdateScopeAction extends AbstractVMProviderActionDelegate {
|
||||||
|
|
||||||
|
private final String fUpdateScopeId;
|
||||||
|
|
||||||
|
public SelectUpdateScopeAction(String policyId) {
|
||||||
|
fUpdateScopeId = policyId;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected String getUpdateScopeId() {
|
||||||
|
return fUpdateScopeId;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void init(IViewPart view) {
|
||||||
|
super.init(view);
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void run(IAction action) {
|
||||||
|
if(action.isChecked())
|
||||||
|
{
|
||||||
|
IVMProvider provider = getVMProvider();
|
||||||
|
if (provider instanceof ICachingVMProvider) {
|
||||||
|
ICachingVMProvider cachingProvider = (ICachingVMProvider)provider;
|
||||||
|
IVMUpdateScope policy = getScopeFromProvider(cachingProvider, getUpdateScopeId());
|
||||||
|
if (policy != null) {
|
||||||
|
cachingProvider.setActiveUpdateScope(policy);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private IVMUpdateScope getScopeFromProvider(ICachingVMProvider provider, String id) {
|
||||||
|
for (IVMUpdateScope policy : provider.getAvailableUpdateScopes()) {
|
||||||
|
if (policy.getID().equals(id)) {
|
||||||
|
return policy;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void selectionChanged(IAction action, ISelection selection) {
|
||||||
|
super.selectionChanged(action, selection);
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void debugContextChanged(DebugContextEvent event) {
|
||||||
|
super.debugContextChanged(event);
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void update() {
|
||||||
|
IVMProvider provider = getVMProvider();
|
||||||
|
if (provider instanceof ICachingVMProvider) {
|
||||||
|
getAction().setEnabled(true);
|
||||||
|
IVMUpdateScope activeScope = ((ICachingVMProvider)provider).getActiveUpdateScope();
|
||||||
|
getAction().setChecked( activeScope != null && getUpdateScopeId().equals(activeScope.getID()) );
|
||||||
|
} else {
|
||||||
|
getAction().setEnabled(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,23 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2008 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
|
||||||
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* Wind River Systems - initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
package org.eclipse.dd.dsf.debug.internal.provisional.ui.viewmodel.update.actions;
|
||||||
|
|
||||||
|
import org.eclipse.dd.dsf.ui.viewmodel.update.VisibleUpdateScope;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class VisibleUpdateScopeAction extends SelectUpdateScopeAction {
|
||||||
|
|
||||||
|
public VisibleUpdateScopeAction() {
|
||||||
|
super(VisibleUpdateScope.VISIBLE_UPDATE_SCOPE_ID);
|
||||||
|
}
|
||||||
|
}
|
|
@ -19,6 +19,8 @@ import org.eclipse.dd.dsf.debug.internal.ui.DsfDebugUIPlugin;
|
||||||
import org.eclipse.dd.dsf.debug.service.ICachingService;
|
import org.eclipse.dd.dsf.debug.service.ICachingService;
|
||||||
import org.eclipse.dd.dsf.debug.service.IExpressions;
|
import org.eclipse.dd.dsf.debug.service.IExpressions;
|
||||||
import org.eclipse.dd.dsf.debug.service.IRunControl.ISuspendedDMEvent;
|
import org.eclipse.dd.dsf.debug.service.IRunControl.ISuspendedDMEvent;
|
||||||
|
import org.eclipse.dd.dsf.debug.ui.DsfDebugUITools;
|
||||||
|
import org.eclipse.dd.dsf.debug.ui.IDsfDebugUIConstants;
|
||||||
import org.eclipse.dd.dsf.service.DsfServicesTracker;
|
import org.eclipse.dd.dsf.service.DsfServicesTracker;
|
||||||
import org.eclipse.dd.dsf.service.DsfSession;
|
import org.eclipse.dd.dsf.service.DsfSession;
|
||||||
import org.eclipse.dd.dsf.ui.viewmodel.AbstractVMAdapter;
|
import org.eclipse.dd.dsf.ui.viewmodel.AbstractVMAdapter;
|
||||||
|
@ -32,6 +34,7 @@ import org.eclipse.dd.dsf.ui.viewmodel.update.ManualUpdatePolicy;
|
||||||
import org.eclipse.debug.internal.ui.viewers.model.provisional.IColumnPresentation;
|
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.IColumnPresentationFactory;
|
||||||
import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
|
import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
|
||||||
|
import org.eclipse.jface.preference.IPreferenceStore;
|
||||||
import org.eclipse.jface.util.IPropertyChangeListener;
|
import org.eclipse.jface.util.IPropertyChangeListener;
|
||||||
import org.eclipse.jface.util.PropertyChangeEvent;
|
import org.eclipse.jface.util.PropertyChangeEvent;
|
||||||
|
|
||||||
|
@ -65,6 +68,15 @@ public class VariableVMProvider extends AbstractDMVMProvider
|
||||||
// Configure the sub-expression node to be a child of itself. This way the content
|
// Configure the sub-expression node to be a child of itself. This way the content
|
||||||
// provider will recursively drill-down the variable hierarchy.
|
// provider will recursively drill-down the variable hierarchy.
|
||||||
addChildNodes(subExpressioNode, new IVMNode[] { subExpressioNode });
|
addChildNodes(subExpressioNode, new IVMNode[] { subExpressioNode });
|
||||||
|
|
||||||
|
final IPreferenceStore store = DsfDebugUITools.getPreferenceStore();
|
||||||
|
store.addPropertyChangeListener(new IPropertyChangeListener()
|
||||||
|
{
|
||||||
|
public void propertyChange(PropertyChangeEvent event) {
|
||||||
|
setAtomicUpdate(store.getBoolean(IDsfDebugUIConstants.PREF_ATOMIC_UPDATE_ENABLE));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
setAtomicUpdate(store.getBoolean(IDsfDebugUIConstants.PREF_ATOMIC_UPDATE_ENABLE));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -95,6 +95,15 @@ public class DsfDebugPreferencePage extends FieldEditorPreferencePage implements
|
||||||
minIntervalEditor.fillIntoGrid(performanceGroup, 3);
|
minIntervalEditor.fillIntoGrid(performanceGroup, 3);
|
||||||
addField(minIntervalEditor);
|
addField(minIntervalEditor);
|
||||||
|
|
||||||
|
// atomic update
|
||||||
|
BooleanFieldEditor atomicUpdateEditor = new BooleanFieldEditor(
|
||||||
|
IDsfDebugUIConstants.PREF_ATOMIC_UPDATE_ENABLE,
|
||||||
|
MessagesForPreferences.DsfDebugPreferencePage_atomicUpdate_label,
|
||||||
|
performanceGroup);
|
||||||
|
|
||||||
|
atomicUpdateEditor.fillIntoGrid(performanceGroup, 3);
|
||||||
|
addField(atomicUpdateEditor);
|
||||||
|
|
||||||
// need to set layout again
|
// need to set layout again
|
||||||
performanceGroup.setLayout(groupLayout);
|
performanceGroup.setLayout(groupLayout);
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,6 +26,8 @@ class MessagesForPreferences extends NLS {
|
||||||
|
|
||||||
public static String DsfDebugPreferencePage_syncStepping_label;
|
public static String DsfDebugPreferencePage_syncStepping_label;
|
||||||
|
|
||||||
|
public static String DsfDebugPreferencePage_atomicUpdate_label;
|
||||||
|
|
||||||
static {
|
static {
|
||||||
// initialize resource bundle
|
// initialize resource bundle
|
||||||
NLS.initializeMessages(BUNDLE_NAME, MessagesForPreferences.class);
|
NLS.initializeMessages(BUNDLE_NAME, MessagesForPreferences.class);
|
||||||
|
|
|
@ -14,3 +14,4 @@ DsfDebugPreferencePage_limitStackFrames_label=Limit number of stack frames to
|
||||||
DsfDebugPreferencePage_minStepInterval_label=Minimum interval between steps (in milliseconds)
|
DsfDebugPreferencePage_minStepInterval_label=Minimum interval between steps (in milliseconds)
|
||||||
DsfDebugPreferencePage_performanceGroup_label=Performance
|
DsfDebugPreferencePage_performanceGroup_label=Performance
|
||||||
DsfDebugPreferencePage_syncStepping_label=Synchronize stepping speed with UI updates
|
DsfDebugPreferencePage_syncStepping_label=Synchronize stepping speed with UI updates
|
||||||
|
DsfDebugPreferencePage_atomicUpdate_label=Atomic Update
|
|
@ -0,0 +1,24 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2008 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
|
||||||
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* Wind River Systems - initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
package org.eclipse.dd.dsf.debug.ui;
|
||||||
|
|
||||||
|
import org.eclipse.dd.dsf.debug.internal.ui.DsfDebugUIPlugin;
|
||||||
|
import org.eclipse.jface.preference.IPreferenceStore;
|
||||||
|
|
||||||
|
public class DsfDebugUITools {
|
||||||
|
|
||||||
|
public static IPreferenceStore getPreferenceStore()
|
||||||
|
{
|
||||||
|
return DsfDebugUIPlugin.getDefault().getPreferenceStore();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -89,6 +89,13 @@ public interface IDsfDebugUIConstants {
|
||||||
*/
|
*/
|
||||||
public static final String PREF_MIN_STEP_INTERVAL= "minStepInterval"; //$NON-NLS-1$
|
public static final String PREF_MIN_STEP_INTERVAL= "minStepInterval"; //$NON-NLS-1$
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Boolean preference whether to wait for view update before continuing run control requests
|
||||||
|
*
|
||||||
|
* @since 1.1
|
||||||
|
*/
|
||||||
|
public static final String PREF_ATOMIC_UPDATE_ENABLE = "atomicUpdateEnable"; //$NON-NLS-1$
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Help prefixes.
|
* Help prefixes.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -52,7 +52,7 @@ import org.eclipse.jface.viewers.Viewer;
|
||||||
*/
|
*/
|
||||||
@ConfinedToDsfExecutor("#getProvider()#getExecutor()")
|
@ConfinedToDsfExecutor("#getProvider()#getExecutor()")
|
||||||
@SuppressWarnings("restriction")
|
@SuppressWarnings("restriction")
|
||||||
public class DefaultVMModelProxyStrategy implements IVMModelProxy {
|
public class DefaultVMModelProxyStrategy implements IVMModelProxy, IVMModelProxyExtension {
|
||||||
|
|
||||||
private final AbstractVMProvider fProvider;
|
private final AbstractVMProvider fProvider;
|
||||||
private final Object fRootElement;
|
private final Object fRootElement;
|
||||||
|
@ -103,6 +103,14 @@ public class DefaultVMModelProxyStrategy implements IVMModelProxy {
|
||||||
return fRootElement;
|
return fRootElement;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Object getViewerInput() {
|
||||||
|
return fRootElement;
|
||||||
|
}
|
||||||
|
|
||||||
|
public TreePath getRootPath() {
|
||||||
|
return TreePath.EMPTY;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Notifies registered listeners of the given delta.
|
* Notifies registered listeners of the given delta.
|
||||||
*
|
*
|
||||||
|
@ -230,7 +238,7 @@ public class DefaultVMModelProxyStrategy implements IVMModelProxy {
|
||||||
*
|
*
|
||||||
* @return viewer or <code>null</code> if not installed
|
* @return viewer or <code>null</code> if not installed
|
||||||
*/
|
*/
|
||||||
protected Viewer getViewer() {
|
public Viewer getViewer() {
|
||||||
return fViewer;
|
return fViewer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,39 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2007, 2008 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
|
||||||
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* Wind River Systems - initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
package org.eclipse.dd.dsf.ui.viewmodel;
|
||||||
|
|
||||||
|
import org.eclipse.jface.viewers.TreePath;
|
||||||
|
import org.eclipse.jface.viewers.Viewer;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* View Model extension to IVMModelProxy interface. This extension
|
||||||
|
* allows access to the viewer.
|
||||||
|
*/
|
||||||
|
public interface IVMModelProxyExtension extends IVMModelProxy {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the viewer.
|
||||||
|
*/
|
||||||
|
public Viewer getViewer();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the viewer input that was set to the viewer when this proxy
|
||||||
|
* was created.
|
||||||
|
*/
|
||||||
|
public Object getViewerInput();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the full path for the root element. If the path is empty, it
|
||||||
|
* means that the root element is the viewer input.
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public TreePath getRootPath();
|
||||||
|
}
|
|
@ -19,6 +19,7 @@ import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.concurrent.Executor;
|
import java.util.concurrent.Executor;
|
||||||
|
|
||||||
|
import org.eclipse.core.runtime.IAdaptable;
|
||||||
import org.eclipse.core.runtime.IStatus;
|
import org.eclipse.core.runtime.IStatus;
|
||||||
import org.eclipse.core.runtime.Platform;
|
import org.eclipse.core.runtime.Platform;
|
||||||
import org.eclipse.dd.dsf.concurrent.CountingRequestMonitor;
|
import org.eclipse.dd.dsf.concurrent.CountingRequestMonitor;
|
||||||
|
@ -34,6 +35,7 @@ import org.eclipse.dd.dsf.ui.concurrent.ViewerDataRequestMonitor;
|
||||||
import org.eclipse.dd.dsf.ui.viewmodel.AbstractVMAdapter;
|
import org.eclipse.dd.dsf.ui.viewmodel.AbstractVMAdapter;
|
||||||
import org.eclipse.dd.dsf.ui.viewmodel.AbstractVMProvider;
|
import org.eclipse.dd.dsf.ui.viewmodel.AbstractVMProvider;
|
||||||
import org.eclipse.dd.dsf.ui.viewmodel.IVMModelProxy;
|
import org.eclipse.dd.dsf.ui.viewmodel.IVMModelProxy;
|
||||||
|
import org.eclipse.dd.dsf.ui.viewmodel.IVMModelProxyExtension;
|
||||||
import org.eclipse.dd.dsf.ui.viewmodel.IVMNode;
|
import org.eclipse.dd.dsf.ui.viewmodel.IVMNode;
|
||||||
import org.eclipse.dd.dsf.ui.viewmodel.VMChildrenCountUpdate;
|
import org.eclipse.dd.dsf.ui.viewmodel.VMChildrenCountUpdate;
|
||||||
import org.eclipse.dd.dsf.ui.viewmodel.VMChildrenUpdate;
|
import org.eclipse.dd.dsf.ui.viewmodel.VMChildrenUpdate;
|
||||||
|
@ -41,19 +43,29 @@ import org.eclipse.dd.dsf.ui.viewmodel.VMHasChildrenUpdate;
|
||||||
import org.eclipse.dd.dsf.ui.viewmodel.properties.IElementPropertiesProvider;
|
import org.eclipse.dd.dsf.ui.viewmodel.properties.IElementPropertiesProvider;
|
||||||
import org.eclipse.debug.internal.ui.viewers.model.provisional.IChildrenCountUpdate;
|
import org.eclipse.debug.internal.ui.viewers.model.provisional.IChildrenCountUpdate;
|
||||||
import org.eclipse.debug.internal.ui.viewers.model.provisional.IChildrenUpdate;
|
import org.eclipse.debug.internal.ui.viewers.model.provisional.IChildrenUpdate;
|
||||||
|
import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementLabelProvider;
|
||||||
import org.eclipse.debug.internal.ui.viewers.model.provisional.IHasChildrenUpdate;
|
import org.eclipse.debug.internal.ui.viewers.model.provisional.IHasChildrenUpdate;
|
||||||
|
import org.eclipse.debug.internal.ui.viewers.model.provisional.ILabelUpdate;
|
||||||
import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta;
|
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.IModelProxy;
|
||||||
import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
|
import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
|
||||||
import org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdate;
|
import org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdate;
|
||||||
import org.eclipse.debug.internal.ui.viewers.model.provisional.ModelDelta;
|
import org.eclipse.debug.internal.ui.viewers.model.provisional.ModelDelta;
|
||||||
|
import org.eclipse.jface.resource.ImageDescriptor;
|
||||||
import org.eclipse.jface.viewers.TreePath;
|
import org.eclipse.jface.viewers.TreePath;
|
||||||
|
import org.eclipse.jface.viewers.TreeViewer;
|
||||||
|
import org.eclipse.swt.graphics.FontData;
|
||||||
|
import org.eclipse.swt.graphics.RGB;
|
||||||
|
import org.eclipse.swt.widgets.Tree;
|
||||||
|
import org.eclipse.swt.widgets.TreeItem;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Base implementation of a caching view model provider.
|
* Base implementation of a caching view model provider.
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("restriction")
|
@SuppressWarnings("restriction")
|
||||||
public class AbstractCachingVMProvider extends AbstractVMProvider implements ICachingVMProvider {
|
public class AbstractCachingVMProvider extends AbstractVMProvider implements ICachingVMProvider, ICachingVMProviderExtension {
|
||||||
|
|
||||||
|
private boolean fIsAtomicUpdate = false;
|
||||||
|
|
||||||
// debug flags
|
// debug flags
|
||||||
public static boolean DEBUG_CACHE = false;
|
public static boolean DEBUG_CACHE = false;
|
||||||
|
@ -293,8 +305,10 @@ public class AbstractCachingVMProvider extends AbstractVMProvider implements ICa
|
||||||
}
|
}
|
||||||
|
|
||||||
protected static String SELECTED_UPDATE_MODE = "org.eclipse.dd.dsf.ui.viewmodel.update.selectedUpdateMode"; //$NON-NLS-1$
|
protected static String SELECTED_UPDATE_MODE = "org.eclipse.dd.dsf.ui.viewmodel.update.selectedUpdateMode"; //$NON-NLS-1$
|
||||||
|
protected static String SELECTED_UPDATE_SCOPE = "org.eclipse.dd.dsf.ui.viewmodel.update.selectedUpdateScope"; //$NON-NLS-1$
|
||||||
|
|
||||||
private IVMUpdatePolicy[] fAvailableUpdatePolicies;
|
private IVMUpdatePolicy[] fAvailableUpdatePolicies;
|
||||||
|
private IVMUpdateScope[] fAvailableUpdateScopes;
|
||||||
|
|
||||||
public Map<Object, RootElementMarkerKey> fRootMarkers = new HashMap<Object, RootElementMarkerKey>();
|
public Map<Object, RootElementMarkerKey> fRootMarkers = new HashMap<Object, RootElementMarkerKey>();
|
||||||
|
|
||||||
|
@ -328,12 +342,19 @@ public class AbstractCachingVMProvider extends AbstractVMProvider implements ICa
|
||||||
fCacheListHead.fPrevious = fCacheListHead;
|
fCacheListHead.fPrevious = fCacheListHead;
|
||||||
|
|
||||||
fAvailableUpdatePolicies = createUpdateModes();
|
fAvailableUpdatePolicies = createUpdateModes();
|
||||||
|
|
||||||
|
fAvailableUpdateScopes = createUpdateScopes();
|
||||||
|
setActiveUpdateScope(new VisibleUpdateScope());
|
||||||
}
|
}
|
||||||
|
|
||||||
protected IVMUpdatePolicy[] createUpdateModes() {
|
protected IVMUpdatePolicy[] createUpdateModes() {
|
||||||
return new IVMUpdatePolicy[] { new AutomaticUpdatePolicy() };
|
return new IVMUpdatePolicy[] { new AutomaticUpdatePolicy() };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected IVMUpdateScope[] createUpdateScopes() {
|
||||||
|
return new IVMUpdateScope[] { new VisibleUpdateScope(), new AllUpdateScope() };
|
||||||
|
}
|
||||||
|
|
||||||
public IVMUpdatePolicy[] getAvailableUpdatePolicies() {
|
public IVMUpdatePolicy[] getAvailableUpdatePolicies() {
|
||||||
return fAvailableUpdatePolicies;
|
return fAvailableUpdatePolicies;
|
||||||
}
|
}
|
||||||
|
@ -697,12 +718,239 @@ public class AbstractCachingVMProvider extends AbstractVMProvider implements ICa
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void handleEvent(final IVMModelProxy proxyStrategy, final Object event, RequestMonitor rm) {
|
protected void handleEvent(final IVMModelProxy proxyStrategy, final Object event, final RequestMonitor rm) {
|
||||||
IElementUpdateTester elementTester = getActiveUpdatePolicy().getElementUpdateTester(event);
|
IElementUpdateTester elementTester = getActiveUpdatePolicy().getElementUpdateTester(event);
|
||||||
|
|
||||||
flush(new FlushMarkerKey(proxyStrategy.getRootElement(), elementTester));
|
flush(new FlushMarkerKey(proxyStrategy.getRootElement(), elementTester));
|
||||||
|
|
||||||
super.handleEvent(proxyStrategy, event, rm);
|
if (proxyStrategy instanceof IVMModelProxyExtension) {
|
||||||
|
IVMModelProxyExtension proxyStrategyExtension = (IVMModelProxyExtension)proxyStrategy;
|
||||||
|
if(fIsAtomicUpdate) {
|
||||||
|
if(this.getActiveUpdateScope().getID().equals(AllUpdateScope.ALL_UPDATE_SCOPE_ID)) {
|
||||||
|
updateExpanded(
|
||||||
|
proxyStrategyExtension,
|
||||||
|
proxyStrategyExtension.getViewerInput(), proxyStrategyExtension.getRootPath(),
|
||||||
|
new RequestMonitor(getExecutor(), null) {
|
||||||
|
@Override
|
||||||
|
protected void handleCompleted() {
|
||||||
|
AbstractCachingVMProvider.super.handleEvent(proxyStrategy, event, rm);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
// block updating only the viewport
|
||||||
|
|
||||||
|
TreeViewer viewer = (TreeViewer) proxyStrategyExtension.getViewer();
|
||||||
|
Tree tree = viewer.getTree();
|
||||||
|
int count[] = { tree.getSize().y / tree.getItemHeight() };
|
||||||
|
|
||||||
|
final CountingRequestMonitor multiRm = new CountingRequestMonitor(getExecutor(), rm);
|
||||||
|
multiRm.setDoneCount(count[0] + 1);
|
||||||
|
|
||||||
|
ArrayList<IChildrenUpdate> childrenUpdateVector = new ArrayList<IChildrenUpdate>();
|
||||||
|
|
||||||
|
updateVisibleExpanded(tree, new TreeItem[] { tree.getTopItem() }, count, viewer, proxyStrategyExtension,
|
||||||
|
multiRm, childrenUpdateVector);
|
||||||
|
update(childrenUpdateVector.toArray(new IChildrenUpdate[childrenUpdateVector.size()]));
|
||||||
|
|
||||||
|
super.handleEvent(proxyStrategy, event, multiRm);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if(this.getActiveUpdateScope().getID().equals(AllUpdateScope.ALL_UPDATE_SCOPE_ID))
|
||||||
|
{
|
||||||
|
final CountingRequestMonitor multiRm = new CountingRequestMonitor(getExecutor(), rm);
|
||||||
|
multiRm.setDoneCount(2);
|
||||||
|
|
||||||
|
updateExpanded(
|
||||||
|
proxyStrategyExtension,
|
||||||
|
proxyStrategyExtension.getViewerInput(), proxyStrategyExtension.getRootPath(),
|
||||||
|
multiRm);
|
||||||
|
super.handleEvent(proxyStrategy, event, multiRm);
|
||||||
|
} else {
|
||||||
|
super.handleEvent(proxyStrategy, event, rm);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
super.handleEvent(proxyStrategy, event, rm);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateVisibleExpanded(final Object parent, TreeItem startItem[], final int count[], final TreeViewer viewer,
|
||||||
|
final IVMModelProxy proxyStrategy, final RequestMonitor rm, List<IChildrenUpdate> childrenUpdatesVector)
|
||||||
|
{
|
||||||
|
if(parent instanceof Tree)
|
||||||
|
{
|
||||||
|
for(int i = 0; i < ((Tree) parent).getItemCount() && count[0] > 0; i++)
|
||||||
|
{
|
||||||
|
TreeItem item = ((Tree) parent).getItem(i);
|
||||||
|
if(item.equals(startItem[0]))
|
||||||
|
startItem[0] = null;
|
||||||
|
|
||||||
|
if(startItem[0] == null)
|
||||||
|
{
|
||||||
|
childrenUpdatesVector.add(createChildrenUpdate(item, proxyStrategy, viewer.getInput(), rm));
|
||||||
|
count[0]--;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(item.getData() != null && viewer.getExpandedState(item.getData()))
|
||||||
|
updateVisibleExpanded(item, startItem, count, viewer, proxyStrategy, rm,
|
||||||
|
childrenUpdatesVector);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for(int i = 0; i < ((TreeItem) parent).getItemCount() && count[0] > 0; i++)
|
||||||
|
{
|
||||||
|
TreeItem item = ((TreeItem) parent).getItem(i);
|
||||||
|
if(item.equals(startItem[0]))
|
||||||
|
startItem[0] = null;
|
||||||
|
|
||||||
|
if(startItem[0] == null)
|
||||||
|
{
|
||||||
|
childrenUpdatesVector.add(createChildrenUpdate(item, proxyStrategy, viewer.getInput(), rm));
|
||||||
|
count[0]--;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(item.getData() != null && viewer.getExpandedState(item.getData()))
|
||||||
|
updateVisibleExpanded(item, startItem, count, viewer, proxyStrategy, rm,
|
||||||
|
childrenUpdatesVector);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private IChildrenUpdate createChildrenUpdate(TreeItem child, final IVMModelProxy proxyStrategy, final Object viewerInput, final RequestMonitor rm)
|
||||||
|
{
|
||||||
|
List<Object> pathList = new LinkedList<Object>();
|
||||||
|
TreeItem item = child.getParentItem();
|
||||||
|
Tree tree = null;
|
||||||
|
while (item != null) {
|
||||||
|
pathList.add(0, item.getData());
|
||||||
|
item = item.getParentItem();
|
||||||
|
}
|
||||||
|
final TreePath path = new TreePath(pathList.toArray());
|
||||||
|
int index = 0;
|
||||||
|
if(child.getParentItem() != null)
|
||||||
|
index = child.getParentItem().indexOf(child);
|
||||||
|
else
|
||||||
|
index = child.getParent().indexOf(child);
|
||||||
|
|
||||||
|
final IPresentationContext presentationContext = getPresentationContext();
|
||||||
|
|
||||||
|
final String columns[] = presentationContext.getColumns();
|
||||||
|
|
||||||
|
return new VMChildrenUpdate(
|
||||||
|
path, viewerInput,
|
||||||
|
getPresentationContext(), index, 1, new DataRequestMonitor<List<Object>>(getExecutor(), null) {
|
||||||
|
@Override
|
||||||
|
protected void handleCompleted() {
|
||||||
|
for(final Object o : getData())
|
||||||
|
{
|
||||||
|
if(o instanceof IAdaptable)
|
||||||
|
{
|
||||||
|
IElementLabelProvider labelProvider = (IElementLabelProvider) ((IAdaptable) o).getAdapter(IElementLabelProvider.class);
|
||||||
|
|
||||||
|
labelProvider.update(new ILabelUpdate[] {
|
||||||
|
new ILabelUpdate()
|
||||||
|
{
|
||||||
|
public Object getElement() {
|
||||||
|
return o;
|
||||||
|
}
|
||||||
|
|
||||||
|
public TreePath getElementPath() {
|
||||||
|
return path;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IPresentationContext getPresentationContext() {
|
||||||
|
return presentationContext;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object getViewerInput() {
|
||||||
|
return viewerInput;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void cancel() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public IStatus getStatus() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isCanceled() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setStatus(IStatus status) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public String[] getColumnIds() {
|
||||||
|
return columns;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setBackground(RGB arg0, int arg1) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFontData(FontData arg0, int arg1) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setForeground(RGB arg0, int arg1) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setImageDescriptor(ImageDescriptor arg0, int arg1) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLabel(String arg0, int arg1) {
|
||||||
|
}
|
||||||
|
|
||||||
|
public void done() {
|
||||||
|
|
||||||
|
rm.done();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateExpanded(final IVMModelProxyExtension proxyStrategy, final Object viewerInput, final TreePath path, final RequestMonitor rm)
|
||||||
|
{
|
||||||
|
this.update(new IChildrenUpdate[] { new VMChildrenUpdate(
|
||||||
|
path, viewerInput,
|
||||||
|
getPresentationContext(), -1, -1, new DataRequestMonitor<List<Object>>(getExecutor(), null) {
|
||||||
|
@Override
|
||||||
|
protected void handleCompleted() {
|
||||||
|
if (getData() != null) {
|
||||||
|
TreeViewer viewer = (TreeViewer) proxyStrategy.getViewer();
|
||||||
|
|
||||||
|
int expandedCount = 0;
|
||||||
|
|
||||||
|
final CountingRequestMonitor multiRm = new CountingRequestMonitor(getExecutor(), rm);
|
||||||
|
|
||||||
|
for(Object data : getData())
|
||||||
|
{
|
||||||
|
if(viewer.getExpandedState(data))
|
||||||
|
{
|
||||||
|
Object[] childPathSegments = new Object[path.getSegmentCount() + 1];
|
||||||
|
int i = 0;
|
||||||
|
for (i = 0; i < path.getSegmentCount(); i++) {
|
||||||
|
childPathSegments[i] = path.getSegment(i);
|
||||||
|
}
|
||||||
|
childPathSegments[i] = data;
|
||||||
|
updateExpanded(proxyStrategy, viewerInput, new TreePath(childPathSegments), multiRm);
|
||||||
|
expandedCount++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
multiRm.setDoneCount(expandedCount);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})});
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -906,4 +1154,34 @@ public class AbstractCachingVMProvider extends AbstractVMProvider implements ICa
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public IVMUpdateScope[] getAvailableUpdateScopes() {
|
||||||
|
return fAvailableUpdateScopes;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IVMUpdateScope getActiveUpdateScope() {
|
||||||
|
String updateScopeId = (String)getPresentationContext().getProperty(SELECTED_UPDATE_SCOPE);
|
||||||
|
if (updateScopeId != null) {
|
||||||
|
for (IVMUpdateScope updateScope : getAvailableUpdateScopes()) {
|
||||||
|
if (updateScope.getID().equals(updateScopeId)) {
|
||||||
|
return updateScope;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Default to the first one.
|
||||||
|
return getAvailableUpdateScopes()[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setActiveUpdateScope(IVMUpdateScope updateScope) {
|
||||||
|
getPresentationContext().setProperty(SELECTED_UPDATE_SCOPE, updateScope.getID());
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isAtomicUpdate() {
|
||||||
|
return fIsAtomicUpdate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAtomicUpdate(boolean enable) {
|
||||||
|
fIsAtomicUpdate = enable;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,46 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2007, 2008 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
|
||||||
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* Wind River Systems - initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
package org.eclipse.dd.dsf.ui.viewmodel.update;
|
||||||
|
|
||||||
|
import org.eclipse.jface.viewers.TreePath;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An "automatic" update policy which causes the view model provider cache to
|
||||||
|
* be flushed whenever an event causes a delta to be generated in the given
|
||||||
|
* model.
|
||||||
|
*/
|
||||||
|
public class AllUpdateScope implements IVMUpdateScope {
|
||||||
|
|
||||||
|
public static String ALL_UPDATE_SCOPE_ID = "org.eclipse.dd.dsf.ui.viewmodel.update.allUpdateScope"; //$NON-NLS-1$
|
||||||
|
|
||||||
|
public static IElementUpdateTester fgUpdateTester = new IElementUpdateTester() {
|
||||||
|
public int getUpdateFlags(Object viewerInput, TreePath path) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean includes(IElementUpdateTester tester) {
|
||||||
|
return tester.equals(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return ViewModelUpdateMessages.AllUpdateScope_name;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
public String getID() {
|
||||||
|
return ALL_UPDATE_SCOPE_ID;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return ViewModelUpdateMessages.AllUpdateScope_name;
|
||||||
|
}
|
||||||
|
}
|
|
@ -35,6 +35,32 @@ public interface ICachingVMProvider extends IVMProvider {
|
||||||
*/
|
*/
|
||||||
public void setActiveUpdatePolicy(IVMUpdatePolicy mode);
|
public void setActiveUpdatePolicy(IVMUpdatePolicy mode);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the update policies that the given provider supports.
|
||||||
|
*/
|
||||||
|
public IVMUpdateScope[] getAvailableUpdateScopes();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the active update policy.
|
||||||
|
*/
|
||||||
|
public IVMUpdateScope getActiveUpdateScope();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the active update policy. This has to be one of the update
|
||||||
|
* policies supported by the provider.
|
||||||
|
*/
|
||||||
|
public void setActiveUpdateScope(IVMUpdateScope mode);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Is update atomic?
|
||||||
|
*/
|
||||||
|
public boolean isAtomicUpdate();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets atomic update.
|
||||||
|
*/
|
||||||
|
public void setAtomicUpdate(boolean enable);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Forces the view to flush its cache and re-fetch data from the view
|
* Forces the view to flush its cache and re-fetch data from the view
|
||||||
* model nodes.
|
* model nodes.
|
||||||
|
|
|
@ -0,0 +1,24 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2008 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
|
||||||
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* Wind River Systems - initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
package org.eclipse.dd.dsf.ui.viewmodel.update;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public interface ICachingVMProviderExtension extends ICachingVMProvider {
|
||||||
|
|
||||||
|
|
||||||
|
public boolean isAtomicUpdate();
|
||||||
|
|
||||||
|
public void setAtomicUpdate(boolean enable);
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,28 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2007, 2008 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
|
||||||
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* Wind River Systems - initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
package org.eclipse.dd.dsf.ui.viewmodel.update;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public interface IVMUpdateScope {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns unique ID of this update policy.
|
||||||
|
*/
|
||||||
|
public String getID();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the user-presentable name of this update policy.
|
||||||
|
*/
|
||||||
|
public String getName();
|
||||||
|
}
|
|
@ -18,6 +18,8 @@ public class ViewModelUpdateMessages extends NLS {
|
||||||
|
|
||||||
public static String AutomaticUpdatePolicy_name;
|
public static String AutomaticUpdatePolicy_name;
|
||||||
public static String ManualUpdatePolicy_name;
|
public static String ManualUpdatePolicy_name;
|
||||||
|
public static String AllUpdateScope_name;
|
||||||
|
public static String VisibleUpdateScope_name;
|
||||||
|
|
||||||
static {
|
static {
|
||||||
// load message values from bundle file
|
// load message values from bundle file
|
||||||
|
|
|
@ -10,3 +10,5 @@
|
||||||
###############################################################################
|
###############################################################################
|
||||||
AutomaticUpdatePolicy_name = Automatic
|
AutomaticUpdatePolicy_name = Automatic
|
||||||
ManualUpdatePolicy_name = Manual
|
ManualUpdatePolicy_name = Manual
|
||||||
|
AllUpdateScope_name = All Elements
|
||||||
|
VisibleUpdateScope_name== Visible Elements
|
|
@ -0,0 +1,46 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2007, 2008 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
|
||||||
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* Wind River Systems - initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
package org.eclipse.dd.dsf.ui.viewmodel.update;
|
||||||
|
|
||||||
|
import org.eclipse.jface.viewers.TreePath;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An "automatic" update policy which causes the view model provider cache to
|
||||||
|
* be flushed whenever an event causes a delta to be generated in the given
|
||||||
|
* model.
|
||||||
|
*/
|
||||||
|
public class VisibleUpdateScope implements IVMUpdateScope {
|
||||||
|
|
||||||
|
public static String VISIBLE_UPDATE_SCOPE_ID = "org.eclipse.dd.dsf.ui.viewmodel.update.visibleUpdateScope"; //$NON-NLS-1$
|
||||||
|
|
||||||
|
public static IElementUpdateTester fgUpdateTester = new IElementUpdateTester() {
|
||||||
|
public int getUpdateFlags(Object viewerInput, TreePath path) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean includes(IElementUpdateTester tester) {
|
||||||
|
return tester.equals(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return ViewModelUpdateMessages.VisibleUpdateScope_name;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
public String getID() {
|
||||||
|
return VISIBLE_UPDATE_SCOPE_ID;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return ViewModelUpdateMessages.VisibleUpdateScope_name;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,39 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2008 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
|
||||||
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* Wind River Systems - initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
package org.eclipse.dd.gdb.internal.ui.viewmodel.launch;
|
||||||
|
|
||||||
|
import org.eclipse.dd.dsf.ui.viewmodel.AbstractVMProvider;
|
||||||
|
import org.eclipse.dd.dsf.ui.viewmodel.DefaultVMModelProxyStrategy;
|
||||||
|
import org.eclipse.debug.core.DebugPlugin;
|
||||||
|
import org.eclipse.jface.viewers.TreePath;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class LaunchVMModelProxyStrategy extends DefaultVMModelProxyStrategy {
|
||||||
|
|
||||||
|
final private TreePath fRootPath;
|
||||||
|
|
||||||
|
public LaunchVMModelProxyStrategy(AbstractVMProvider provider, Object rootElement) {
|
||||||
|
super(provider, rootElement);
|
||||||
|
fRootPath = new TreePath( new Object[] { rootElement });
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object getViewerInput() {
|
||||||
|
return DebugPlugin.getDefault().getLaunchManager();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TreePath getRootPath() {
|
||||||
|
return fRootPath;
|
||||||
|
}
|
||||||
|
}
|
|
@ -61,7 +61,6 @@ public class LaunchVMProvider extends AbstractLaunchVMProvider
|
||||||
DebugPlugin.getDefault().getLaunchManager().addLaunchListener(this);
|
DebugPlugin.getDefault().getLaunchManager().addLaunchListener(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void dispose() {
|
public void dispose() {
|
||||||
DebugPlugin.getDefault().removeDebugEventListener(this);
|
DebugPlugin.getDefault().removeDebugEventListener(this);
|
||||||
|
@ -69,7 +68,6 @@ public class LaunchVMProvider extends AbstractLaunchVMProvider
|
||||||
super.dispose();
|
super.dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected boolean canSkipHandlingEvent(Object newEvent, Object eventToSkip) {
|
protected boolean canSkipHandlingEvent(Object newEvent, Object eventToSkip) {
|
||||||
// Never skip the process lifecycle events.
|
// Never skip the process lifecycle events.
|
||||||
|
|
Loading…
Add table
Reference in a new issue