blob: 87169a65c36b03b05f0bef12f9b93d6d42e4991c [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009, 2014 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:
* Wiliam Bourque - Adapted from SpinnerGroup (in TimeFrameView)
* Francois Chouinard - Cleanup and refactoring
* Francois Chouinard - Moved from LTTng to TMF
* Francois Chouinard - Better handling of control display, support for signals
* Patrick Tasse - Update for mouse wheel zoom
*******************************************************************************/
package org.eclipse.tracecompass.tmf.ui.views.histogram;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.FocusListener;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.KeyListener;
import org.eclipse.swt.events.MouseWheelListener;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.FontData;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.tracecompass.tmf.core.signal.TmfSignalManager;
/**
* This control provides a group containing a text control.
*
* @version 1.1
* @author Francois Chouinard
*/
public abstract class HistogramTextControl implements FocusListener, KeyListener {
// ------------------------------------------------------------------------
// Attributes
// ------------------------------------------------------------------------
/**
* The parent histogram view.
*/
protected final HistogramView fParentView;
// Controls data
private final Composite fParent;
private Font fFont;
private final Composite fComposite;
private final Label fLabel;
/**
* The text value field.
*/
protected final Text fTextValue;
private long fValue;
// ------------------------------------------------------------------------
// Constructors
// ------------------------------------------------------------------------
/**
* Constructor with given group and text values.
*
* @param parentView The parent histogram view.
* @param parent The parent composite
* @param label The text label
* @param value The initial value
*/
public HistogramTextControl(HistogramView parentView, Composite parent, String label, long value)
{
fParentView = parentView;
fParent = parent;
// --------------------------------------------------------------------
// Reduce font size for a more pleasing rendering
// --------------------------------------------------------------------
final int fontSizeAdjustment = -1;
final Font font = parent.getFont();
final FontData fontData = font.getFontData()[0];
fFont = new Font(font.getDevice(), fontData.getName(), fontData.getHeight() + fontSizeAdjustment, fontData.getStyle());
// --------------------------------------------------------------------
// Create the group
// --------------------------------------------------------------------
// Re-used layout variables
GridLayout gridLayout;
GridData gridData;
// Composite
gridLayout = new GridLayout(3, false);
gridLayout.marginHeight = 0;
gridLayout.marginWidth = 0;
fComposite = new Composite(fParent, SWT.NONE);
fComposite.setLayout(gridLayout);
gridData = new GridData(SWT.FILL, SWT.CENTER, true, false);
Label filler = new Label(fComposite, SWT.NONE);
filler.setLayoutData(gridData);
// Label
gridData = new GridData(SWT.CENTER, SWT.CENTER, false, false);
fLabel = new Label(fComposite, SWT.NONE);
fLabel.setText(label);
fLabel.setFont(fFont);
fLabel.setLayoutData(gridData);
// Text control
gridData = new GridData(SWT.CENTER, SWT.CENTER, false, false);
fTextValue = new Text(fComposite, SWT.BORDER);
fTextValue.setFont(fFont);
fTextValue.setLayoutData(gridData);
// --------------------------------------------------------------------
// Add listeners
// --------------------------------------------------------------------
fTextValue.addFocusListener(this);
fTextValue.addKeyListener(this);
TmfSignalManager.register(this);
}
/**
* Dispose of the widget
*/
public void dispose() {
fFont.dispose();
TmfSignalManager.deregister(this);
}
// ------------------------------------------------------------------------
// Accessors
// ------------------------------------------------------------------------
/**
* Returns if widget isDisposed or not
* @return <code>true</code> if widget is disposed else <code>false</code>
*/
public boolean isDisposed() {
return fComposite.isDisposed();
}
// ------------------------------------------------------------------------
// Operations
// ------------------------------------------------------------------------
/**
* Updates the text value.
*/
protected abstract void updateValue();
/**
* Set the Grid Layout Data for the group.
* @param layoutData A GridData to set.
*/
public void setLayoutData(GridData layoutData) {
fComposite.setLayoutData(layoutData);
}
/**
* Enables the receiver if the argument is <code>true</code>,
* and disables it otherwise. A disabled control is typically
* not selectable from the user interface and draws with an
* inactive or "grayed" look.
*
* @param enabled the new enabled state
*/
public void setEnabled(boolean enabled) {
fTextValue.setEnabled(enabled);
}
/**
* The time value in to set in the text field.
*
* @param time the time to set
* @param displayTime the display value
*/
protected void setValue(final long time, final String displayTime) {
// If this is the UI thread, process now
Display display = Display.getCurrent();
if (display != null) {
if (!isDisposed()) {
fValue = time;
fTextValue.setText(displayTime);
fComposite.layout();
fParent.getParent().layout();
}
return;
}
// Call self from the UI thread
if (!isDisposed()) {
Display.getDefault().asyncExec(() -> {
if (!isDisposed()) {
setValue(time, displayTime);
}
});
}
}
/**
* @param time the time value to display
*/
public abstract void setValue(long time);
/**
* Returns the time value.
* @return time value.
*/
public long getValue() {
return fValue;
}
/**
* Add a mouse wheel listener to the text control
* @param listener the mouse wheel listener
*/
public void addMouseWheelListener(MouseWheelListener listener) {
fTextValue.addMouseWheelListener(listener);
}
/**
* Remove a mouse wheel listener from the text control
* @param listener the mouse wheel listener
*/
public void removeMouseWheelListener(MouseWheelListener listener) {
fTextValue.removeMouseWheelListener(listener);
}
// ------------------------------------------------------------------------
// FocusListener
// ------------------------------------------------------------------------
@Override
public void focusGained(FocusEvent event) {
}
@Override
public void focusLost(FocusEvent event) {
updateValue();
}
// ------------------------------------------------------------------------
// KeyListener
// ------------------------------------------------------------------------
@Override
public void keyPressed(KeyEvent event) {
switch (event.character) {
case SWT.CR:
updateValue();
break;
default:
break;
}
}
@Override
public void keyReleased(KeyEvent e) {
}
}