-
Notifications
You must be signed in to change notification settings - Fork 1
/
MagicDrawJythonTerminal.py
159 lines (134 loc) · 5.36 KB
/
MagicDrawJythonTerminal.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
from com.nomagic.magicdraw.core import Application
from com.nomagic.magicdraw.ui.dialogs import MDDialogParentProvider
from org.python.util import PythonInterpreter
from javax.swing import JOptionPane
from javax.swing import JFrame
from javax.swing import JButton
from javax.swing import JScrollPane
from javax.swing import JTextArea
from javax.swing import JTextField
from java.awt import BorderLayout
from java.awt import Dimension
from java.awt import Color
from java.io import OutputStream
from java.io import PrintStream
from java.io import Writer
from java.io import PrintWriter
from java.lang import String
from java.lang import StringBuilder
from java.lang import System
import sys
# useful for debugging
# JOptionPane.showMessageDialog(None, "debug message")
###
# Minimal writer subclass for writer based output
class TerminalWriter(Writer):
def __init__(self, textArea):
Writer.__init__(self)
self.terminal = textArea
def flush(self):
return
def close(self):
return
def write(self, cbuf, offset, len):
s = String(cbuf, offset, len)
self.terminal.append(s)
###
# Minimal outputstream subclass for outputstream based output
# note, this is currently how this is wired up
class TerminalOutputStream(OutputStream):
sb = StringBuilder()
def __init__(self, textArea):
OutputStream.__init__(self)
self.terminal = textArea
def flush(self):
return
def close(self):
return
def write(self, b):
if b == '\r':
return
if b == '\n':
self.textArea.append(self.sb.toString())
self.sb.setLength(0)
self.sb.append(b)
def write(self, cbuf, offset, len):
s = String(cbuf, offset, len)
self.terminal.append(s)
###
# JFrame subclass for the main application window
class MagicDrawJythonTerminal(JFrame):
inputField = JTextField()
scrollPane = JScrollPane()
terminalArea = JTextArea()
interpreter = PythonInterpreter()
terminalOut = TerminalOutputStream(terminalArea)
printStream = PrintStream(terminalOut, True)
# use these if you want writer based output instead of the outputstream
# terminalOut = TerminalWriter(terminalArea)
# printWriter = PrintWriter(terminalOut, True)
def __init__(self):
JFrame.__init__(self, 'MagicDraw Jython Console')
# grab the current out and err so we can set them back later (for the main java
# System.out/err, not the PythonInterpreter
self.__outOriginal = System.out
self.__errOriginal = System.err
# use the printStream as it updates the textarea
System.setOut(self.printStream)
System.setErr(self.printStream)
self.CreateComponents()
self.setVisible(True)
self.requestFocus()
self.inputField.requestFocus()
def __del__(self):
System.setOut(self.__outOriginal)
System.setErr(self.__errOriginal)
print 'Goodbye'
# this is called when enter is pressed in the input textfield
def CommandEntered(self, event):
if event.source.text == 'exit':
# let's kill the frame
System.setOut(self.__outOriginal)
System.setErr(self.__errOriginal)
self.dispose()
else:
# echo the input to the text area using the printstream
s = 'in : ' + event.source.text
self.printStream.println(s)
# try the embedded interp (the getLocals was just to see if I could interact with it)
# it's not returning anything
a = self.interpreter.getLocals()
self.printWriter.println(a)
self.interpreter.exec(event.source.txt)
# try the main interp (the getLocals was just to see if I could interact with it)
# it's not returning anything
a = getLocals()
self.printWriter.println(a)
exec(event.source.txt)
# set the input text blank and give it focus back. we don't get here if we try to use
# the interpreter, though we do when we don't try to interact with the interpreter
self.inputField.setText('')
self.inputField.requestFocus()
def CreateComponents(self):
# use these if you want the writer based output
# self.interpreter.setOut(self.printWriter)
# self.interpreter.setErr(self.printWriter)
self.interpreter.setOut(self.printStream)
self.interpreter.setErr(self.printStream)
self.inputField.actionPerformed=self.CommandEntered
self.inputField.setBackground(Color.BLACK)
self.inputField.setForeground(Color.GREEN)
self.terminalArea.setBackground(Color.BLACK)
self.terminalArea.setForeground(Color.GREEN)
self.terminalArea.setEditable(False)
self.terminalArea.setPreferredSize(Dimension(800, 600))
self.setLayout(BorderLayout())
self.scrollPane.getViewport().add(self.terminalArea)
self.add(self.scrollPane)
self.add(self.inputField, BorderLayout.SOUTH)
self.setPreferredSize(self.getPreferredSize())
self.pack()
# Main script
#PythonInterpreter.initialize(System.getProperties(), None, None)
#project = Application.getInstance().getProject()
t = MagicDrawJythonTerminal()