source: coopr.gui.pyomo/trunk/coopr/gui/pyomo/GUI.py @ 2141

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

Adding some notes from Dave.
Drafting a preliminary GUI that supports tabbing for different
command-line executions.

  • Property svn:executable set to *
File size: 8.5 KB
Line 
1from pawt import swing
2from java.awt import GridBagLayout, GridBagConstraints, FlowLayout
3from pawt import GridBag
4#RIGHT = swing.JLabel.RIGHT
5APPROVE_OPTION = swing.JFileChooser.APPROVE_OPTION
6import java.io
7import pickle
8import os
9
10class Container(dict):
11    """
12    A generalization of Bunch.  This class allows all other attributes to have a
13    default value of None.  This borrows the output formatting ideas from the
14    ActiveState Code Container (recipe 496697).
15    """
16
17    def __init__(self, *args, **kw):
18        for arg in args:
19            for item in quote_split('[ \t]+',arg):
20                r = item.find('=')
21                if r != -1:
22                    try:
23                        val = eval(item[r+1:])
24                    except:
25                        val = item[r+1:]
26                    kw[item[:r]] = val
27        dict.__init__(self,kw)
28        self.__dict__.update(kw)
29        if not '_name_' in kw:
30            self._name_ = self.__class__.__name__
31
32    def set_name(self, name):
33        self._name_ = name
34
35    def __setitem__(self, name, val):
36        self.__setattr__(name,val)
37
38    def __getitem__(self, name):
39        return self.__getattr__(name)
40
41    def __setattr__(self, name, val):
42        if name[0] != '_':
43            dict.__setitem__(self, name, val)
44        self.__dict__[name] = val
45
46    def __getattr__(self, name):
47        try:
48            return dict.__getitem__(self, name)
49        except:
50            if name[0] == '_':
51                raise AttributeError, "Unknown attribute %s" % name
52        return None
53
54    def __repr__(self):
55        attrs = sorted("%s = %r" % (k, v) for k, v in self.__dict__.iteritems() if not k.startswith("_"))
56        return "%s(%s)" % (self.__class__.__name__, ", ".join(attrs))
57
58    def __str__(self):
59        return self.as_string()
60
61    def __str__(self, nesting = 1, indent='', print_name=True):
62        attrs = []
63        if not print_name:
64            nesting -= 1
65        indentation = indent+"    " * nesting
66        for k, v in self.__dict__.iteritems():
67            if not k.startswith("_"):
68                text = [indentation, k, " = "]
69                if isinstance(v, Container):
70                    text.append(v.__str__(nesting + 1))
71                else:
72                    text.append(repr(v))
73                attrs.append("".join(text))
74        attrs.sort()
75        if print_name:
76            attrs.insert(0, indent+self._name_ + ":")
77        return "\n".join(attrs)
78
79
80
81class GUI:
82
83    def __init__(self):
84        self.tab_id=0
85        self.tab_info = {}
86        self.frame = swing.JFrame("Pyomo Command Driver", windowClosing=self._fileQuit)
87        self.frame.JMenuBar = self.create_menubar()
88
89        self.bag = GridBag(self.frame.contentPane, \
90                        fill='BOTH', weightx=1.0)
91
92        # do the rest of the layout in a GridBag
93        #self.do_layout(self.bag)
94        self.tabbed = swing.JTabbedPane()
95        self.create_tab()
96        self.bag.addRow(self.tabbed, weighty=1.0)
97        self.bag.addRow(swing.JLabel("Pyomo version VERSION (DATE)"))
98
99        # Create a file chooser
100        self.chooser = swing.JFileChooser()
101        self.chooser.currentDirectory = java.io.File(os.getcwd())
102        # Finish up and set the size
103        self.frame.pack()
104        self.frame.visible = 1
105        self.frame.size = self.frame.getPreferredSize()
106
107    def create_tab(self):
108        self.tab_id += 1
109        tab = Container()
110        self.tab_info[self.tab_id] = tab
111        #
112        # Setting up the panel for the tab
113        #
114        panel = swing.JPanel()
115        bag = GridBag(panel, fill='BOTH', weightx=1.0)
116        self.tabbed.add(panel, 'Tab %d' % self.tab_id)
117        #
118        # Creating a text area for the command that will be executed
119        #
120        tab.input = swing.JTextArea("", 6, 80)
121        bag.addRow(tab.input)
122        tab.input.append("COMMAND %d" % self.tab_id)
123        #
124        # create panel for buttons that manage command execution/output
125        #
126        buttons = swing.JPanel(FlowLayout(alignment=FlowLayout.LEFT))
127        tab.buttonExecute = swing.JButton("Execute", actionPerformed=self._buttonExecute)
128        buttons.add(tab.buttonExecute)
129        tab.buttonClearOutput = swing.JButton("Clear Output", actionPerformed=self._buttonClearOutput)
130        buttons.add(tab.buttonClearOutput)
131        bag.addRow(buttons)
132        #
133        tab.output = swing.JTextArea("",6,80)
134        pane = swing.JScrollPane(tab.output,\
135                    verticalScrollBarPolicy=swing.JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
136                    size=(1000,10000))
137        bag.addRow(pane, weighty=1.0)
138        tab.output.append("DRAFT GUI for PYOMO COMMAND DRIVER\n\n")
139
140    def create_menubar(self):
141        """build menu bar"""
142        menubar = swing.JMenuBar()
143        #
144        file = swing.JMenu("File")
145        file.add(swing.JMenuItem("New Command", actionPerformed = self._fileNewCommand))
146        file.add(swing.JMenuItem("Load...", actionPerformed = self._fileLoad))
147        file.add(swing.JMenuItem("Save...", actionPerformed = self._fileSave))
148        file.add(swing.JMenuItem("Save to file...", actionPerformed = self._fileSaveToFile))
149        file.add(swing.JMenuItem("Quit", actionPerformed = self._fileQuit))
150        menubar.add(file)
151        #
152        file = swing.JMenu("Edit")
153        file.add(swing.JMenuItem("Copy", actionPerformed = self._editCopy))
154        file.add(swing.JMenuItem("Paste", actionPerformed = self._editPaste))
155        file.add(swing.JMenuItem("Quit", actionPerformed = self._editSelectAll))
156        menubar.add(file)
157        #
158        ##file = swing.JMenu("Packages")
159        ##file.add(swing.JMenuItem("Versions", actionPerformed = self._packagesVersions))
160        ##file.add(swing.JMenuItem("Install...", actionPerformed = self._packagesInstall))
161        ##file.add(swing.JMenuItem("Update...", actionPerformed = self._packagesUpdate))
162        ##menubar.add(file)
163        #
164        file = swing.JMenu("Help")
165        file.add(swing.JMenuItem("Console", actionPerformed = self._helpConsole))
166        file.add(swing.JMenuItem("COIN-OR wiki", actionPerformed = self._helpCoinWiki))
167        file.add(swing.JMenuItem("Coopr wiki", actionPerformed = self._helpCooprWiki))
168        file.add(swing.JMenuItem("About", actionPerformed = self._helpAbout))
169        menubar.add(file)
170        return menubar
171
172    def _fileNewCommand(self, event=None):
173        self.create_tab()
174
175    def _fileLoad(self, event=None):
176        self.chooser.rescanCurrentDirectory()
177        returnVal = self.chooser.showOpenDialog(self.frame)
178        if returnVal == APPROVE_OPTION:
179            file = open(os.path.join(self.chooser.currentDirectory.path,
180                     self.chooser.selectedFile.name))
181            (setup, each, style, color,
182             colorname, self.numelements) = pickle.load(file)
183            file.close()
184            self.chart.color = java.awt.Color(color)
185            self.colorname.selectedIndex = colorname
186            self.chart.style = style
187            self.execentry.text = setup
188            self.numpoints.selectedIndex = self.sizes.index(self.numelements)
189            self.evalentry.text = each
190            self.update(None)
191
192    def _fileSave(self, event=None):
193        self.chooser.rescanCurrentDirectory()
194        returnVal = self.chooser.showSaveDialog(self.frame)
195        if returnVal == APPROVE_OPTION:
196            object = (self.execentry.text,  self.evalentry.text,
197                      self.chart.style,
198                      self.chart.color.RGB,
199                      self.colorname.selectedIndex,
200                      self.numelements)
201            file = open(os.path.join(self.chooser.currentDirectory.path,
202                        self.chooser.selectedFile.name), 'w')
203            pickle.dump(object, file)
204            file.close()
205
206    def _fileSaveToFile(self, event=None):
207        pass
208
209    def _fileQuit(self, event=None):
210        import sys
211        sys.exit(0)
212
213    def _editCopy(self, event=None):
214        pass
215
216    def _editPaste(self, event=None):
217        pass
218
219    def _editSelectAll(self, event=None):
220        pass
221
222    def _helpConsole(self, event=None):
223        pass
224
225    def _helpCoinWiki(self, event=None):
226        pass
227
228    def _helpCooprWiki(self, event=None):
229        pass
230
231    def _helpAbout(self, event=None):
232        pass
233
234    def _packagesVersions(self, event=None):
235        pass
236
237    def _packagesInstall(self, event=None):
238        pass
239
240    def _packagesUpdate(self, event=None):
241        pass
242
243    def _buttonExecute(self, event=None):
244        pass
245
246    def _buttonClearOutput(self, event=None):
247        pass
248
249
250def run():
251    GUI()
252
253if __name__ == '__main__':
254    run()
Note: See TracBrowser for help on using the repository browser.