package com.jediterm.terminal.ui;
import com.google.common.base.Predicate;
import com.jediterm.terminal.RequestOrigin;
import com.jediterm.terminal.TtyConnector;
import com.jediterm.terminal.debug.BufferPanel;
import com.jediterm.terminal.ui.settings.DefaultSettingsProvider;
import com.jediterm.terminal.ui.settings.DefaultTabbedSettingsProvider;
import org.apache.log4j.Logger;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public abstract class AbstractTerminalFrame {
public static final Logger LOG = Logger.getLogger(AbstractTerminalFrame.class);
private JFrame myBufferFrame;
private TerminalWidget myTerminal;
private AbstractAction myOpenAction = new AbstractAction("New Session") {
public void actionPerformed(final ActionEvent e) {
openSession(myTerminal);
}
};
private AbstractAction myResetDamage = new AbstractAction("Reset damage") {
public void actionPerformed(final ActionEvent e) {
myTerminal.getCurrentSession().getBackBuffer().resetDamage();
}
};
private AbstractAction myDrawDamage = new AbstractAction("Draw from damage") {
public void actionPerformed(final ActionEvent e) {
myTerminal.getCurrentSession().redraw();
}
};
private AbstractAction myShowBuffersAction = new AbstractAction("Show buffers") {
public void actionPerformed(final ActionEvent e) {
if (myBufferFrame == null) {
showBuffers();
}
}
};
private AbstractAction myDumpDimension = new AbstractAction("Dump terminal dimension") {
public void actionPerformed(final ActionEvent e) {
LOG.info(myTerminal.getTerminalDisplay().getColumnCount() +
"x" + myTerminal.getTerminalDisplay().getRowCount());
}
};
private AbstractAction myDumpCursorPosition = new AbstractAction("Dump cursor position") {
public void actionPerformed(final ActionEvent e) {
LOG.info(myTerminal.getCurrentSession().getTerminal().getCursorX() +
"x" + myTerminal.getCurrentSession().getTerminal().getCursorY());
}
};
private AbstractAction myCursor0x0 = new AbstractAction("1x1") {
public void actionPerformed(final ActionEvent e) {
myTerminal.getCurrentSession().getTerminal().cursorPosition(1, 1);
}
};
private AbstractAction myCursor10x10 = new AbstractAction("10x10") {
public void actionPerformed(final ActionEvent e) {
myTerminal.getCurrentSession().getTerminal().cursorPosition(10, 10);
}
};
private AbstractAction myCursor80x24 = new AbstractAction("80x24") {
public void actionPerformed(final ActionEvent e) {
myTerminal.getCurrentSession().getTerminal().cursorPosition(80, 24);
}
};
private JMenuBar getJMenuBar() {
final JMenuBar mb = new JMenuBar();
final JMenu m = new JMenu("File");
m.add(myOpenAction);
mb.add(m);
final JMenu dm = new JMenu("Debug");
dm.add(myShowBuffersAction);
dm.add(myResetDamage);
dm.add(myDrawDamage);
dm.addSeparator();
dm.add(myDumpDimension);
dm.add(myDumpCursorPosition);
JMenu cursorPosition = new JMenu("Set cursor position ...");
cursorPosition.add(myCursor0x0);
cursorPosition.add(myCursor10x10);
cursorPosition.add(myCursor80x24);
dm.add(cursorPosition);
mb.add(dm);
return mb;
}
private void openSession(TerminalWidget terminal) {
if (terminal.canOpenSession()) {
openSession(terminal, createTtyConnector());
}
}
public void openSession(TerminalWidget terminal, TtyConnector ttyConnector) {
TerminalSession session = terminal.createTerminalSession(ttyConnector);
session.start();
}
public abstract TtyConnector createTtyConnector();
protected AbstractTerminalFrame() {
myTerminal = new TabbedTerminalWidget(new DefaultTabbedSettingsProvider(), new Predicate<TerminalWidget>() {
@Override
public boolean apply(TerminalWidget terminalWidget) {
openSession(terminalWidget);
return true;
}
});
final JFrame frame = new JFrame("JediTerm");
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(final WindowEvent e) {
System.exit(0);
}
});
final JMenuBar mb = getJMenuBar();
frame.setJMenuBar(mb);
sizeFrameForTerm(frame);
frame.getContentPane().add("Center", myTerminal.getComponent());
frame.pack();
frame.setVisible(true);
frame.setResizable(true);
myTerminal.setTerminalPanelListener(new TerminalPanelListener() {
public void onPanelResize(final Dimension pixelDimension, final RequestOrigin origin) {
if (origin == RequestOrigin.Remote) {
sizeFrameForTerm(frame);
}
frame.pack();
}
@Override
public void onSessionChanged(final TerminalSession currentSession) {
frame.setTitle(currentSession.getSessionName());
}
@Override
public void onTitleChanged(String title) {
frame.setTitle(myTerminal.getCurrentSession().getSessionName());
}
});
openSession(myTerminal);
}
private void sizeFrameForTerm(final JFrame frame) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
Dimension d = myTerminal.getPreferredSize();
d.width += frame.getWidth() - frame.getContentPane().getWidth();
d.height += frame.getHeight() - frame.getContentPane().getHeight();
frame.setSize(d);
}
});
}
private void showBuffers() {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
myBufferFrame = new JFrame("buffers");
final JPanel panel = new BufferPanel(myTerminal.getCurrentSession());
myBufferFrame.getContentPane().add(panel);
myBufferFrame.pack();
myBufferFrame.setVisible(true);
myBufferFrame.setSize(800, 600);
myBufferFrame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(final WindowEvent e) {
myBufferFrame = null;
}
});
}
});
}
}