blob: a78b532d11f8ac7170fbf3e7da40f8eabf75c23f [file] [log] [blame]
/**********************************************************************
* Copyright (c) 2012, 2019 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:
* Bernd Hufmann - Initial API and implementation
**********************************************************************/
package org.eclipse.tracecompass.internal.lttng2.control.ui.views.model.impl;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.eclipse.core.runtime.ListenerList;
import org.eclipse.swt.graphics.Image;
import org.eclipse.tracecompass.internal.lttng2.control.core.model.TargetNodeState;
import org.eclipse.tracecompass.internal.lttng2.control.ui.Activator;
import org.eclipse.tracecompass.internal.lttng2.control.ui.views.model.ITraceControlComponent;
import org.eclipse.tracecompass.internal.lttng2.control.ui.views.model.ITraceControlComponentChangedListener;
import org.eclipse.tracecompass.internal.lttng2.control.ui.views.service.ILttngControlService;
/**
* <p>
* Base implementation for trace control component.
* </p>
*
* @author Bernd Hufmann
*/
public class TraceControlComponent implements ITraceControlComponent {
// ------------------------------------------------------------------------
// Constants
// ------------------------------------------------------------------------
// ------------------------------------------------------------------------
// Attributes
// ------------------------------------------------------------------------
/**
* The name of the component
*/
private String fName = ""; //$NON-NLS-1$
/**
* The image to be displayed for the component.
*/
private Image fImage = null;
/**
* The tool tip to be displayed for the component.
*/
private String fToolTip = null;
/**
* The parent component.
*/
private ITraceControlComponent fParent = null;
/**
* The list if children components.
*/
private final List<ITraceControlComponent> fChildren = new ArrayList<>();
/**
* The list of listeners to be notified about changes.
*/
private final ListenerList<ITraceControlComponentChangedListener> fListeners = new ListenerList<>();
// ------------------------------------------------------------------------
// Constructors
// ------------------------------------------------------------------------
/**
* Constructor
* @param name - the name of the component.
*/
public TraceControlComponent(String name) {
this(name, null);
}
/**
* Constructor
* @param name - the name of the component.
* @param parent - the parent component.
*/
public TraceControlComponent(String name, ITraceControlComponent parent) {
fName = name;
fParent = parent;
}
// ------------------------------------------------------------------------
// Accessors
// ------------------------------------------------------------------------
@Override
public String getName() {
return fName;
}
@Override
public void setName(String name) {
fName = name;
}
@Override
public Image getImage() {
return fImage;
}
@Override
public void setImage(String path) {
fImage = Activator.getDefault().loadIcon(path);
}
@Override
public void setImage(Image image) {
fImage = image;
}
@Override
public String getToolTip() {
return fToolTip;
}
@Override
public void setToolTip(String toolTip) {
fToolTip = toolTip;
}
@Override
public TargetNodeState getTargetNodeState() {
if (getParent() != null) {
return getParent().getTargetNodeState();
}
return TargetNodeState.DISCONNECTED;
}
@Override
public void setTargetNodeState(TargetNodeState state) {
if (getParent() != null) {
getParent().setTargetNodeState(state);
}
}
@Override
public ITraceControlComponent getParent() {
return fParent;
}
@Override
public void setParent(ITraceControlComponent parent) {
fParent = parent;
}
@Override
public ITraceControlComponent[] getChildren() {
return fChildren.toArray(new ITraceControlComponent[fChildren.size()]);
}
@Override
public void setChildren(List<ITraceControlComponent> children) {
for (Iterator<ITraceControlComponent> iterator = children.iterator(); iterator.hasNext();) {
ITraceControlComponent traceControlComponent = iterator.next();
fChildren.add(traceControlComponent);
}
fireComponentChanged(this);
}
@Override
public ITraceControlComponent getChild(String name) {
ITraceControlComponent child = null;
for (int i = 0; i < fChildren.size(); i++) {
if (fChildren.get(i).getName().equals(name)) {
child = fChildren.get(i);
break;
}
}
return child;
}
@Override
public List<ITraceControlComponent> getChildren(Class<? extends ITraceControlComponent> clazz) {
List<ITraceControlComponent> list = new ArrayList<>();
for (Iterator<ITraceControlComponent> iterator = fChildren.iterator(); iterator.hasNext();) {
ITraceControlComponent child = iterator.next();
if (child.getClass() == clazz) {
list.add(child);
}
}
return list;
}
@Override
public ILttngControlService getControlService() {
if (getParent() != null) {
return getParent().getControlService();
}
return null;
}
@Override
public void setControlService(ILttngControlService service) {
if (getParent() != null) {
getParent().setControlService(service);
}
}
// ------------------------------------------------------------------------
// Operations
// ------------------------------------------------------------------------
@Override
public void dispose() {
// default implementation
}
@Override
public void addChild(ITraceControlComponent component) {
if (component != null) {
fChildren.add(component);
}
fireComponentAdded(this, component);
}
@Override
public void removeChild(ITraceControlComponent component) {
if (component != null) {
fChildren.remove(component);
component.dispose();
}
fireComponentRemoved(this, component);
}
@Override
public void removeAllChildren() {
for (Iterator<ITraceControlComponent> iterator = fChildren.iterator(); iterator.hasNext();) {
ITraceControlComponent child = iterator.next();
child.removeAllChildren();
}
fChildren.clear();
// fireCompenentChanged(this);
}
@Override
public boolean containsChild(String name) {
boolean retValue = false;
for (int i = 0; i < fChildren.size(); i++) {
if (fChildren.get(i).getName().equals(name)) {
retValue = true;
break;
}
}
return retValue;
}
@Override
public boolean hasChildren() {
return !fChildren.isEmpty();
}
@Override
public void addComponentListener(ITraceControlComponentChangedListener listener) {
if (fParent != null) {
fParent.addComponentListener(listener);
} else {
fListeners.add(listener);
}
}
@Override
public void removeComponentListener(ITraceControlComponentChangedListener listener) {
if (fParent != null) {
fParent.removeComponentListener(listener);
} else {
fListeners.remove(listener);
}
}
@Override
public void fireComponentAdded(ITraceControlComponent parent, ITraceControlComponent component) {
if (component == null) {
return;
}
if (fParent != null) {
fParent.fireComponentAdded(parent, component);
} else {
Object[] listeners = fListeners.getListeners();
for (int i = 0; i < listeners.length; i++) {
ITraceControlComponentChangedListener listener = (ITraceControlComponentChangedListener) listeners[i];
listener.componentAdded(parent, component);
}
}
}
@Override
public void fireComponentRemoved(ITraceControlComponent parent, ITraceControlComponent component) {
if (component == null) {
return;
}
if (fParent != null) {
fParent.fireComponentRemoved(parent, component);
} else {
Object[] listeners = fListeners.getListeners();
for (int i = 0; i < listeners.length; i++) {
ITraceControlComponentChangedListener listener = (ITraceControlComponentChangedListener) listeners[i];
listener.componentRemoved(parent, component);
}
}
}
@Override
public void fireComponentChanged(ITraceControlComponent component) {
if (component == null) {
return;
}
if (fParent != null) {
fParent.fireComponentChanged(component);
} else {
Object[] listeners = fListeners.getListeners();
for (int i = 0; i < listeners.length; i++) {
ITraceControlComponentChangedListener listener = (ITraceControlComponentChangedListener) listeners[i];
listener.componentChanged(component);
}
}
}
@Override
public <T> T getAdapter(Class<T> adapter) {
return null;
}
}