/* * 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$ } }