source: coopr.gui.coopr/trunk/coopr/gui/coopr/JySwing.py @ 2135

Last change on this file since 2135 was 2135, checked in by wehart, 10 years ago

Adding Jython GUI components.

  • Property svn:executable set to *
File size: 9.8 KB
Line 
1from pawt import swing, awt, colors, GridBag
2RIGHT = swing.JLabel.RIGHT
3APPROVE_OPTION = swing.JFileChooser.APPROVE_OPTION
4import java.io
5import pickle, os
6from Console import Console
7
8default_setup = """from math import *
9def squarewave(x,order):
10    total = 0.0
11    for i in range(1, order*2+1, 2):
12        total = total + sin(x*i/10.0)/(float(i))
13    return total
14"""
15default_expression = "squarewave(x, order=3)"
16
17class Chart(awt.Canvas):
18    color = colors.darkturquoise
19    style = 'Filled'
20
21    def getPreferredSize(self):
22        return awt.Dimension(600,300)
23
24    def paint(self, graphics):
25        clip = self.bounds
26        graphics.color = colors.white
27        graphics.fillRect(0, 0, clip.width, clip.height)
28
29        width = int(clip.width * .8)
30        height = int(clip.height * .8)
31        x_offset = int(clip.width * .1)
32        y_offset = clip.height - int(clip.height * .1)
33
34        N = len(self.data); xs = [0]*N; ys = [0]*N
35
36        xmin, xmax = 0, N-1
37        ymax = max(self.data)
38        ymin = min(self.data)
39
40        zero_y = y_offset - int(-ymin/(ymax-ymin)*height)
41        zero_x = x_offset + int(-xmin/(xmax-xmin)*width)
42
43        for i in range(N):
44            xs[i] = int(float(i)*width/N) + x_offset
45            ys[i] = y_offset - int((self.data[i]-ymin)/(ymax-ymin)*height)
46        graphics.color = self.color
47        if self.style == "Line":
48            graphics.drawPolyline(xs, ys, len(xs))
49        else:
50            xs.insert(0, xs[0]); ys.insert(0, zero_y)
51            xs.append(xs[-1]); ys.append(zero_y)
52            graphics.fillPolygon(xs, ys, len(xs))
53
54        # draw axes
55        graphics.color = colors.black
56        graphics.drawLine(x_offset,zero_y, x_offset+width, zero_y)
57        graphics.drawLine(zero_x, y_offset, zero_x, y_offset-height)
58
59        # draw labels
60        leading = graphics.font.size
61        graphics.drawString("%.3f" % xmin, x_offset, zero_y+leading)
62        graphics.drawString("%.3f" % xmax, x_offset+width, zero_y+leading)
63        graphics.drawString("%.3f" % ymin, zero_x-50, y_offset)
64        graphics.drawString("%.3f" % ymax, zero_x-50, y_offset-height+leading)
65
66class GUI:
67
68    def __init__(self):
69        self.frame = swing.JFrame(windowClosing=self._fileQuit)
70        self.frame.JMenuBar = self.create_menubar()
71
72        bag = GridBag(self.frame.contentPane, \
73                        fill='BOTH', weightx=1.0)
74
75        # do the rest of the layout in a GridBag
76        #self.do_layout(bag)
77        c = Console()
78        pane = swing.JScrollPane(c.textpane,\
79                    verticalScrollBarPolicy=swing.JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
80                    size=(1000,10000))
81        #pane.minimizeSizeSet(10,10)
82        bag.addRow(pane, weighty=1.0)
83        bag.addRow(swing.JLabel("Pyomo version VERSION (DATE)"))
84
85        # Create a file chooser
86        self.chooser = swing.JFileChooser()
87        self.chooser.currentDirectory = java.io.File(os.getcwd())
88        # Start Console
89        c.write(Console.header, 'output')
90        c.capturePythonOutput()
91        c.textpane.requestFocus()
92        c.newInput()
93        # Finish up and set the size
94        self.frame.pack()
95        self.frame.visible = 1
96        self.frame.size = self.frame.getPreferredSize()
97
98    def create_menubar(self):
99        """build menu bar"""
100        menubar = swing.JMenuBar()
101        #
102        file = swing.JMenu("File")
103        file.add(swing.JMenuItem("Load...", actionPerformed = self._fileLoad))
104        file.add(swing.JMenuItem("Save...", actionPerformed = self._fileSave))
105        file.add(swing.JMenuItem("Save to file...", actionPerformed = self._fileSaveToFile))
106        file.add(swing.JMenuItem("Quit", actionPerformed = self._fileQuit))
107        menubar.add(file)
108        #
109        file = swing.JMenu("Edit")
110        file.add(swing.JMenuItem("Copy", actionPerformed = self._editCopy))
111        file.add(swing.JMenuItem("Paste", actionPerformed = self._editPaste))
112        file.add(swing.JMenuItem("Quit", actionPerformed = self._editSelectAll))
113        file.add(swing.JMenuItem("Clear console", actionPerformed = self._editClearConsole))
114        menubar.add(file)
115        #
116        file = swing.JMenu("Packages")
117        file.add(swing.JMenuItem("Versions", actionPerformed = self._packagesVersions))
118        file.add(swing.JMenuItem("Install...", actionPerformed = self._packagesInstall))
119        file.add(swing.JMenuItem("Update...", actionPerformed = self._packagesUpdate))
120        menubar.add(file)
121        #
122        file = swing.JMenu("Help")
123        file.add(swing.JMenuItem("Console", actionPerformed = self._helpConsole))
124        file.add(swing.JMenuItem("COIN-OR wiki", actionPerformed = self._helpCoinWiki))
125        file.add(swing.JMenuItem("Coopr wiki", actionPerformed = self._helpCooprWiki))
126        file.add(swing.JMenuItem("About", actionPerformed = self._helpAbout))
127        menubar.add(file)
128        return menubar
129
130    def do_layout(self, bag):
131        self.numelements = 100
132        # create widgets
133        self.chart = Chart(visible=1)
134        self.execentry = swing.JTextArea(default_setup, 8, 60)
135        self.evalentry = swing.JTextField(default_expression,
136                                          actionPerformed = self.update)
137        # create options panel
138        optionsPanel = swing.JPanel(awt.FlowLayout(
139            alignment=awt.FlowLayout.LEFT))
140
141        # whether the plot is a line graph or a filled graph
142        self.filled = swing.JRadioButton("Filled",
143                                         actionPerformed=self.set_filled)
144        optionsPanel.add(self.filled)
145        self.line = swing.JRadioButton("Line",
146                                       actionPerformed=self.set_line)
147        optionsPanel.add(self.line)
148        styleGroup = swing.ButtonGroup()
149        styleGroup.add(self.filled)
150        styleGroup.add(self.line)
151
152        # color selection
153        optionsPanel.add(swing.JLabel("Color:", RIGHT))
154        colorlist = filter(lambda x: x[0] != '_', dir(colors))
155        self.colorname = swing.JComboBox(colorlist)
156        self.colorname.itemStateChanged = self.set_color
157        optionsPanel.add(self.colorname)
158
159        # number of points
160        optionsPanel.add(swing.JLabel("Number of Points:", RIGHT))
161        self.sizes = [50, 100, 200, 500]
162        self.numpoints = swing.JComboBox(self.sizes)
163        self.numpoints.selectedIndex = self.sizes.index(self.numelements)
164        self.numpoints.itemStateChanged = self.set_numpoints
165        optionsPanel.add(self.numpoints)
166
167        bag.add(swing.JLabel("Setup Code: ", RIGHT))
168        bag.addRow(swing.JScrollPane(self.execentry), weighty=10.0)
169        bag.add(swing.JLabel("Expression: ", RIGHT))
170        bag.addRow(self.evalentry, weighty=2.0)
171        bag.add(swing.JLabel("Output: ", RIGHT))
172        bag.addRow(self.chart, weighty=20.0)
173        bag.add(swing.JLabel("Options: ", RIGHT))
174        bag.addRow(optionsPanel, weighty=2.0)
175
176        self.update(None)
177
178    def set_color(self, event):
179        self.chart.color = getattr(colors, event.item)
180        self.chart.repaint()
181
182    def set_numpoints(self, event):
183        self.numelements = event.item
184        self.update(None)
185
186    def set_filled(self, event):
187        self.chart.style = 'Filled'
188        self.chart.repaint()
189
190    def set_line(self, event):
191        self.chart.style = 'Line'
192        self.chart.repaint()
193
194    def update(self, event):
195        context = {}
196        exec self.execentry.text in context
197        each = compile(self.evalentry.text, '<input>', 'eval')
198        numbers = [0]*self.numelements
199        for x in xrange(self.numelements):
200            context['x'] = float(x)
201            numbers[x] = eval(each, context)
202        self.chart.data = numbers
203        if self.chart.style == 'Line':
204            self.line.setSelected(1)
205        else:
206            self.filled.setSelected(1)
207        self.chart.repaint()
208
209    def _fileLoad(self, event=None):
210        self.chooser.rescanCurrentDirectory()
211        returnVal = self.chooser.showOpenDialog(self.frame)
212        if returnVal == APPROVE_OPTION:
213            file = open(os.path.join(self.chooser.currentDirectory.path,
214                     self.chooser.selectedFile.name))
215            (setup, each, style, color,
216             colorname, self.numelements) = pickle.load(file)
217            file.close()
218            self.chart.color = java.awt.Color(color)
219            self.colorname.selectedIndex = colorname
220            self.chart.style = style
221            self.execentry.text = setup
222            self.numpoints.selectedIndex = self.sizes.index(self.numelements)
223            self.evalentry.text = each
224            self.update(None)
225
226    def _fileSave(self, event=None):
227        self.chooser.rescanCurrentDirectory()
228        returnVal = self.chooser.showSaveDialog(self.frame)
229        if returnVal == APPROVE_OPTION:
230            object = (self.execentry.text,  self.evalentry.text,
231                      self.chart.style,
232                      self.chart.color.RGB,
233                      self.colorname.selectedIndex,
234                      self.numelements)
235            file = open(os.path.join(self.chooser.currentDirectory.path,
236                        self.chooser.selectedFile.name), 'w')
237            pickle.dump(object, file)
238            file.close()
239
240    def _fileSaveToFile(selfself, event=None):
241        pass
242
243    def _fileQuit(self, event=None):
244        import sys
245        sys.exit(0)
246
247    def _editCopy(selfself, event=None):
248        pass
249
250    def _editPaste(selfself, event=None):
251        pass
252
253    def _editSelectAll(selfself, event=None):
254        pass
255
256    def _editClearConsole(selfself, event=None):
257        pass
258
259    def _helpConsole(selfself, event=None):
260        pass
261
262    def _helpCoinWiki(selfself, event=None):
263        pass
264
265    def _helpCooprWiki(selfself, event=None):
266        pass
267
268    def _helpAbout(selfself, event=None):
269        pass
270
271    def _packagesVersions(selfself, event=None):
272        pass
273
274    def _packagesInstall(selfself, event=None):
275        pass
276
277    def _packagesUpdate(selfself, event=None):
278        pass
279
Note: See TracBrowser for help on using the repository browser.