| package com.jetbrains.python.edu.ui; |
| |
| import com.intellij.ui.DocumentAdapter; |
| import com.intellij.ui.components.JBScrollPane; |
| import org.jetbrains.annotations.NotNull; |
| import com.jetbrains.python.edu.course.UserTest; |
| |
| import javax.swing.*; |
| import javax.swing.event.DocumentEvent; |
| import javax.swing.text.BadLocationException; |
| import java.awt.*; |
| |
| public class StudyTestContentPanel extends JPanel { |
| public static final Dimension PREFERRED_SIZE = new Dimension(300, 200); |
| private static final Font HEADER_FONT = new Font("Arial", Font.BOLD, 16); |
| private final JTextArea myInputArea = new JTextArea(); |
| private final JTextArea myOutputArea = new JTextArea(); |
| public StudyTestContentPanel(UserTest userTest) { |
| this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); |
| initContentLabel("input", myInputArea); |
| myInputArea.getDocument().addDocumentListener(new BufferUpdater(userTest.getInputBuffer())); |
| myOutputArea.getDocument().addDocumentListener(new BufferUpdater(userTest.getOutputBuffer())); |
| initContentLabel("output", myOutputArea); |
| setEditable(userTest.isEditable()); |
| } |
| |
| private void initContentLabel(final String headerText, @NotNull final JTextArea contentArea) { |
| JLabel headerLabel = new JLabel(headerText); |
| headerLabel.setFont(HEADER_FONT); |
| this.add(headerLabel); |
| this.add(new JSeparator(SwingConstants.HORIZONTAL)); |
| JScrollPane scroll = new JBScrollPane(contentArea); |
| scroll.setPreferredSize(PREFERRED_SIZE); |
| this.add(scroll); |
| } |
| |
| private void setEditable(boolean isEditable) { |
| myInputArea.setEditable(isEditable); |
| myOutputArea.setEditable(isEditable); |
| } |
| public void addInputContent(final String content) { |
| myInputArea.setText(content); |
| } |
| |
| public void addOutputContent(final String content) { |
| myOutputArea.setText(content); |
| } |
| |
| private class BufferUpdater extends DocumentAdapter { |
| private final StringBuilder myBuffer; |
| |
| private BufferUpdater(StringBuilder buffer) { |
| myBuffer = buffer; |
| } |
| |
| @Override |
| protected void textChanged(DocumentEvent e) { |
| myBuffer.delete(0, myBuffer.length()); |
| try { |
| myBuffer.append(e.getDocument().getText(0, e.getDocument().getLength())); |
| } |
| catch (BadLocationException e1) { |
| e1.printStackTrace(); |
| } |
| } |
| } |
| } |