blob: 87b09b6fa2eb59b38df37177cd07802c2d4ac06d [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007, 2016 Nokia and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Nokia - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.dsf.gdb.internal.ui.tracepointactions;
import org.eclipse.cdt.dsf.gdb.internal.tracepointactions.ITracepointAction;
import org.eclipse.cdt.dsf.gdb.internal.tracepointactions.TracepointActionManager;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
/**
* @since 2.1
*/
public class TracepointActionsList extends Composite {
private Button removeButton;
private Button upButton;
private Button downButton;
private Table table;
public TracepointActionsList(Composite parent, int style) {
super(parent, style);
final GridLayout gridLayout = new GridLayout();
gridLayout.numColumns = 4;
setLayout(gridLayout);
table = new Table(this, SWT.FULL_SELECTION | SWT.BORDER | SWT.MULTI);
final GridData gridData = new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_FILL);
gridData.heightHint = 60;
gridData.horizontalSpan = 4;
table.setLayoutData(gridData);
table.setLinesVisible(true);
table.setHeaderVisible(true);
table.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
updateButtons();
}
});
final TableColumn nameTableColumn = new TableColumn(table, SWT.NONE);
nameTableColumn.setWidth(120);
nameTableColumn.setText(MessagesForTracepointActions.TracepointActions_Name);
final TableColumn typeTableColumn = new TableColumn(table, SWT.NONE);
typeTableColumn.setWidth(120);
typeTableColumn.setText(MessagesForTracepointActions.TracepointActions_Type);
final TableColumn summaryTableColumn = new TableColumn(table, SWT.NONE);
summaryTableColumn.setWidth(120);
summaryTableColumn.setText(MessagesForTracepointActions.TracepointActions_Summary);
removeButton = new Button(this, SWT.NONE);
removeButton.setText(MessagesForTracepointActions.TracepointActions_Remove);
removeButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
HandleRemoveButton();
}
});
upButton = new Button(this, SWT.NONE);
upButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(final SelectionEvent e) {
HandleUpButton();
}
});
upButton.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_END));
upButton.setText(MessagesForTracepointActions.TracepointActions_Up);
downButton = new Button(this, SWT.NONE);
downButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(final SelectionEvent e) {
HandleDownButton();
}
});
downButton.setText(MessagesForTracepointActions.TracepointActions_Down);
updateButtons();
}
public void addAction(ITracepointAction action) {
TableItem[] currentItems = table.getItems();
boolean alreadyInList = false;
for (TableItem currentItem : currentItems) {
if (((ITracepointAction) currentItem.getData()).equals(action)) {
alreadyInList = true;
break;
}
}
if (!alreadyInList) {
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);
}
updateButtons();
}
public 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);
break;
}
}
updateButtons();
}
public String getActionNames() {
StringBuilder result = new StringBuilder();
TableItem[] currentItems = table.getItems();
for (int i = 0; i < currentItems.length; i++) {
if (i > 0) {
// Keep a delimiter between the different action strings
// so we can separate them again.
result.append(TracepointActionManager.TRACEPOINT_ACTION_DELIMITER);
}
result.append(((ITracepointAction) currentItems[i].getData()).getName());
}
return result.toString();
}
private void swapItems(TableItem item, TableItem item2) {
String[] item2Text = { item2.getText(0), item2.getText(1), item2.getText(2) };
Object item2Data = item2.getData();
item2.setText(0, item.getText(0));
item2.setText(1, item.getText(1));
item2.setText(2, item.getText(2));
item2.setData(item.getData());
item.setText(0, item2Text[0]);
item.setText(1, item2Text[1]);
item.setText(2, item2Text[2]);
item.setData(item2Data);
}
protected void HandleUpButton() {
int[] selection = table.getSelectionIndices();
if (selection.length == 1 && selection[0] > 0) {
swapItems(table.getItem(selection[0]), table.getItem(selection[0] - 1));
}
}
protected void HandleDownButton() {
int[] selection = table.getSelectionIndices();
if (selection.length == 1 && selection[0] < (table.getItemCount() - 1)) {
swapItems(table.getItem(selection[0]), table.getItem(selection[0] + 1));
}
}
protected void HandleRemoveButton() {
table.remove(table.getSelectionIndices());
if (table.getItemCount() > 0) {
table.select(table.getItemCount() - 1);
}
updateButtons();
}
public void setNames(String actionNames) {
table.removeAll();
String[] names = actionNames.split(TracepointActionManager.TRACEPOINT_ACTION_DELIMITER);
for (String actionName : names) {
ITracepointAction action = TracepointActionManager.getInstance().findAction(actionName);
if (action != null) {
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);
}
}
updateButtons();
}
public void updateButtons() {
int[] selectedItems = table.getSelectionIndices();
removeButton.setEnabled(selectedItems.length > 0);
downButton.setEnabled(selectedItems.length == 1 && selectedItems[0] < (table.getItemCount() - 1));
upButton.setEnabled(selectedItems.length == 1 && selectedItems[0] > 0);
}
/**
* 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());
break;
}
}
updateButtons();
}
}