blob: 1045d38ce2c4107e1f3b4aa4a0dd3b947f99730e [file] [log] [blame]
/**********************************************************************
* Copyright (c) 2016 Ericsson
*
* All rights reserved. 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:
* Bruno Roy - Initial API and implementation
**********************************************************************/
package org.eclipse.tracecompass.internal.lttng2.control.ui.views.dialogs;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CCombo;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Point;
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.Control;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.tracecompass.internal.lttng2.control.core.model.LogLevelType;
import org.eclipse.tracecompass.internal.lttng2.control.core.model.TraceDomainType;
import org.eclipse.tracecompass.internal.lttng2.control.core.model.TraceJulLogLevel;
import org.eclipse.tracecompass.internal.lttng2.control.core.model.TraceLog4jLogLevel;
import org.eclipse.tracecompass.internal.lttng2.control.core.model.TraceLogLevel;
import org.eclipse.tracecompass.internal.lttng2.control.core.model.TracePythonLogLevel;
import org.eclipse.tracecompass.internal.lttng2.control.core.model.ITraceLogLevel;
import org.eclipse.tracecompass.internal.lttng2.control.ui.Activator;
import org.eclipse.tracecompass.internal.lttng2.control.ui.views.messages.Messages;
/**
* Dialog box for collecting information about the loggers to enable.
*
* @author Bruno Roy
*/
public class GetLoggerInfoDialog extends BaseGetInfoDialog implements IGetLoggerInfoDialog {
// ------------------------------------------------------------------------
// Attributes
// ------------------------------------------------------------------------
/**
* A button for selecting the log level (range 0 to level).
*/
private Button fLogLevelButton;
/**
* A button for selecting the specified log level only.
*/
private Button fLogLevelOnlyButton;
/**
* A Combo box for selecting the log level.
*/
private CCombo fLogLevelCombo;
/**
* The selected log level.
*/
private ITraceLogLevel fLogLevel;
/**
* The type of the log level (loglevel or loglevel-only)
*/
private LogLevelType fLogLevelType;
/**
* The logger domain type ({@link TraceDomainType})
*/
private TraceDomainType fLoggerDomain = TraceDomainType.UNKNOWN;
// ------------------------------------------------------------------------
// Constructors
// ------------------------------------------------------------------------
/**
* Constructor of dialog box.
*
* @param shell
* the shell for the dialog box
*/
public GetLoggerInfoDialog(Shell shell) {
super(shell);
}
// ------------------------------------------------------------------------
// Accessors
// ------------------------------------------------------------------------
@Override
public ITraceLogLevel getLogLevel() {
return fLogLevel;
}
@Override
public LogLevelType getLogLevelType() {
return fLogLevelType;
}
@Override
public void setLoggerDomain(TraceDomainType domain) {
fLoggerDomain = domain;
}
// ------------------------------------------------------------------------
// Operations
// ------------------------------------------------------------------------
@Override
protected void configureShell(Shell newShell) {
super.configureShell(newShell);
newShell.setText(Messages.TraceControl_EnableLoggersDialogTitle);
newShell.setImage(Activator.getDefault().loadIcon(TARGET_NEW_CONNECTION_ICON_FILE));
}
@Override
protected Control createDialogArea(Composite parent) {
fLogLevel = null;
fLogLevelType = null;
super.createDialogArea(parent);
// Main dialog panel
Composite dialogComposite = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout(1, true);
dialogComposite.setLayout(layout);
dialogComposite.setLayoutData(new GridData(GridData.FILL_BOTH));
fSessionsCombo.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent e) {
fSessionIndex = fSessionsCombo.getSelectionIndex();
fLogLevelCombo.setEnabled(fSessionIndex >= 0); // not sure what is the best method index, string or other
fLogLevelButton.setEnabled(fSessionsCombo.getText() != null);
fLogLevelOnlyButton.setEnabled(!fSessionsCombo.getText().isEmpty());
}
@Override
public void widgetDefaultSelected(SelectionEvent e) {
// Do nothing
}
});
// Create the log level group
Group logLevelGroup = new Group(dialogComposite, SWT.SHADOW_NONE);
layout = new GridLayout(2, true);
logLevelGroup.setLayout(layout);
logLevelGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
GridData data = new GridData(GridData.FILL_HORIZONTAL);
fLogLevelButton = new Button(logLevelGroup, SWT.RADIO);
fLogLevelButton.setText(Messages.TraceControl_EnableEventsLogLevelTypeName);
fLogLevelButton.setToolTipText(Messages.TraceControl_EnableEventsLogLevelTypeTooltip);
data = new GridData(GridData.FILL_BOTH);
fLogLevelButton.setLayoutData(data);
fLogLevelButton.setSelection(true);
fLogLevelOnlyButton = new Button(logLevelGroup, SWT.RADIO);
fLogLevelOnlyButton.setText(Messages.TraceControl_EnableEventsLogLevelOnlyTypeName);
fLogLevelOnlyButton.setToolTipText(Messages.TraceControl_EnableEventsLogLevelOnlyTypeTooltip);
data = new GridData(GridData.FILL_BOTH);
fLogLevelButton.setLayoutData(data);
String[] levelNames = null;
switch (fLoggerDomain) {
case JUL:
levelNames = findLoglevelNames(TraceJulLogLevel.class);
break;
case LOG4J:
levelNames = findLoglevelNames(TraceLog4jLogLevel.class);
break;
case PYTHON:
levelNames = findLoglevelNames(TracePythonLogLevel.class);
break;
//$CASES-OMITTED$
default:
break;
}
fLogLevelCombo = new CCombo(logLevelGroup, SWT.READ_ONLY);
fLogLevelCombo.setItems(levelNames);
fLogLevelCombo.setToolTipText(Messages.TraceControl_EnableEventsLogLevelTooltip);
data = new GridData(GridData.FILL_HORIZONTAL);
data.horizontalSpan = 4;
fLogLevelCombo.setLayoutData(data);
// By default the combo box and the buttons are not enabled
fLogLevelCombo.setEnabled(false);
fLogLevelButton.setEnabled(false);
fLogLevelOnlyButton.setEnabled(false);
getShell().setMinimumSize(new Point(300, 200));
return dialogComposite;
}
@Override
protected void okPressed() {
if (fSessionsCombo.getSelectionIndex() < 0) {
MessageDialog.openError(getShell(),
Messages.TraceControl_EnableLoggersDialogTitle,
Messages.TraceControl_EnableEventsNoSessionError);
return;
}
fSessionIndex = fSessionsCombo.getSelectionIndex();
fLogLevel = null;
// If nothing is selected in the combo box that means that all the loglevels should be enabled.
if (!fLogLevelCombo.getText().isEmpty()) {
ITraceLogLevel[] levels;
int id = fLogLevelCombo.getSelectionIndex();
switch (fLoggerDomain) {
case JUL:
levels = TraceJulLogLevel.values();
break;
case LOG4J:
levels = TraceLog4jLogLevel.values();
break;
case PYTHON:
levels = TracePythonLogLevel.values();
break;
//$CASES-OMITTED$
default:
levels = TraceLogLevel.values();
break;
}
fLogLevel = levels[id];
if (id < 0) {
MessageDialog.openError(getShell(),
Messages.TraceControl_EnableLoggersDialogTitle,
Messages.TraceControl_InvalidLogLevel);
}
fLogLevelType = LogLevelType.LOGLEVEL_NONE;
if (fLogLevelButton.getSelection()) {
fLogLevelType = LogLevelType.LOGLEVEL;
} else if (fLogLevelOnlyButton.getSelection()) {
fLogLevelType = LogLevelType.LOGLEVEL_ONLY;
}
}
super.okPressed();
}
// ------------------------------------------------------------------------
// Helper methods
// ------------------------------------------------------------------------
/**
* Returns the values of a certain enum type.
*
* @param enumType
* a value of an enum type, this is to determine the type of the enum
* @return an array of String of the values of the enum type
*/
private static String[] findLoglevelNames(Class<? extends ITraceLogLevel> enumType) {
ITraceLogLevel[] levels = enumType.getEnumConstants();
if (levels == null) {
return new String[0];
}
String[] levelNames = new String[levels.length - 1];
int l = 0;
for (int i = 0; i < levels.length; i++) {
if ((!levels[i].equals(TraceLog4jLogLevel.LEVEL_UNKNOWN)) &&
(!levels[i].equals(TracePythonLogLevel.LEVEL_UNKNOWN)) &&
(!levels[i].equals(TraceJulLogLevel.LEVEL_UNKNOWN))) {
levelNames[l++] = levels[i].getInName();
}
}
return levelNames;
}
}