class PythonWindow(KeyListener): def __init__(self): self.frame = JFrame("Python Window") self.historyList = JList(DefaultListModel()) self.historyList.cellRenderer = MyListCellRenderer() #self.historyPanel.layout = BoxLayout( # self.historyPanel, # BoxLayout.Y_AXIS #) scrollpane = JScrollPane() # JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, # JScrollPane.HORIZONTAL_SCROLLBAR_NEVER #) # scrollpane.preferredSize = 400, 800 inputPanel = JPanel() inputPanel.layout = GridLayout(1, 1) self.input = JTextArea("") self.input.border = BorderFactory.createEmptyBorder(5, 5, 5, 5) self.input.tabSize = 4 self.input.font = Font("Monospaced", Font.PLAIN, 12) #self.input.preferredSize = 500, 200 self.input.addKeyListener(self) #self.button = JButton('Run', actionPerformed=self.run) inputPanel.add(self.input) #inputPanel.add(self.button) scrollpane.viewport.view = self.historyList self.frame.add(scrollpane, BorderLayout.CENTER) self.frame.add(inputPanel, BorderLayout.PAGE_END) self.frame.size = 500, 600 self.frame.visible = False def toggle_visibility(self): self.frame.visible = not self.frame.visible def add(self, text, type="input"): self.historyList.model.addElement({"text": text, "type": type}) self.historyList.validate() self.frame.validate() last = self.historyList.model.getSize() - 1 self.historyList.ensureIndexIsVisible(last) def write(self, text): self.add(text, "output") def run(self, evt): source = self.input.text if not source.strip(): self.input.text = "" return processed_source = source.replace("$", "geo.") code = interface.compileinteractive(processed_source) if code in ("continue", "error"): code = interface.compilemodule(processed_source) if code == "error": return self.add(source.strip()) result = interface.run(code) if result == "OK": self.input.text = "" def keyPressed(self, evt): pass def keyReleased(self, evt): pass def keyTyped(self, evt): if evt.keyChar == '\n': # Only try to run compound statements when they end with # two \n source = self.input.text lines = source.split("\n") if lines[0].rstrip().endswith(":") and not source.endswith("\n\n"): for i, c in enumerate(lines[-2]): if c not in ' \t': break else: self.run(evt) return prefix = lines[-2][:i] if lines[-2].endswith(":"): prefix += '\t' self.input.text = source + prefix else: self.run(evt)