package com.googlecode.lanterna.terminal.swing;
import com.googlecode.lanterna.TerminalSize;
import com.googlecode.lanterna.TextCharacter;
import com.googlecode.lanterna.input.KeyStroke;
import java.awt.*;
import java.awt.event.*;
import java.util.Collections;
class AWTTerminalImplementation extends GraphicalTerminalImplementation {
private final Component component;
private final AWTTerminalFontConfiguration fontConfiguration;
AWTTerminalImplementation(
Component component,
AWTTerminalFontConfiguration fontConfiguration,
TerminalSize initialTerminalSize,
TerminalEmulatorDeviceConfiguration deviceConfiguration,
TerminalEmulatorColorConfiguration colorConfiguration,
TerminalScrollController scrollController) {
super(initialTerminalSize, deviceConfiguration, colorConfiguration, scrollController);
this.component = component;
this.fontConfiguration = fontConfiguration;
component.setMinimumSize(new Dimension(fontConfiguration.getFontWidth(), fontConfiguration.getFontHeight()));
component.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, Collections.<AWTKeyStroke>emptySet());
component.setFocusTraversalKeys(KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS, Collections.<AWTKeyStroke>emptySet());
component.addKeyListener(new TerminalInputListener());
component.addMouseListener(new TerminalMouseListener() {
@Override
public void mouseClicked(MouseEvent e) {
super.mouseClicked(e);
AWTTerminalImplementation.this.component.requestFocusInWindow();
}
});
component.addHierarchyListener(e -> {
if(e.getChangeFlags() == HierarchyEvent.DISPLAYABILITY_CHANGED) {
if(e.getChanged().isDisplayable()) {
onCreated();
}
else {
onDestroyed();
}
}
});
}
public AWTTerminalFontConfiguration getFontConfiguration() {
return fontConfiguration;
}
@Override
protected int getFontHeight() {
return fontConfiguration.getFontHeight();
}
@Override
protected int getFontWidth() {
return fontConfiguration.getFontWidth();
}
@Override
protected int getHeight() {
return component.getHeight();
}
@Override
protected int getWidth() {
return component.getWidth();
}
@Override
protected Font getFontForCharacter(TextCharacter character) {
return fontConfiguration.getFontForCharacter(character);
}
@Override
protected boolean isTextAntiAliased() {
return fontConfiguration.isAntiAliased();
}
@Override
protected void repaint() {
if(EventQueue.isDispatchThread()) {
component.repaint();
}
else {
EventQueue.invokeLater(component::repaint);
}
}
@Override
public KeyStroke readInput() {
if(EventQueue.isDispatchThread()) {
throw new UnsupportedOperationException("Cannot call SwingTerminal.readInput() on the AWT thread");
}
return super.readInput();
}
}