1 /*******************************************************************************
2 * Copyright (c) 2011 Ericsson
4 * All rights reserved. This program and the accompanying materials are
5 * made available under the terms of the Eclipse Public License v1.0 which
6 * accompanies this distribution, and is available at
7 * http://www.eclipse.org/legal/epl-v10.html
10 * Bernd Hufmann - Initial API and implementation
12 *******************************************************************************/
13 package org
.eclipse
.linuxtools
.internal
.lttng
.ui
.tracecontrol
.wizards
;
15 import java
.util
.ArrayList
;
16 import java
.util
.List
;
18 import org
.eclipse
.jface
.action
.Action
;
19 import org
.eclipse
.jface
.action
.IMenuListener
;
20 import org
.eclipse
.jface
.action
.IMenuManager
;
21 import org
.eclipse
.jface
.action
.MenuManager
;
22 import org
.eclipse
.jface
.dialogs
.Dialog
;
23 import org
.eclipse
.jface
.dialogs
.IDialogConstants
;
24 import org
.eclipse
.jface
.viewers
.CellEditor
;
25 import org
.eclipse
.jface
.viewers
.CheckboxCellEditor
;
26 import org
.eclipse
.jface
.viewers
.TableViewer
;
27 import org
.eclipse
.jface
.viewers
.TextCellEditor
;
28 import org
.eclipse
.jface
.viewers
.Viewer
;
29 import org
.eclipse
.jface
.viewers
.ViewerComparator
;
30 import org
.eclipse
.jface
.window
.Window
;
31 import org
.eclipse
.jface
.wizard
.WizardPage
;
32 import org
.eclipse
.linuxtools
.internal
.lttng
.core
.tracecontrol
.model
.TraceResource
.TraceState
;
33 import org
.eclipse
.linuxtools
.internal
.lttng
.core
.tracecontrol
.model
.config
.TraceChannel
;
34 import org
.eclipse
.linuxtools
.internal
.lttng
.core
.tracecontrol
.model
.config
.TraceChannels
;
35 import org
.eclipse
.linuxtools
.internal
.lttng
.ui
.Activator
;
36 import org
.eclipse
.linuxtools
.internal
.lttng
.ui
.tracecontrol
.Messages
;
37 import org
.eclipse
.linuxtools
.internal
.lttng
.ui
.tracecontrol
.model
.config
.TraceChannelCellModifier
;
38 import org
.eclipse
.linuxtools
.internal
.lttng
.ui
.tracecontrol
.model
.config
.TraceChannelTableContentProvider
;
39 import org
.eclipse
.linuxtools
.internal
.lttng
.ui
.tracecontrol
.model
.config
.TraceChannelTableLabelProvider
;
40 import org
.eclipse
.swt
.SWT
;
41 import org
.eclipse
.swt
.events
.SelectionAdapter
;
42 import org
.eclipse
.swt
.events
.SelectionEvent
;
43 import org
.eclipse
.swt
.events
.VerifyEvent
;
44 import org
.eclipse
.swt
.events
.VerifyListener
;
45 import org
.eclipse
.swt
.layout
.GridData
;
46 import org
.eclipse
.swt
.layout
.GridLayout
;
47 import org
.eclipse
.swt
.widgets
.Button
;
48 import org
.eclipse
.swt
.widgets
.Composite
;
49 import org
.eclipse
.swt
.widgets
.Control
;
50 import org
.eclipse
.swt
.widgets
.Display
;
51 import org
.eclipse
.swt
.widgets
.Event
;
52 import org
.eclipse
.swt
.widgets
.Label
;
53 import org
.eclipse
.swt
.widgets
.Listener
;
54 import org
.eclipse
.swt
.widgets
.Menu
;
55 import org
.eclipse
.swt
.widgets
.Shell
;
56 import org
.eclipse
.swt
.widgets
.Table
;
57 import org
.eclipse
.swt
.widgets
.TableColumn
;
58 import org
.eclipse
.swt
.widgets
.TableItem
;
59 import org
.eclipse
.swt
.widgets
.Text
;
62 * <b><u>KernelTraceChannelConfigurationPage</u></b>
64 * Wizard page implementation to configure the kernel trace channels.
67 public class KernelTraceChannelConfigurationPage
extends WizardPage
implements ITraceChannelConfigurationPage
{
69 // ------------------------------------------------------------------------
71 // ------------------------------------------------------------------------
73 private TraceChannels fChannels
;
74 private TraceState fTraceState
;
75 private Composite container
;
76 private TableViewer tableViewer
;
77 List
<String
> fColumnNames
;
79 Action enableAllAction
;
80 Action disableAllAction
;
81 Action setOverrideAllAction
;
82 Action resetOverideAllAction
;
83 Action setNumSubbufAction
;
84 Action setSubbufSizeAction
;
85 Action setChanTimerAction
;
87 private ColumnData
[] columnDataList
= new ColumnData
[] {
88 new ColumnData(Messages
.ChannelConfigPage_ChannelName
, 150, SWT
.LEFT
, Messages
.ChannelConfigPage_ChannelNameTooltip
, new ViewerComparator() {
90 public int compare(Viewer viewer
, Object e1
, Object e2
) {
91 TraceChannel chan1
= (TraceChannel
) e1
;
92 TraceChannel chan2
= (TraceChannel
) e2
;
93 return chan1
.getName().compareTo(chan2
.getName());
96 new ColumnData(Messages
.ChannelConfigPage_ChannelEnabled
, 150, SWT
.LEFT
, Messages
.ChannelConfigPage_ChannelEnabledTooltip
, null),
97 new ColumnData(Messages
.ChannelConfigPage_ChannelOverride
, 150, SWT
.LEFT
, Messages
.ChannelConfigPage_BufferOverrideTooltip
, null),
98 new ColumnData(Messages
.ChannelConfigPage_NumSubBuf
, 175, SWT
.LEFT
, Messages
.ChannelConfigPage_NumSubBufTooltip
, null),
99 new ColumnData(Messages
.ChannelConfigPage_SubBufSize
, 150, SWT
.LEFT
, Messages
.ChannelConfigPage_SubBufSizeTooltip
, null),
100 new ColumnData(Messages
.ChannelConfigPage_ChannelTimer
, 150, SWT
.LEFT
, Messages
.ChannelConfigPage_ChannelTimerTooltip
, null)};
103 // ------------------------------------------------------------------------
105 // ------------------------------------------------------------------------
110 * @param channels The current channels information
111 * @param state The trace state
113 protected KernelTraceChannelConfigurationPage(TraceChannels channels
, TraceState state
) {
114 super("TraceChannelConfigurationPage"); //$NON-NLS-1$
115 fChannels
= channels
;
117 setTitle(Messages
.ChannelConfigPage_PageTitle
);
120 // ------------------------------------------------------------------------
122 // ------------------------------------------------------------------------
126 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
129 public void createControl(Composite parent
) {
130 container
= new Composite(parent
, SWT
.NULL
);
131 container
.setLayout(new GridLayout());
132 setControl(container
);
134 Composite headerComposite
= new Composite(container
, SWT
.FILL
);
135 GridLayout headerLayout
= new GridLayout(1, true);
136 headerLayout
.marginHeight
= 0;
137 headerLayout
.marginWidth
= 0;
138 headerComposite
.setLayout(headerLayout
);
139 headerComposite
.setLayoutData(new GridData(SWT
.FILL
, SWT
.FILL
, true, true));
141 tableViewer
= new TableViewer(headerComposite
, SWT
.BORDER
| SWT
.H_SCROLL
| SWT
.V_SCROLL
| SWT
.FULL_SELECTION
);
142 tableViewer
.setUseHashlookup(true);
144 Table table
= tableViewer
.getTable();
145 table
.setHeaderVisible(true);
147 fColumnNames
= new ArrayList
<String
>();
148 for (int i
= 0; i
< columnDataList
.length
; i
++) {
150 final ColumnData columnData
= columnDataList
[i
];
151 fColumnNames
.add(columnData
.header
);
152 final TableColumn tableColumn
= new TableColumn(table
, SWT
.LEFT
);
153 tableColumn
.setText(columnData
.header
);
154 tableColumn
.setWidth(columnData
.width
);
155 tableColumn
.setAlignment(columnData
.alignment
);
156 tableColumn
.setToolTipText(columnData
.tooltip
);
157 tableColumn
.setMoveable(false);
158 if (columnData
.comparator
!= null) {
159 tableColumn
.addSelectionListener(new SelectionAdapter() {
161 public void widgetSelected(SelectionEvent e
) {
162 if (tableViewer
.getTable().getSortDirection() == SWT
.UP
|| (tableViewer
.getTable().getSortColumn() != tableColumn
)) {
163 tableViewer
.setComparator(columnData
.comparator
);
164 tableViewer
.getTable().setSortDirection(SWT
.DOWN
);
166 tableViewer
.setComparator(new ViewerComparator() {
168 public int compare(Viewer viewer
,Object e1
, Object e2
) {
169 return -1 * columnData
.comparator
.compare(viewer
, e1
,e2
);
172 tableViewer
.getTable().setSortDirection(SWT
.UP
);
174 tableViewer
.getTable().setSortColumn(tableColumn
);
180 tableViewer
.setColumnProperties(fColumnNames
.toArray(new String
[0]));
182 // Create the cell editors
183 CellEditor
[] editors
= new CellEditor
[columnDataList
.length
];
185 // Column 1 : Completed (Checkbox)
186 TextCellEditor textEditor
= new TextCellEditor(table
);
187 editors
[0] = textEditor
;
189 // Column 2 : Description (Free text)
190 editors
[1] = new CheckboxCellEditor(table
);
192 // Column 3 : Owner (Combo Box)
193 editors
[2] = new CheckboxCellEditor(table
);
195 // Column 4 : Percent complete (Text with digits only)
196 textEditor
= new TextCellEditor(table
);
197 ((Text
) textEditor
.getControl()).addVerifyListener(
199 new VerifyListener() {
202 public void verifyText(VerifyEvent e
) {
203 e
.doit
= e
.text
.matches("[0-9]*"); //$NON-NLS-1$
206 editors
[3] = textEditor
;
208 textEditor
= new TextCellEditor(table
);
209 ((Text
) textEditor
.getControl()).addVerifyListener(
211 new VerifyListener() {
214 public void verifyText(VerifyEvent e
) {
215 e
.doit
= e
.text
.matches("[0-9]*"); //$NON-NLS-1$
218 editors
[4] = textEditor
;
220 textEditor
= new TextCellEditor(table
);
221 ((Text
) textEditor
.getControl()).addVerifyListener(
223 new VerifyListener() {
226 public void verifyText(VerifyEvent e
) {
227 e
.doit
= e
.text
.matches("[0-9]*"); //$NON-NLS-1$
230 editors
[5] = textEditor
;
232 // Assign the cell editors to the viewer
233 tableViewer
.setCellEditors(editors
);
234 tableViewer
.setCellModifier(new TraceChannelCellModifier(this));
236 tableViewer
.setContentProvider(new TraceChannelTableContentProvider());
237 tableViewer
.setLabelProvider(new TraceChannelTableLabelProvider());
239 table
.setLayoutData(new GridData(SWT
.FILL
, SWT
.FILL
, true, true));
246 * @see org.eclipse.jface.dialogs.DialogPage#dispose()
249 public void dispose() {
254 * @see org.eclipse.jface.dialogs.DialogPage#setVisible(boolean)
257 public void setVisible(boolean visible
) {
258 if (visible
&& (fChannels
!= null)) {
259 // Get new channels configuration
260 tableViewer
.setInput(fChannels
);
262 Table table
= tableViewer
.getTable();
263 TableItem
[] items
= table
.getItems();
264 for (int i
= 0; i
< items
.length
; i
++) {
266 items
[i
].setBackground(Display
.getDefault().getSystemColor(SWT
.COLOR_TITLE_INACTIVE_BACKGROUND
));
269 if ((fTraceState
!= TraceState
.CREATED
) && (fTraceState
!= TraceState
.CONFIGURED
)) {
270 items
[i
].setForeground(Display
.getDefault().getSystemColor(SWT
.COLOR_DARK_GRAY
));
276 super.setVisible(visible
);
280 * Gets the list of column names.
282 * @return list of column names
284 public List
<String
> getColumnProperties() {
289 * Refreshes the table.
291 public void refresh() {
292 tableViewer
.refresh();
296 * Gets the trace state.
298 * @return trace state
300 public TraceState
getTraceState() {
305 * Gets if trace is a local trace (i.e. if trace output is stored on host
306 * where client is running)
308 * @return isLocalTrace
310 public boolean isLocalTrace() {
311 TraceConfigurationPage configPage
= (TraceConfigurationPage
) getPreviousPage();
312 return configPage
.isLocalTrace();
317 * @see org.eclipse.linuxtools.lttng.rse.ui.wizards.ITraceChannelConfigurationPage#getTraceChannels()
320 public TraceChannels
getTraceChannels() {
325 * Local class to configure table columns
327 private static final class ColumnData
{
328 // Name of the column.
329 public final String header
;
330 // Width of the column.
331 public final int width
;
332 // Alignment of the column.
333 public final int alignment
;
334 // Tooltip of the column.
335 public final String tooltip
;
336 // Used to sort elements of this column. Can be null.
337 public final ViewerComparator comparator
;
339 public ColumnData(String h
, int w
, int a
, String t
, ViewerComparator c
) {
349 * Creates actions for context sensitive menu.
351 private void makeActions() {
353 // Create the context menu actions
354 enableAllAction
= new Action(Messages
.ChannelConfigPage_EnableAll
, Activator
.getDefault().getImageDescriptor(Activator
.ICON_ID_CHECKED
)) {
357 TableItem
[] items
= tableViewer
.getTable().getItems();
358 for (int i
= 0; i
< items
.length
; i
++) {
359 TraceChannel chan
= (TraceChannel
)items
[i
].getData();
360 chan
.setIsEnabled(true);
362 tableViewer
.refresh();
366 disableAllAction
= new Action(Messages
.ChannelConfigPage_DisableAll
, Activator
.getDefault().getImageDescriptor(Activator
.ICON_ID_UNCHECKED
)) {
369 TableItem
[] items
= tableViewer
.getTable().getItems();
370 for (int i
= 0; i
< items
.length
; i
++) {
371 TraceChannel chan
= (TraceChannel
)items
[i
].getData();
372 chan
.setIsEnabled(false);
374 tableViewer
.refresh();
377 setOverrideAllAction
= new Action(Messages
.ChannelConfigPage_EnableAllBufferOverride
, Activator
.getDefault().getImageDescriptor(Activator
.ICON_ID_CHECKED
)) {
380 TableItem
[] items
= tableViewer
.getTable().getItems();
381 for (int i
= 0; i
< items
.length
; i
++) {
382 TraceChannel chan
= (TraceChannel
)items
[i
].getData();
383 chan
.setIsChannelOverride(true);
385 tableViewer
.refresh();
388 resetOverideAllAction
= new Action(Messages
.ChannelConfigage_DisableAllBufferOverride
, Activator
.getDefault().getImageDescriptor(Activator
.ICON_ID_UNCHECKED
)) {
391 TableItem
[] items
= tableViewer
.getTable().getItems();
392 for (int i
= 0; i
< items
.length
; i
++) {
393 TraceChannel chan
= (TraceChannel
)items
[i
].getData();
394 chan
.setIsChannelOverride(false);
396 tableViewer
.refresh();
399 setNumSubbufAction
= new Action(Messages
.ChannelConfigPage_SetAllNumSubBuf
, Activator
.getDefault().getImageDescriptor(Activator
.ICON_ID_EDIT
)) {
402 TableItem
[] items
= tableViewer
.getTable().getItems();
403 SetDialog setDialog
= new SetDialog(getShell(), Messages
.ChannelConfigPage_NumSubBuf
);
404 if (setDialog
.open() == Window
.OK
) {
406 for (int i
= 0; i
< items
.length
; i
++) {
407 TraceChannel chan
= (TraceChannel
)items
[i
].getData();
408 chan
.setSubbufNum(setDialog
.getValue());
411 tableViewer
.refresh();
415 setSubbufSizeAction
= new Action(Messages
.channelConfigPage_SetAllSubBufSize
, Activator
.getDefault().getImageDescriptor(Activator
.ICON_ID_EDIT
)) {
418 TableItem
[] items
= tableViewer
.getTable().getItems();
419 SetDialog setDialog
= new SetDialog(getShell(), Messages
.ChannelConfigPage_SubBufSize
);
420 if (setDialog
.open() == Window
.OK
) {
422 for (int i
= 0; i
< items
.length
; i
++) {
423 TraceChannel chan
= (TraceChannel
)items
[i
].getData();
424 chan
.setSubbufSize(setDialog
.getValue());
427 tableViewer
.refresh();
431 setChanTimerAction
= new Action(Messages
.ChannelConfigPage_SetAllChannelTimer
, Activator
.getDefault().getImageDescriptor("ICON_ID_EDIT")) { //$NON-NLS-1$
434 TableItem
[] items
= tableViewer
.getTable().getItems();
435 SetDialog setDialog
= new SetDialog(getShell(), Messages
.ChannelConfigPage_ChannelTimer
);
436 if (setDialog
.open() == Window
.OK
) {
438 for (int i
= 0; i
< items
.length
; i
++) {
439 TraceChannel chan
= (TraceChannel
)items
[i
].getData();
440 chan
.setTimer(setDialog
.getValue());
443 tableViewer
.refresh();
450 * Adds context sensitive menu to table.
452 private void addContextMenu() {
453 MenuManager manager
= new MenuManager("configChanPopupMenu"); //$NON-NLS-1$
454 manager
.setRemoveAllWhenShown(true);
455 manager
.addMenuListener(new IMenuListener() {
458 public void menuAboutToShow(IMenuManager manager
) {
460 if ((fTraceState
!= TraceState
.CREATED
) && (fTraceState
!= TraceState
.CONFIGURED
)) {
463 manager
.add(enableAllAction
);
464 manager
.add(disableAllAction
);
465 manager
.add(setOverrideAllAction
);
466 manager
.add(resetOverideAllAction
);
467 manager
.add(setNumSubbufAction
);
468 manager
.add(setSubbufSizeAction
);
469 manager
.add(setChanTimerAction
);
473 Menu menu
= manager
.createContextMenu(tableViewer
.getControl());
474 tableViewer
.getControl().setMenu(menu
);
478 * Local class dialog box implementation for setting values for all
479 * rows for a given column
481 private static final class SetDialog
extends Dialog
{
483 // ------------------------------------------------------------------------
485 // ------------------------------------------------------------------------
487 private String fWhat
= null;
488 private Text fValueText
= null;
489 private Long fValue
= null;
491 // ------------------------------------------------------------------------
493 // ------------------------------------------------------------------------
495 public SetDialog(Shell parentShell
, String what
) {
500 // ------------------------------------------------------------------------
502 // ------------------------------------------------------------------------
506 * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
509 protected void configureShell(Shell newShell
) {
510 super.configureShell(newShell
);
511 newShell
.setText(Messages
.ChannelConfigPage_SetAll
);
512 newShell
.setImage(Activator
.getDefault().getImage(Activator
.ICON_ID_EDIT
));
517 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
520 protected Control
createDialogArea(Composite parent
) {
522 Composite composite
= new Composite(parent
, SWT
.RESIZE
);
523 GridLayout mainLayout
= new GridLayout(3, true);
524 composite
.setLayout(mainLayout
);
525 Label what
= new Label(composite
, SWT
.LEFT
);
526 what
.setLayoutData(new GridData(GridData
.FILL
, GridData
.CENTER
, true, false, 1, 1));
529 fValueText
= new Text(composite
, SWT
.LEFT
);
530 fValueText
.setLayoutData(new GridData(GridData
.FILL
, GridData
.CENTER
, true, false, 2, 1));
532 fValueText
.addVerifyListener(
533 new VerifyListener() {
536 public void verifyText(VerifyEvent e
) {
537 e
.doit
= e
.text
.matches("[0-9]*"); //$NON-NLS-1$
541 fValueText
.addListener(SWT
.Modify
, new Listener() {
543 public void handleEvent(Event event
) {
544 Button ok
= getButton(IDialogConstants
.OK_ID
);
545 ok
.setEnabled(validateInput(fValueText
.getText()));
554 * @see org.eclipse.jface.dialogs.Dialog#createButtonsForButtonBar(org.eclipse.swt.widgets.Composite)
557 protected void createButtonsForButtonBar(Composite parent
) {
558 Button ok
= createButton(parent
, IDialogConstants
.OK_ID
, IDialogConstants
.OK_LABEL
, true);
559 createButton(parent
, IDialogConstants
.CANCEL_ID
, IDialogConstants
.CANCEL_LABEL
, false);
561 ok
.setEnabled(false);
566 * @see org.eclipse.jface.dialogs.Dialog#okPressed()
569 protected void okPressed() {
570 fValue
= Long
.valueOf(fValueText
.getText());
575 * Method to validate input.
577 private boolean validateInput(String path
) {
578 return (path
.trim().length() > 0);
582 * Gets value that the user input.
586 public Long
getValue() {