diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/tracepointactions/TracepointActionDialog.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/tracepointactions/TracepointActionDialog.java index 2ea7fef2ad5..be37c270d9e 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/tracepointactions/TracepointActionDialog.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/tracepointactions/TracepointActionDialog.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2010 Nokia and others. + * Copyright (c) 2010, 2015 Nokia 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 @@ -74,6 +74,10 @@ public class TracepointActionDialog extends Dialog { private int lastSelectedActionTypeIndex; private IBreakpointAction originalAction; private boolean isSubAction; + + // If this dialog is for a "while-stepping" action, we keep track + // of the parent global list, so that it can be updated. + private TracepointGlobalActionsList parentGlobalList; private IExtension[] breakpointActionPageExtensions; @@ -82,13 +86,15 @@ public class TracepointActionDialog extends Dialog { /** * Create the dialog */ - public TracepointActionDialog(Shell parentShell, ITracepointAction action, boolean isSub) { + public TracepointActionDialog(Shell parentShell, ITracepointAction action, + TracepointGlobalActionsList parentList, boolean isSub) { super(parentShell); setShellStyle(getShellStyle() | SWT.MAX | SWT.RESIZE); originalAction = action; tracepointAction = action; lastSelectedActionTypeIndex = 0; isSubAction = isSub; + parentGlobalList = parentList; } @Override @@ -235,6 +241,9 @@ public class TracepointActionDialog extends Dialog { if (actionPage == null) { actionPages[selectedTypeIndex] = getActionPage(tracepointActions.get(selectedTypeIndex)); actionPage = actionPages[selectedTypeIndex]; + if (actionPage instanceof WhileSteppingActionPage) { + ((WhileSteppingActionPage)actionPage).setParentGlobalList(parentGlobalList); + } } if (actionComposites[selectedTypeIndex] == null) { Composite actionComposite = actionPages[selectedTypeIndex].createComposite(tracepointAction, actionArea, SWT.NONE); diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/tracepointactions/TracepointActionsPreferencePage.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/tracepointactions/TracepointActionsPreferencePage.java index 77918114f1d..b10f5313f4f 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/tracepointactions/TracepointActionsPreferencePage.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/tracepointactions/TracepointActionsPreferencePage.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2007, 2010 Nokia and others. + * Copyright (c) 2007, 2015 Nokia 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 @@ -45,7 +45,7 @@ public class TracepointActionsPreferencePage extends PreferencePage implements I final Label breakpointActionsAvailableLabel = new Label(container, SWT.NONE); breakpointActionsAvailableLabel.setText(MessagesForTracepointActions.TracepointActions_Preferences_Actions_Available); - final TracepointGlobalActionsList actionsList = new TracepointGlobalActionsList(container, SWT.NONE, false, false); + final TracepointGlobalActionsList actionsList = new TracepointGlobalActionsList(container, SWT.NONE, false, null, false); actionsList.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, true)); actionsList.getDeleteButton().addSelectionListener(new SelectionAdapter() { diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/tracepointactions/TracepointActionsPropertyPage.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/tracepointactions/TracepointActionsPropertyPage.java index c1cb9443b9c..466463c1ef1 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/tracepointactions/TracepointActionsPropertyPage.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/tracepointactions/TracepointActionsPropertyPage.java @@ -76,7 +76,7 @@ public class TracepointActionsPropertyPage extends PropertyPage { allAvailableActionsLabel.setLayoutData(gridData_3); allAvailableActionsLabel.setText(MessagesForTracepointActions.TracepointActions_Available_actions); - globalActionsList = new TracepointGlobalActionsList(container, SWT.NONE, true, false); + globalActionsList = new TracepointGlobalActionsList(container, SWT.NONE, true, null, false); final GridData gridData_1 = new GridData(GridData.FILL_BOTH); gridData_1.horizontalSpan = 2; globalActionsList.setLayoutData(gridData_1); diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/tracepointactions/TracepointGlobalActionsList.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/tracepointactions/TracepointGlobalActionsList.java index 7116d927b0b..2a7d511fb3c 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/tracepointactions/TracepointGlobalActionsList.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/tracepointactions/TracepointGlobalActionsList.java @@ -40,10 +40,16 @@ public class TracepointGlobalActionsList extends Composite { private Table table; private TracepointActionsList clientList; private boolean isSubAction; + + // When dealing with a "while-stepping" action, we deal with a "child" global + // list, and must keep track of the parent global list, to properly update it. + // This field will be null when the this class represents the parent class itself. + private TracepointGlobalActionsList parentGlobalList; - public TracepointGlobalActionsList(Composite parent, int style, boolean useAttachButton, boolean isSub) { + public TracepointGlobalActionsList(Composite parent, int style, boolean useAttachButton, TracepointGlobalActionsList parentList, boolean isSub) { super(parent, style); isSubAction = isSub; + parentGlobalList = parentList; final GridLayout gridLayout = new GridLayout(); gridLayout.numColumns = 5; @@ -153,21 +159,41 @@ public class TracepointGlobalActionsList extends Composite { if (clientList != null) { clientList.removeAction(action); } + if (parentGlobalList != null) { + assert isSubAction; + // Update the parent list also + parentGlobalList.removeAction(action); + } TracepointActionManager.getInstance().deleteAction(action); } + // Remove all selected actions at once table.remove(table.getSelectionIndices()); if (table.getItemCount() > 0) { table.select(table.getItemCount() - 1); } updateButtons(); } + + void removeAction(ITracepointAction action) { + TableItem[] currentItems = table.getItems(); + for (int i = 0; i < currentItems.length; i++) { + if (((ITracepointAction) currentItems[i].getData()).equals(action)) { + table.remove(i); + if (clientList != null) { + clientList.removeAction(action); + } + break; + } + } + updateButtons(); + } protected void HandleEditButton() { TableItem[] selectedItems = table.getSelection(); ITracepointAction action = (ITracepointAction) selectedItems[0].getData(); - TracepointActionDialog dialog = new TracepointActionDialog(this.getShell(), action, isSubAction); + TracepointActionDialog dialog = new TracepointActionDialog(this.getShell(), action, this, isSubAction); int result = dialog.open(); if (result == Window.OK) { action.setName(dialog.getActionName()); @@ -177,28 +203,40 @@ public class TracepointGlobalActionsList extends Composite { if (clientList != null) { clientList.updateAction(action); } + if (parentGlobalList != null) { + assert isSubAction; + // Update the parent list also + parentGlobalList.updateAction(action); + } } - } protected void HandleNewButton() throws CoreException { - TracepointActionDialog dialog = new TracepointActionDialog(this.getShell(), null, isSubAction); + TracepointActionDialog dialog = new TracepointActionDialog(this.getShell(), null, this, isSubAction); int result = dialog.open(); if (result == Window.OK) { ITracepointAction action = (ITracepointAction)dialog.getTracepointAction(); action.setName(dialog.getActionName()); TracepointActionManager.getInstance().addAction(action); - final TableItem tableItem = new TableItem(table, SWT.NONE); - tableItem.setText(0, action.getName()); - tableItem.setText(1, action.getTypeName()); - tableItem.setText(2, action.getSummary()); - tableItem.setData(action); - + addAction(action); + + if (parentGlobalList != null) { + assert isSubAction; + // Update the parent list also + parentGlobalList.addAction(action); + } } - } + void addAction(ITracepointAction action) { + final TableItem tableItem = new TableItem(table, SWT.NONE); + tableItem.setText(0, action.getName()); + tableItem.setText(1, action.getTypeName()); + tableItem.setText(2, action.getSummary()); + tableItem.setData(action); + } + public void updateButtons() { TableItem[] selectedItems = table.getSelection(); if (attachButton != null) @@ -214,4 +252,25 @@ public class TracepointGlobalActionsList extends Composite { void setClientList(TracepointActionsList actionsList) { clientList = actionsList; } + + /** + * Update the appearance of given action. + * @param action + */ + void updateAction(ITracepointAction action) { + TableItem[] currentItems = table.getItems(); + for (int i = 0; i < currentItems.length; i++) { + if (((ITracepointAction) currentItems[i].getData()).equals(action)) { + TableItem tableItem = currentItems[i]; + tableItem.setText(0, action.getName()); + tableItem.setText(1, action.getTypeName()); + tableItem.setText(2, action.getSummary()); + if (clientList != null) { + clientList.updateAction(action); + } + break; + } + } + updateButtons(); + } } diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/tracepointactions/WhileSteppingActionPage.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/tracepointactions/WhileSteppingActionPage.java index e3c7f0ea1c6..96cd7300b14 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/tracepointactions/WhileSteppingActionPage.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/tracepointactions/WhileSteppingActionPage.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2010 Ericsson and others. + * Copyright (c) 2010, 2015 Ericsson 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 @@ -33,6 +33,9 @@ public class WhileSteppingActionPage extends PlatformObject implements IBreakpoi private Text fStepCountText; private TracepointActionsList actionsList; private TracepointGlobalActionsList globalActionsList; + // When dealing with a "while-stepping" action, we deal with a "child" global + // list, and must keep track of the parent global list, to properly update it. + private TracepointGlobalActionsList parentGlobalActionsList; /** * Create the composite @@ -74,7 +77,7 @@ public class WhileSteppingActionPage extends PlatformObject implements IBreakpoi allAvailableActionsLabel.setLayoutData(gridData); allAvailableActionsLabel.setText(MessagesForTracepointActions.TracepointActions_Available_actions); - globalActionsList = new TracepointGlobalActionsList(composite, SWT.NONE, true, true); + globalActionsList = new TracepointGlobalActionsList(composite, SWT.NONE, true, parentGlobalActionsList, true); gridData = new GridData(GridData.FILL_BOTH); gridData.horizontalSpan = 2; globalActionsList.setLayoutData(gridData); @@ -82,6 +85,9 @@ public class WhileSteppingActionPage extends PlatformObject implements IBreakpoi String actionNames = fWhileSteppingAction.getSubActionsNames(); actionsList.setNames(actionNames); + // connect attached actions list to global list + globalActionsList.setClientList(actionsList); + globalActionsList.getAttachButton().addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { @@ -112,12 +118,8 @@ public class WhileSteppingActionPage extends PlatformObject implements IBreakpoi * @since 7.0 */ protected void HandleDeleteButton() { - // First remove any attached action that was just deleted - ITracepointAction[] selectedActions = globalActionsList.getSelectedActions(); - for (ITracepointAction action : selectedActions) { - actionsList.removeAction(action); - } - // Now cleanup the global action list + // attached actions are now handled by the GlobalActionsList + globalActionsList.HandleDeleteButton(); } @@ -148,4 +150,8 @@ public class WhileSteppingActionPage extends PlatformObject implements IBreakpoi fWhileSteppingAction = (WhileSteppingAction)action; return createWhileSteppingActionComposite(composite, style); } + + void setParentGlobalList(TracepointGlobalActionsList list) { + parentGlobalActionsList = list; + } }