package com.googlecode.lanterna.gui2;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import com.googlecode.lanterna.TerminalPosition;
import com.googlecode.lanterna.gui2.menu.MenuBar;
import com.googlecode.lanterna.input.KeyStroke;
public abstract class AbstractComposite<T extends Container> extends AbstractComponent<T> implements Composite, Container {
private Component component;
public AbstractComposite() {
component = null;
}
@Override
public void setComponent(Component component) {
Component oldComponent = this.component;
if(oldComponent == component) {
return;
}
if(oldComponent != null) {
removeComponent(oldComponent);
}
if (component != null) {
this.component = component;
component.onAdded(this);
if (getBasePane() != null) {
MenuBar menuBar = getBasePane().getMenuBar();
if (menuBar == null || menuBar.isEmptyMenuBar()) {
component.setPosition(TerminalPosition.TOP_LEFT_CORNER);
} else {
component.setPosition(TerminalPosition.TOP_LEFT_CORNER.withRelativeRow(1));
}
}
invalidate();
}
}
@Override
public Component getComponent() {
return component;
}
@Override
public int getChildCount() {
return component != null ? 1 : 0;
}
@Override
public List<Component> getChildrenList() {
if(component != null) {
return Collections.singletonList(component);
}
else {
return Collections.emptyList();
}
}
@Override
public Collection<Component> getChildren() {
return getChildrenList();
}
@Override
public boolean containsComponent(Component component) {
return component != null && component.hasParent(this);
}
@Override
public boolean removeComponent(Component component) {
if(this.component == component) {
this.component = null;
component.onRemoved(this);
invalidate();
return true;
}
return false;
}
@Override
public boolean isInvalid() {
return component != null && component.isInvalid();
}
@Override
public void invalidate() {
super.invalidate();
if(component != null) {
component.invalidate();
}
}
@Override
public Interactable nextFocus(Interactable fromThis) {
if(fromThis == null && getComponent() instanceof Interactable) {
Interactable interactable = (Interactable) getComponent();
if(interactable.isEnabled()) {
return interactable;
}
}
else if(getComponent() instanceof Container) {
return ((Container)getComponent()).nextFocus(fromThis);
}
return null;
}
@Override
public Interactable previousFocus(Interactable fromThis) {
if(fromThis == null && getComponent() instanceof Interactable) {
Interactable interactable = (Interactable) getComponent();
if(interactable.isEnabled()) {
return interactable;
}
}
else if(getComponent() instanceof Container) {
return ((Container)getComponent()).previousFocus(fromThis);
}
return null;
}
@Override
public boolean handleInput(KeyStroke key) {
return false;
}
@Override
public void updateLookupMap(InteractableLookupMap interactableLookupMap) {
if(getComponent() instanceof Container) {
((Container)getComponent()).updateLookupMap(interactableLookupMap);
}
else if(getComponent() instanceof Interactable) {
interactableLookupMap.add((Interactable)getComponent());
}
}
}