blob: 88c3cb2996b030fc1fe03fa73fafe215af8f1977 [file] [log] [blame]
/*
* Copyright (C) 2008 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.ddmuilib.log.event;
import com.android.ddmlib.log.EventContainer;
import com.android.ddmlib.log.EventLogParser;
import com.android.ddmlib.log.EventValueDescription;
import com.android.ddmuilib.DdmUiPreferences;
import com.android.ddmuilib.IImageLoader;
import com.android.ddmuilib.log.event.EventDisplay.OccurrenceDisplayDescriptor;
import com.android.ddmuilib.log.event.EventDisplay.ValueDisplayDescriptor;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Dialog;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.List;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Map;
class EventDisplayOptions extends Dialog {
private static final int DLG_WIDTH = 700;
private static final int DLG_HEIGHT = 700;
private IImageLoader mImageLoader;
private Shell mParent;
private Shell mShell;
private boolean mEditStatus = false;
private final ArrayList<EventDisplay> mDisplayList = new ArrayList<EventDisplay>();
/* LEFT LIST */
private List mEventDisplayList;
private Button mEventDisplayNewButton;
private Button mEventDisplayDeleteButton;
private Button mEventDisplayUpButton;
private Button mEventDisplayDownButton;
private Text mDisplayWidthText;
private Text mDisplayHeightText;
/* WIDGETS ON THE RIGHT */
private Text mDisplayNameText;
private Combo mDisplayTypeCombo;
private Group mChartOptions;
private Group mHistOptions;
private Button mPidFilterCheckBox;
private Text mPidText;
/** Map with (event-tag, event name) */
private Map<Integer, String> mEventTagMap;
/** Map with (event-tag, array of value info for the event) */
private Map<Integer, EventValueDescription[]> mEventDescriptionMap;
/** list of current pids */
private ArrayList<Integer> mPidList;
private EventLogParser mLogParser;
private Group mInfoGroup;
private static class SelectionWidgets {
private List mList;
private Button mNewButton;
private Button mEditButton;
private Button mDeleteButton;
private void setEnabled(boolean enable) {
mList.setEnabled(enable);
mNewButton.setEnabled(enable);
mEditButton.setEnabled(enable);
mDeleteButton.setEnabled(enable);
}
}
private SelectionWidgets mValueSelection;
private SelectionWidgets mOccurrenceSelection;
/** flag to temporarly disable processing of {@link Text} changes, so that
* {@link Text#setText(String)} can be called safely. */
private boolean mProcessTextChanges = true;
private Text mTimeLimitText;
private Text mHistWidthText;
EventDisplayOptions(IImageLoader imageLoader, Shell parent) {
super(parent, SWT.DIALOG_TRIM | SWT.BORDER | SWT.APPLICATION_MODAL);
mImageLoader = imageLoader;
}
/**
* Opens the display option dialog, to edit the {@link EventDisplay} objects provided in the
* list.
* @param logParser
* @param displayList
* @param eventList
* @return true if the list of {@link EventDisplay} objects was updated.
*/
boolean open(EventLogParser logParser, ArrayList<EventDisplay> displayList,
ArrayList<EventContainer> eventList) {
mLogParser = logParser;
if (logParser != null) {
// we need 2 things from the parser.
// the event tag / event name map
mEventTagMap = logParser.getTagMap();
// the event info map
mEventDescriptionMap = logParser.getEventInfoMap();
}
// make a copy of the EventDisplay list since we'll use working copies.
duplicateEventDisplay(displayList);
// build a list of pid from the list of events.
buildPidList(eventList);
createUI();
if (mParent == null || mShell == null) {
return false;
}
// Set the dialog size.
mShell.setMinimumSize(DLG_WIDTH, DLG_HEIGHT);
Rectangle r = mParent.getBounds();
// get the center new top left.
int cx = r.x + r.width/2;
int x = cx - DLG_WIDTH / 2;
int cy = r.y + r.height/2;
int y = cy - DLG_HEIGHT / 2;
mShell.setBounds(x, y, DLG_WIDTH, DLG_HEIGHT);
mShell.layout();
// actually open the dialog
mShell.open();
// event loop until the dialog is closed.
Display display = mParent.getDisplay();
while (!mShell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
return mEditStatus;
}
ArrayList<EventDisplay> getEventDisplays() {
return mDisplayList;
}
private void createUI() {
mParent = getParent();
mShell = new Shell(mParent, getStyle());
mShell.setText("Event Display Configuration");
mShell.setLayout(new GridLayout(1, true));
final Composite topPanel = new Composite(mShell, SWT.NONE);
topPanel.setLayoutData(new GridData(GridData.FILL_BOTH));
topPanel.setLayout(new GridLayout(2, false));
// create the tree on the left and the controls on the right.
Composite leftPanel = new Composite(topPanel, SWT.NONE);
Composite rightPanel = new Composite(topPanel, SWT.NONE);
createLeftPanel(leftPanel);
createRightPanel(rightPanel);
mShell.addListener(SWT.Close, new Listener() {
public void handleEvent(Event event) {
event.doit = true;
}
});
Label separator = new Label(mShell, SWT.SEPARATOR | SWT.HORIZONTAL);
separator.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
Composite bottomButtons = new Composite(mShell, SWT.NONE);
bottomButtons.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
GridLayout gl;
bottomButtons.setLayout(gl = new GridLayout(2, true));
gl.marginHeight = gl.marginWidth = 0;
Button okButton = new Button(bottomButtons, SWT.PUSH);
okButton.setText("OK");
okButton.addSelectionListener(new SelectionAdapter() {
/* (non-Javadoc)
* @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
*/
@Override
public void widgetSelected(SelectionEvent e) {
mShell.close();
}
});
Button cancelButton = new Button(bottomButtons, SWT.PUSH);
cancelButton.setText("Cancel");
cancelButton.addSelectionListener(new SelectionAdapter() {
/* (non-Javadoc)
* @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
*/
@Override
public void widgetSelected(SelectionEvent e) {
// cancel the modification flag.
mEditStatus = false;
// and close
mShell.close();
}
});
enable(false);
// fill the list with the current display
fillEventDisplayList();
}
private void createLeftPanel(Composite leftPanel) {
final IPreferenceStore store = DdmUiPreferences.getStore();
GridLayout gl;
leftPanel.setLayoutData(new GridData(GridData.FILL_VERTICAL));
leftPanel.setLayout(gl = new GridLayout(1, false));
gl.verticalSpacing = 1;
mEventDisplayList = new List(leftPanel,
SWT.BORDER | SWT.SINGLE | SWT.V_SCROLL | SWT.FULL_SELECTION);
mEventDisplayList.setLayoutData(new GridData(GridData.FILL_BOTH));
mEventDisplayList.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
handleEventDisplaySelection();
}
});
Composite bottomControls = new Composite(leftPanel, SWT.NONE);
bottomControls.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
bottomControls.setLayout(gl = new GridLayout(5, false));
gl.marginHeight = gl.marginWidth = 0;
gl.verticalSpacing = 0;
gl.horizontalSpacing = 0;
mEventDisplayNewButton = new Button(bottomControls, SWT.PUSH | SWT.FLAT);
mEventDisplayNewButton.setImage(mImageLoader.loadImage("add.png", // $NON-NLS-1$
leftPanel.getDisplay()));
mEventDisplayNewButton.setToolTipText("Adds a new event display");
mEventDisplayNewButton.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_CENTER));
mEventDisplayNewButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
createNewEventDisplay();
}
});
mEventDisplayDeleteButton = new Button(bottomControls, SWT.PUSH | SWT.FLAT);
mEventDisplayDeleteButton.setImage(mImageLoader.loadImage("delete.png", // $NON-NLS-1$
leftPanel.getDisplay()));
mEventDisplayDeleteButton.setToolTipText("Deletes the selected event display");
mEventDisplayDeleteButton.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_CENTER));
mEventDisplayDeleteButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
deleteEventDisplay();
}
});
mEventDisplayUpButton = new Button(bottomControls, SWT.PUSH | SWT.FLAT);
mEventDisplayUpButton.setImage(mImageLoader.loadImage("up.png", // $NON-NLS-1$
leftPanel.getDisplay()));
mEventDisplayUpButton.setToolTipText("Moves the selected event display up");
mEventDisplayUpButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
// get current selection.
int selection = mEventDisplayList.getSelectionIndex();
if (selection > 0) {
// update the list of EventDisplay.
EventDisplay display = mDisplayList.remove(selection);
mDisplayList.add(selection - 1, display);
// update the list widget
mEventDisplayList.remove(selection);
mEventDisplayList.add(display.getName(), selection - 1);
// update the selection and reset the ui.
mEventDisplayList.select(selection - 1);
handleEventDisplaySelection();
mEventDisplayList.showSelection();
setModified();
}
}
});
mEventDisplayDownButton = new Button(bottomControls, SWT.PUSH | SWT.FLAT);
mEventDisplayDownButton.setImage(mImageLoader.loadImage("down.png", // $NON-NLS-1$
leftPanel.getDisplay()));
mEventDisplayDownButton.setToolTipText("Moves the selected event display down");
mEventDisplayDownButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
// get current selection.
int selection = mEventDisplayList.getSelectionIndex();
if (selection != -1 && selection < mEventDisplayList.getItemCount() - 1) {
// update the list of EventDisplay.
EventDisplay display = mDisplayList.remove(selection);
mDisplayList.add(selection + 1, display);
// update the list widget
mEventDisplayList.remove(selection);
mEventDisplayList.add(display.getName(), selection + 1);
// update the selection and reset the ui.
mEventDisplayList.select(selection + 1);
handleEventDisplaySelection();
mEventDisplayList.showSelection();
setModified();
}
}
});
Group sizeGroup = new Group(leftPanel, SWT.NONE);
sizeGroup.setText("Display Size:");
sizeGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
sizeGroup.setLayout(new GridLayout(2, false));
Label l = new Label(sizeGroup, SWT.NONE);
l.setText("Width:");
mDisplayWidthText = new Text(sizeGroup, SWT.LEFT | SWT.SINGLE | SWT.BORDER);
mDisplayWidthText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
mDisplayWidthText.setText(Integer.toString(
store.getInt(EventLogPanel.PREFS_DISPLAY_WIDTH)));
mDisplayWidthText.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
String text = mDisplayWidthText.getText().trim();
try {
store.setValue(EventLogPanel.PREFS_DISPLAY_WIDTH, Integer.parseInt(text));
setModified();
} catch (NumberFormatException nfe) {
// do something?
}
}
});
l = new Label(sizeGroup, SWT.NONE);
l.setText("Height:");
mDisplayHeightText = new Text(sizeGroup, SWT.LEFT | SWT.SINGLE | SWT.BORDER);
mDisplayHeightText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
mDisplayHeightText.setText(Integer.toString(
store.getInt(EventLogPanel.PREFS_DISPLAY_HEIGHT)));
mDisplayHeightText.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
String text = mDisplayHeightText.getText().trim();
try {
store.setValue(EventLogPanel.PREFS_DISPLAY_HEIGHT, Integer.parseInt(text));
setModified();
} catch (NumberFormatException nfe) {
// do something?
}
}
});
}
private void createRightPanel(Composite rightPanel) {
rightPanel.setLayout(new GridLayout(1, true));
rightPanel.setLayoutData(new GridData(GridData.FILL_BOTH));
mInfoGroup = new Group(rightPanel, SWT.NONE);
mInfoGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
mInfoGroup.setLayout(new GridLayout(2, false));
Label nameLabel = new Label(mInfoGroup, SWT.LEFT);
nameLabel.setText("Name:");
mDisplayNameText = new Text(mInfoGroup, SWT.BORDER | SWT.LEFT | SWT.SINGLE);
mDisplayNameText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
mDisplayNameText.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
if (mProcessTextChanges) {
EventDisplay eventDisplay = getCurrentEventDisplay();
if (eventDisplay != null) {
eventDisplay.setName(mDisplayNameText.getText());
int index = mEventDisplayList.getSelectionIndex();
mEventDisplayList.remove(index);
mEventDisplayList.add(eventDisplay.getName(), index);
mEventDisplayList.select(index);
handleEventDisplaySelection();
setModified();
}
}
}
});
Label displayLabel = new Label(mInfoGroup, SWT.LEFT);
displayLabel.setText("Type:");
mDisplayTypeCombo = new Combo(mInfoGroup, SWT.READ_ONLY | SWT.DROP_DOWN);
mDisplayTypeCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
// add the combo values. This must match the values EventDisplay.DISPLAY_TYPE_*
mDisplayTypeCombo.add("Log All");
mDisplayTypeCombo.add("Filtered Log");
mDisplayTypeCombo.add("Graph");
mDisplayTypeCombo.add("Sync");
mDisplayTypeCombo.add("Sync Histogram");
mDisplayTypeCombo.add("Sync Performance");
mDisplayTypeCombo.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
EventDisplay eventDisplay = getCurrentEventDisplay();
if (eventDisplay != null && eventDisplay.getDisplayType() != mDisplayTypeCombo.getSelectionIndex()) {
/* Replace the EventDisplay object with a different subclass */
setModified();
String name = eventDisplay.getName();
EventDisplay newEventDisplay = EventDisplay.eventDisplayFactory(mDisplayTypeCombo.getSelectionIndex(), name);
setCurrentEventDisplay(newEventDisplay);
fillUiWith(newEventDisplay);
}
}
});
mChartOptions = new Group(mInfoGroup, SWT.NONE);
mChartOptions.setText("Chart Options");
GridData gd;
mChartOptions.setLayoutData(gd = new GridData(GridData.FILL_HORIZONTAL));
gd.horizontalSpan = 2;
mChartOptions.setLayout(new GridLayout(2, false));
Label l = new Label(mChartOptions, SWT.NONE);
l.setText("Time Limit (seconds):");
mTimeLimitText = new Text(mChartOptions, SWT.BORDER);
mTimeLimitText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
mTimeLimitText.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent arg0) {
String text = mTimeLimitText.getText().trim();
EventDisplay eventDisplay = getCurrentEventDisplay();
if (eventDisplay != null) {
try {
if (text.length() == 0) {
eventDisplay.resetChartTimeLimit();
} else {
eventDisplay.setChartTimeLimit(Long.parseLong(text));
}
} catch (NumberFormatException nfe) {
eventDisplay.resetChartTimeLimit();
} finally {
setModified();
}
}
}
});
mHistOptions = new Group(mInfoGroup, SWT.NONE);
mHistOptions.setText("Histogram Options");
GridData gdh;
mHistOptions.setLayoutData(gdh = new GridData(GridData.FILL_HORIZONTAL));
gdh.horizontalSpan = 2;
mHistOptions.setLayout(new GridLayout(2, false));
Label lh = new Label(mHistOptions, SWT.NONE);
lh.setText("Histogram width (hours):");
mHistWidthText = new Text(mHistOptions, SWT.BORDER);
mHistWidthText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
mHistWidthText.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent arg0) {
String text = mHistWidthText.getText().trim();
EventDisplay eventDisplay = getCurrentEventDisplay();
if (eventDisplay != null) {
try {
if (text.length() == 0) {
eventDisplay.resetHistWidth();
} else {
eventDisplay.setHistWidth(Long.parseLong(text));
}
} catch (NumberFormatException nfe) {
eventDisplay.resetHistWidth();
} finally {
setModified();
}
}
}
});
mPidFilterCheckBox = new Button(mInfoGroup, SWT.CHECK);
mPidFilterCheckBox.setText("Enable filtering by pid");
mPidFilterCheckBox.setLayoutData(gd = new GridData(GridData.FILL_HORIZONTAL));
gd.horizontalSpan = 2;
mPidFilterCheckBox.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
EventDisplay eventDisplay = getCurrentEventDisplay();
if (eventDisplay != null) {
eventDisplay.setPidFiltering(mPidFilterCheckBox.getSelection());
mPidText.setEnabled(mPidFilterCheckBox.getSelection());
setModified();
}
}
});
Label pidLabel = new Label(mInfoGroup, SWT.NONE);
pidLabel.setText("Pid Filter:");
pidLabel.setToolTipText("Enter all pids, separated by commas");
mPidText = new Text(mInfoGroup, SWT.BORDER);
mPidText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
mPidText.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
if (mProcessTextChanges) {
EventDisplay eventDisplay = getCurrentEventDisplay();
if (eventDisplay != null && eventDisplay.getPidFiltering()) {
String pidText = mPidText.getText().trim();
String[] pids = pidText.split("\\s*,\\s*"); //$NON-NLS-1$
ArrayList<Integer> list = new ArrayList<Integer>();
for (String pid : pids) {
try {
list.add(Integer.valueOf(pid));
} catch (NumberFormatException nfe) {
// just ignore non valid pid
}
}
eventDisplay.setPidFilterList(list);
setModified();
}
}
}
});
/* ------------------
* EVENT VALUE/OCCURRENCE SELECTION
* ------------------ */
mValueSelection = createEventSelection(rightPanel, ValueDisplayDescriptor.class,
"Event Value Display");
mOccurrenceSelection = createEventSelection(rightPanel, OccurrenceDisplayDescriptor.class,
"Event Occurrence Display");
}
private SelectionWidgets createEventSelection(Composite rightPanel,
final Class<? extends OccurrenceDisplayDescriptor> descriptorClass,
String groupMessage) {
Group eventSelectionPanel = new Group(rightPanel, SWT.NONE);
eventSelectionPanel.setLayoutData(new GridData(GridData.FILL_BOTH));
GridLayout gl;
eventSelectionPanel.setLayout(gl = new GridLayout(2, false));
gl.marginHeight = gl.marginWidth = 0;
eventSelectionPanel.setText(groupMessage);
final SelectionWidgets widgets = new SelectionWidgets();
widgets.mList = new List(eventSelectionPanel, SWT.BORDER | SWT.SINGLE | SWT.V_SCROLL);
widgets.mList.setLayoutData(new GridData(GridData.FILL_BOTH));
widgets.mList.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
int index = widgets.mList.getSelectionIndex();
if (index != -1) {
widgets.mDeleteButton.setEnabled(true);
widgets.mEditButton.setEnabled(true);
} else {
widgets.mDeleteButton.setEnabled(false);
widgets.mEditButton.setEnabled(false);
}
}
});
Composite rightControls = new Composite(eventSelectionPanel, SWT.NONE);
rightControls.setLayoutData(new GridData(GridData.FILL_VERTICAL));
rightControls.setLayout(gl = new GridLayout(1, false));
gl.marginHeight = gl.marginWidth = 0;
gl.verticalSpacing = 0;
gl.horizontalSpacing = 0;
widgets.mNewButton = new Button(rightControls, SWT.PUSH | SWT.FLAT);
widgets.mNewButton.setText("New...");
widgets.mNewButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
widgets.mNewButton.setEnabled(false);
widgets.mNewButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
// current event
try {
EventDisplay eventDisplay = getCurrentEventDisplay();
if (eventDisplay != null) {
EventValueSelector dialog = new EventValueSelector(mShell);
if (dialog.open(descriptorClass, mLogParser)) {
eventDisplay.addDescriptor(dialog.getDescriptor());
fillUiWith(eventDisplay);
setModified();
}
}
} catch (Exception e1) {
e1.printStackTrace();
}
}
});
widgets.mEditButton = new Button(rightControls, SWT.PUSH | SWT.FLAT);
widgets.mEditButton.setText("Edit...");
widgets.mEditButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
widgets.mEditButton.setEnabled(false);
widgets.mEditButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
// current event
EventDisplay eventDisplay = getCurrentEventDisplay();
if (eventDisplay != null) {
// get the current descriptor index
int index = widgets.mList.getSelectionIndex();
if (index != -1) {
// get the descriptor itself
OccurrenceDisplayDescriptor descriptor = eventDisplay.getDescriptor(
descriptorClass, index);
// open the edit dialog.
EventValueSelector dialog = new EventValueSelector(mShell);
if (dialog.open(descriptor, mLogParser)) {
descriptor.replaceWith(dialog.getDescriptor());
eventDisplay.updateValueDescriptorCheck();
fillUiWith(eventDisplay);
// reselect the item since fillUiWith remove the selection.
widgets.mList.select(index);
widgets.mList.notifyListeners(SWT.Selection, null);
setModified();
}
}
}
}
});
widgets.mDeleteButton = new Button(rightControls, SWT.PUSH | SWT.FLAT);
widgets.mDeleteButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
widgets.mDeleteButton.setText("Delete");
widgets.mDeleteButton.setEnabled(false);
widgets.mDeleteButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
// current event
EventDisplay eventDisplay = getCurrentEventDisplay();
if (eventDisplay != null) {
// get the current descriptor index
int index = widgets.mList.getSelectionIndex();
if (index != -1) {
eventDisplay.removeDescriptor(descriptorClass, index);
fillUiWith(eventDisplay);
setModified();
}
}
}
});
return widgets;
}
private void duplicateEventDisplay(ArrayList<EventDisplay> displayList) {
for (EventDisplay eventDisplay : displayList) {
mDisplayList.add(EventDisplay.clone(eventDisplay));
}
}
private void buildPidList(ArrayList<EventContainer> eventList) {
mPidList = new ArrayList<Integer>();
for (EventContainer event : eventList) {
if (mPidList.indexOf(event.pid) == -1) {
mPidList.add(event.pid);
}
}
}
private void setModified() {
mEditStatus = true;
}
private void enable(boolean status) {
mEventDisplayDeleteButton.setEnabled(status);
// enable up/down
int selection = mEventDisplayList.getSelectionIndex();
int count = mEventDisplayList.getItemCount();
mEventDisplayUpButton.setEnabled(status && selection > 0);
mEventDisplayDownButton.setEnabled(status && selection != -1 && selection < count - 1);
mDisplayNameText.setEnabled(status);
mDisplayTypeCombo.setEnabled(status);
mPidFilterCheckBox.setEnabled(status);
mValueSelection.setEnabled(status);
mOccurrenceSelection.setEnabled(status);
mValueSelection.mNewButton.setEnabled(status);
mOccurrenceSelection.mNewButton.setEnabled(status);
if (status == false) {
mPidText.setEnabled(false);
}
}
private void fillEventDisplayList() {
for (EventDisplay eventDisplay : mDisplayList) {
mEventDisplayList.add(eventDisplay.getName());
}
}
private void createNewEventDisplay() {
int count = mDisplayList.size();
String name = String.format("display %1$d", count + 1);
EventDisplay eventDisplay = EventDisplay.eventDisplayFactory(0 /* type*/, name);
mDisplayList.add(eventDisplay);
mEventDisplayList.add(name);
mEventDisplayList.select(count);
handleEventDisplaySelection();
mEventDisplayList.showSelection();
setModified();
}
private void deleteEventDisplay() {
int selection = mEventDisplayList.getSelectionIndex();
if (selection != -1) {
mDisplayList.remove(selection);
mEventDisplayList.remove(selection);
if (mDisplayList.size() < selection) {
selection--;
}
mEventDisplayList.select(selection);
handleEventDisplaySelection();
setModified();
}
}
private EventDisplay getCurrentEventDisplay() {
int selection = mEventDisplayList.getSelectionIndex();
if (selection != -1) {
return mDisplayList.get(selection);
}
return null;
}
private void setCurrentEventDisplay(EventDisplay eventDisplay) {
int selection = mEventDisplayList.getSelectionIndex();
if (selection != -1) {
mDisplayList.set(selection, eventDisplay);
}
}
private void handleEventDisplaySelection() {
EventDisplay eventDisplay = getCurrentEventDisplay();
if (eventDisplay != null) {
// enable the UI
enable(true);
// and fill it
fillUiWith(eventDisplay);
} else {
// disable the UI
enable(false);
// and empty it.
emptyUi();
}
}
private void emptyUi() {
mDisplayNameText.setText("");
mDisplayTypeCombo.clearSelection();
mValueSelection.mList.removeAll();
mOccurrenceSelection.mList.removeAll();
}
private void fillUiWith(EventDisplay eventDisplay) {
mProcessTextChanges = false;
mDisplayNameText.setText(eventDisplay.getName());
int displayMode = eventDisplay.getDisplayType();
mDisplayTypeCombo.select(displayMode);
if (displayMode == EventDisplay.DISPLAY_TYPE_GRAPH) {
GridData gd = (GridData) mChartOptions.getLayoutData();
gd.exclude = false;
mChartOptions.setVisible(!gd.exclude);
long limit = eventDisplay.getChartTimeLimit();
if (limit != -1) {
mTimeLimitText.setText(Long.toString(limit));
} else {
mTimeLimitText.setText(""); //$NON-NLS-1$
}
} else {
GridData gd = (GridData) mChartOptions.getLayoutData();
gd.exclude = true;
mChartOptions.setVisible(!gd.exclude);
mTimeLimitText.setText(""); //$NON-NLS-1$
}
if (displayMode == EventDisplay.DISPLAY_TYPE_SYNC_HIST) {
GridData gd = (GridData) mHistOptions.getLayoutData();
gd.exclude = false;
mHistOptions.setVisible(!gd.exclude);
long limit = eventDisplay.getHistWidth();
if (limit != -1) {
mHistWidthText.setText(Long.toString(limit));
} else {
mHistWidthText.setText(""); //$NON-NLS-1$
}
} else {
GridData gd = (GridData) mHistOptions.getLayoutData();
gd.exclude = true;
mHistOptions.setVisible(!gd.exclude);
mHistWidthText.setText(""); //$NON-NLS-1$
}
mInfoGroup.layout(true);
mShell.layout(true);
mShell.pack();
if (eventDisplay.getPidFiltering()) {
mPidFilterCheckBox.setSelection(true);
mPidText.setEnabled(true);
// build the pid list.
ArrayList<Integer> list = eventDisplay.getPidFilterList();
if (list != null) {
StringBuilder sb = new StringBuilder();
int count = list.size();
for (int i = 0 ; i < count ; i++) {
sb.append(list.get(i));
if (i < count - 1) {
sb.append(", ");//$NON-NLS-1$
}
}
mPidText.setText(sb.toString());
} else {
mPidText.setText(""); //$NON-NLS-1$
}
} else {
mPidFilterCheckBox.setSelection(false);
mPidText.setEnabled(false);
mPidText.setText(""); //$NON-NLS-1$
}
mProcessTextChanges = true;
mValueSelection.mList.removeAll();
mOccurrenceSelection.mList.removeAll();
if (eventDisplay.getDisplayType() == EventDisplay.DISPLAY_TYPE_FILTERED_LOG ||
eventDisplay.getDisplayType() == EventDisplay.DISPLAY_TYPE_GRAPH) {
mOccurrenceSelection.setEnabled(true);
mValueSelection.setEnabled(true);
Iterator<ValueDisplayDescriptor> valueIterator = eventDisplay.getValueDescriptors();
while (valueIterator.hasNext()) {
ValueDisplayDescriptor descriptor = valueIterator.next();
mValueSelection.mList.add(String.format("%1$s: %2$s [%3$s]%4$s",
mEventTagMap.get(descriptor.eventTag), descriptor.valueName,
getSeriesLabelDescription(descriptor), getFilterDescription(descriptor)));
}
Iterator<OccurrenceDisplayDescriptor> occurrenceIterator =
eventDisplay.getOccurrenceDescriptors();
while (occurrenceIterator.hasNext()) {
OccurrenceDisplayDescriptor descriptor = occurrenceIterator.next();
mOccurrenceSelection.mList.add(String.format("%1$s [%2$s]%3$s",
mEventTagMap.get(descriptor.eventTag),
getSeriesLabelDescription(descriptor),
getFilterDescription(descriptor)));
}
mValueSelection.mList.notifyListeners(SWT.Selection, null);
mOccurrenceSelection.mList.notifyListeners(SWT.Selection, null);
} else {
mOccurrenceSelection.setEnabled(false);
mValueSelection.setEnabled(false);
}
}
/**
* Returns a String describing what is used as the series label
* @param descriptor the descriptor of the display.
*/
private String getSeriesLabelDescription(OccurrenceDisplayDescriptor descriptor) {
if (descriptor.seriesValueIndex != -1) {
if (descriptor.includePid) {
return String.format("%1$s + pid",
mEventDescriptionMap.get(
descriptor.eventTag)[descriptor.seriesValueIndex].getName());
} else {
return mEventDescriptionMap.get(descriptor.eventTag)[descriptor.seriesValueIndex]
.getName();
}
}
return "pid";
}
private String getFilterDescription(OccurrenceDisplayDescriptor descriptor) {
if (descriptor.filterValueIndex != -1) {
return String.format(" [%1$s %2$s %3$s]",
mEventDescriptionMap.get(
descriptor.eventTag)[descriptor.filterValueIndex].getName(),
descriptor.filterCompareMethod.testString(),
descriptor.filterValue != null ?
descriptor.filterValue.toString() : "?"); //$NON-NLS-1$
}
return ""; //$NON-NLS-1$
}
}