[GRASS-SVN] r40071 - in grass/branches/develbranch_6/gui/wxpython: . gui_modules

svn_grass at osgeo.org svn_grass at osgeo.org
Sat Dec 19 13:55:42 EST 2009


Author: martinl
Date: 2009-12-19 13:55:41 -0500 (Sat, 19 Dec 2009)
New Revision: 40071

Modified:
   grass/branches/develbranch_6/gui/wxpython/gui_modules/goutput.py
   grass/branches/develbranch_6/gui/wxpython/gui_modules/prompt.py
   grass/branches/develbranch_6/gui/wxpython/wxgui.py
Log:
don't override original GPrompt class (r40068)


Modified: grass/branches/develbranch_6/gui/wxpython/gui_modules/goutput.py
===================================================================
--- grass/branches/develbranch_6/gui/wxpython/gui_modules/goutput.py	2009-12-19 18:38:18 UTC (rev 40070)
+++ grass/branches/develbranch_6/gui/wxpython/gui_modules/goutput.py	2009-12-19 18:55:41 UTC (rev 40071)
@@ -184,7 +184,7 @@
         #
         # command prompt
         #
-        self.cmd_prompt = prompt.GPrompt(self, id=wx.ID_ANY)
+        self.cmd_prompt = prompt.GPromptSTC(self, id=wx.ID_ANY)
 
         #
         # stream redirection
@@ -895,4 +895,4 @@
                 else:
                     txt = _('Unable to encode text. Please set encoding in GUI preferences.') + '\n'
                     
-                self.AddText(txt) 
\ No newline at end of file
+                self.AddText(txt) 

Modified: grass/branches/develbranch_6/gui/wxpython/gui_modules/prompt.py
===================================================================
--- grass/branches/develbranch_6/gui/wxpython/gui_modules/prompt.py	2009-12-19 18:38:18 UTC (rev 40070)
+++ grass/branches/develbranch_6/gui/wxpython/gui_modules/prompt.py	2009-12-19 18:55:41 UTC (rev 40071)
@@ -1,10 +1,13 @@
 """!
 @package prompt.py
 
- at brief GRASS prompt
+ at brief wxGUI prompt
 
 Classes:
- - GPrompt
+ - GPromptPopUp
+ - PromptListCtrl
+ - TextCtrlAutoComplete
+ - GPromptSTC
 
 @todo: reduce size of STC prompt to about 3 lines
 
@@ -23,6 +26,7 @@
 
 import wx
 import wx.stc
+import wx.lib.mixins.listctrl as listmix
 
 from grass.script import core as grass
 
@@ -30,7 +34,639 @@
 import menudata
 import gcmd
 
-class GPrompt(wx.stc.StyledTextCtrl):
+class GPromptPopUp:
+    """!Interactive GRASS prompt"""
+    def __init__(self, parent):
+        self.parent = parent # GMFrame
+        
+        # dictionary of modules (description, keywords, ...)
+        self.modules = self.parent.menudata.GetModules()
+        
+        self.panel, self.input = self.__create()
+        
+    def __create(self):
+        """!Create widget"""
+        cmdprompt = wx.Panel(self.parent)
+        
+        #
+        # search
+        #
+        searchTxt = wx.StaticText(parent = cmdprompt, id = wx.ID_ANY,
+                                  label = _("Find module:"))
+        
+        self.searchBy = wx.Choice(parent = cmdprompt, id = wx.ID_ANY,
+                             choices = [_("description"),
+                                        _("keywords")])
+        winHeight = self.searchBy.GetSize()[1]
+
+        self.search = wx.TextCtrl(parent = cmdprompt, id = wx.ID_ANY,
+                             value = "", size = (-1, 25))
+        
+        label = wx.Button(parent = cmdprompt, id = wx.ID_ANY,
+                          label = _("&Cmd >"), size = (-1, winHeight))
+        label.SetToolTipString(_("Click for erasing command prompt"))
+
+        ### todo: fix TextCtrlAutoComplete to work also on Macs
+        ### reason: missing wx.PopupWindow()
+        try:
+            cmdinput = TextCtrlAutoComplete(parent = cmdprompt, id = wx.ID_ANY,
+                                            value = "",
+                                            style = wx.TE_LINEWRAP | wx.TE_PROCESS_ENTER,
+                                            size = (-1, winHeight),
+                                            statusbar = self.parent.statusbar)
+        except NotImplementedError:
+            # wx.PopupWindow may be not available in wxMac
+            # see http://trac.wxwidgets.org/ticket/9377
+            cmdinput = wx.TextCtrl(parent = cmdprompt, id = wx.ID_ANY,
+                                   value = "",
+                                   style=wx.TE_LINEWRAP | wx.TE_PROCESS_ENTER,
+                                   size = (-1, 25))
+            self.searchBy.Enable(False)
+            self.search.Enable(False)
+        
+        cmdinput.SetFont(wx.Font(10, wx.FONTFAMILY_MODERN, wx.NORMAL, wx.NORMAL, 0, ''))
+        
+        wx.CallAfter(cmdinput.SetInsertionPoint, 0)
+        
+        # bidnings
+        label.Bind(wx.EVT_BUTTON,        self.OnCmdErase)
+        cmdinput.Bind(wx.EVT_TEXT_ENTER, self.OnRunCmd)
+        cmdinput.Bind(wx.EVT_TEXT,       self.OnUpdateStatusBar)
+        self.search.Bind(wx.EVT_TEXT,    self.OnSearchModule)
+        
+        # layout
+        sizer = wx.GridBagSizer(hgap=5, vgap=5)
+        sizer.AddGrowableRow(1)
+        sizer.AddGrowableCol(2)
+
+        sizer.Add(item = searchTxt,
+                  flag = wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL,
+                  pos = (0, 0))
+
+        sizer.Add(item = self.searchBy,
+                  flag = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_CENTER,
+                  pos = (0, 1))
+        
+        sizer.Add(item = self.search,
+                  flag = wx.EXPAND | wx.RIGHT | wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_CENTER,
+                  border = 5,
+                  pos = (0, 2))
+        
+        sizer.Add(item = label, 
+                  flag = wx.LEFT | wx.EXPAND | wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_CENTER,
+                  border = 5,
+                  pos = (1, 0))
+        
+        sizer.Add(item = cmdinput,
+                  flag = wx.EXPAND | wx.RIGHT,
+                  border = 5,
+                  pos = (1, 1), span = (1, 2))
+        
+        cmdprompt.SetSizer(sizer)
+        sizer.Fit(cmdprompt)
+        cmdprompt.Layout()
+        
+        return cmdprompt, cmdinput
+
+    def __checkKey(self, text, keywords):
+        """!Check if text is in keywords"""
+        found = 0
+        keys = text.split(',')
+        if len(keys) > 1: # -> multiple keys
+            for k in keys[:-1]:
+                k = k.strip()
+                for key in keywords: 
+                    if k == key: # full match
+                        found += 1
+                        break
+            k = keys[-1].strip()
+            for key in keywords:
+                if k in key: # partial match
+                    found +=1
+                    break
+        else:
+            for key in keywords:
+                if text in key: # partial match
+                    found +=1
+                    break
+        
+        if found == len(keys):
+            return True
+        
+        return False
+    
+    def GetPanel(self):
+        """!Get main widget panel"""
+        return self.panel
+
+    def GetInput(self):
+        """!Get main prompt widget"""
+        return self.input
+    
+    def OnCmdErase(self, event):
+        """!Erase command prompt"""
+        self.input.SetValue('')
+        
+    def OnRunCmd(self, event):
+        """!Run command"""
+        cmdString = event.GetString()
+        
+        if self.parent.GetName() != "LayerManager":
+            return
+        
+        if cmdString[:2] == 'd.' and not self.parent.curr_page:
+            self.parent.NewDisplay(show=True)
+        
+        cmd = shlex.split(str(cmdString))
+        if len(cmd) > 1:
+            self.parent.goutput.RunCmd(cmd, switchPage = True)
+        else:
+            self.parent.goutput.RunCmd(cmd, switchPage = False)
+        
+        self.OnUpdateStatusBar(None)
+        
+    def OnUpdateStatusBar(self, event):
+        """!Update Layer Manager status bar"""
+        if self.parent.GetName() != "LayerManager":
+            return
+        
+        if event is None:
+            self.parent.statusbar.SetStatusText("")
+        else:
+            self.parent.statusbar.SetStatusText(_("Type GRASS command and run by pressing ENTER"))
+            event.Skip()
+        
+    def OnSearchModule(self, event):
+        """!Search module by metadata"""
+        text = event.GetString()
+        if not text:
+            self.input.SetChoices(globalvar.grassCmd['all'])
+            return
+        
+        modules = []
+        for module, data in self.modules.iteritems():
+            if self.searchBy.GetSelection() == 0: # -> description
+                if text in data['desc']:
+                    modules.append(module)
+            else: # -> keywords
+                if self.__checkKey(text, data['keywords']):
+                    modules.append(module)
+        
+        self.parent.statusbar.SetStatusText(_("%d modules found") % len(modules))
+        self.input.SetChoices(modules)
+                    
+class PromptListCtrl(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin):
+    def __init__(self, parent, id = wx.ID_ANY, pos = wx.DefaultPosition,
+                 size = wx.DefaultSize, style = 0):
+        wx.ListCtrl.__init__(self, parent, id, pos, size, style)
+        listmix.ListCtrlAutoWidthMixin.__init__(self)
+        
+class TextCtrlAutoComplete(wx.ComboBox, listmix.ColumnSorterMixin):
+    def __init__ (self, parent, statusbar,
+                  id = wx.ID_ANY, choices = [], **kwargs):
+        """!Constructor works just like wx.TextCtrl except you can pass in a
+        list of choices.  You can also change the choice list at any time
+        by calling setChoices.
+        
+        Inspired by http://wiki.wxpython.org/TextCtrlAutoComplete
+        """
+        self.statusbar = statusbar
+        
+        if kwargs.has_key('style'):
+            kwargs['style'] = wx.TE_PROCESS_ENTER | kwargs['style']
+        else:
+            kwargs['style'] = wx.TE_PROCESS_ENTER
+        
+        wx.ComboBox.__init__(self, parent, id, **kwargs)
+        
+        # some variables
+        self._choices = choices
+        self._hideOnNoMatch = True
+        self._module = None      # currently selected module
+        self._choiceType = None  # type of choice (module, params, flags, raster, vector ...)
+        self._screenheight = wx.SystemSettings.GetMetric(wx.SYS_SCREEN_Y)
+        self._historyItem = 0   # last item
+        
+        # sort variable needed by listmix
+        self.itemDataMap = dict()
+        
+        # widgets
+        try:
+            self.dropdown = wx.PopupWindow(self)
+        except NotImplementedError:
+            self.Destroy()
+            raise NotImplementedError
+        
+        # create the list and bind the events
+        self.dropdownlistbox = PromptListCtrl(parent = self.dropdown,
+                                              style = wx.LC_REPORT | wx.LC_SINGLE_SEL | \
+                                                  wx.LC_SORT_ASCENDING | wx.LC_NO_HEADER,
+                                              pos = wx.Point(0, 0))
+        
+        listmix.ColumnSorterMixin.__init__(self, 1)
+        
+        # set choices (list of GRASS modules)
+        self._choicesCmd = globalvar.grassCmd['all']
+        self._choicesMap = dict()
+        for type in ('raster', 'vector'):
+            self._choicesMap[type] = grass.list_strings(type = type[:4])
+        # first search for GRASS module
+        self.SetChoices(self._choicesCmd)
+        
+        self.SetMinSize(self.GetSize())
+        # read history
+        self.SetHistoryItems()
+        
+        # bindings...
+        self.Bind(wx.EVT_KILL_FOCUS, self.OnControlChanged)
+        self.Bind(wx.EVT_TEXT, self.OnEnteredText)
+        self.Bind(wx.EVT_KEY_DOWN , self.OnKeyDown)
+        ### self.Bind(wx.EVT_LEFT_DOWN, self.OnClick)
+
+        # if need drop down on left click
+        self.dropdown.Bind(wx.EVT_LISTBOX , self.OnListItemSelected, self.dropdownlistbox)
+        self.dropdownlistbox.Bind(wx.EVT_LEFT_DOWN, self.OnListClick)
+        self.dropdownlistbox.Bind(wx.EVT_LEFT_DCLICK, self.OnListDClick)
+        self.dropdownlistbox.Bind(wx.EVT_LIST_COL_CLICK, self.OnListColClick)
+
+        self.Bind(wx.EVT_COMBOBOX, self.OnCommandSelect)
+        
+    def _updateDataList(self, choices):
+        """!Update data list"""
+        # delete, if need, all the previous data
+        if self.dropdownlistbox.GetColumnCount() != 0:
+            self.dropdownlistbox.DeleteAllColumns()
+            self.dropdownlistbox.DeleteAllItems()
+        # and update the dict
+        if choices:
+            for numVal, data in enumerate(choices):
+                self.itemDataMap[numVal] = data
+        else:
+            numVal = 0
+        self.SetColumnCount(numVal)
+    
+    def _setListSize(self):
+        """!Set list size"""
+        choices = self._choices
+        longest = 0
+        for choice in choices:
+            longest = max(len(choice), longest)
+        longest += 3
+        itemcount = min(len( choices ), 7) + 2
+        charheight = self.dropdownlistbox.GetCharHeight()
+        charwidth = self.dropdownlistbox.GetCharWidth()
+        self.popupsize = wx.Size(charwidth*longest, charheight*itemcount)
+        self.dropdownlistbox.SetSize(self.popupsize)
+        self.dropdown.SetClientSize(self.popupsize)
+
+    def _showDropDown(self, show = True):
+        """!Either display the drop down list (show = True) or hide it
+        (show = False).
+        """
+        if show:
+            size = self.dropdown.GetSize()
+            width, height = self.GetSizeTuple()
+            x, y = self.ClientToScreenXY(0, height)
+            if size.GetWidth() != width:
+                size.SetWidth(width)
+                self.dropdown.SetSize(size)
+                self.dropdownlistbox.SetSize(self.dropdown.GetClientSize())
+            if (y + size.GetHeight()) < self._screenheight:
+                self.dropdown.SetPosition(wx.Point(x, y))
+            else:
+                self.dropdown.SetPosition(wx.Point(x, y - height - size.GetHeight()))
+        
+        self.dropdown.Show(show)
+    
+    def _listItemVisible(self):
+        """!Moves the selected item to the top of the list ensuring it is
+        always visible.
+        """
+        toSel = self.dropdownlistbox.GetFirstSelected()
+        if toSel == -1:
+            return
+        self.dropdownlistbox.EnsureVisible(toSel)
+
+    def _setModule(self, name):
+        """!Set module's choices (flags, parameters)""" 
+        # get module's description
+        if name in self._choicesCmd and not self._module:
+            try:
+                self._module = menuform.GUI().ParseInterface(cmd = [name])
+            except IOError:
+                self._module = None
+             
+        # set choices (flags)
+        self._choicesMap['flag'] = self._module.get_list_flags()
+        for idx in range(len(self._choicesMap['flag'])):
+            item = self._choicesMap['flag'][idx]
+            desc = self._module.get_flag(item)['label']
+            if not desc:
+                desc = self._module.get_flag(item)['description']
+            
+            self._choicesMap['flag'][idx] = '%s (%s)' % (item, desc)
+        
+        # set choices (parameters)
+        self._choicesMap['param'] = self._module.get_list_params()
+        for idx in range(len(self._choicesMap['param'])):
+            item = self._choicesMap['param'][idx]
+            desc = self._module.get_param(item)['label']
+            if not desc:
+                desc = self._module.get_param(item)['description']
+            
+            self._choicesMap['param'][idx] = '%s (%s)' % (item, desc)
+    
+    def _setValueFromSelected(self):
+         """!Sets the wx.TextCtrl value from the selected wx.ListCtrl item.
+         Will do nothing if no item is selected in the wx.ListCtrl.
+         """
+         sel = self.dropdownlistbox.GetFirstSelected()
+         if sel < 0:
+             return
+         
+         if self._colFetch != -1:
+             col = self._colFetch
+         else:
+             col = self._colSearch
+         itemtext = self.dropdownlistbox.GetItem(sel, col).GetText()
+         
+         cmd = shlex.split(str(self.GetValue()))
+         if len(cmd) > 0 and cmd[0] in self._choicesCmd:
+             # -> append text (skip last item)
+             if self._choiceType == 'param':
+                 itemtext = itemtext.split(' ')[0]
+                 self.SetValue(' '.join(cmd) + ' ' + itemtext + '=')
+                 optType = self._module.get_param(itemtext)['prompt']
+                 if optType in ('raster', 'vector'):
+                     # -> raster/vector map
+                     self.SetChoices(self._choicesMap[optType], optType)
+             elif self._choiceType == 'flag':
+                 itemtext = itemtext.split(' ')[0]
+                 if len(itemtext) > 1:
+                     prefix = '--'
+                 else:
+                     prefix = '-'
+                 self.SetValue(' '.join(cmd[:-1]) + ' ' + prefix + itemtext)
+             elif self._choiceType in ('raster', 'vector'):
+                 self.SetValue(' '.join(cmd[:-1]) + ' ' + cmd[-1].split('=', 1)[0] + '=' + itemtext)
+         else:
+             # -> reset text
+             self.SetValue(itemtext + ' ')
+             
+             # define module
+             self._setModule(itemtext)
+             
+             # use parameters as default choices
+             self._choiceType = 'param'
+             self.SetChoices(self._choicesMap['param'], type = 'param')
+         
+         self.SetInsertionPointEnd()
+         
+         self._showDropDown(False)
+         
+    def GetListCtrl(self):
+        """!Method required by listmix.ColumnSorterMixin"""
+        return self.dropdownlistbox
+    
+    def SetHistoryItems(self):
+        """!Read history file and update combobox items"""
+        env = grass.gisenv()
+        try:
+            fileHistory = open(os.path.join(env['GISDBASE'],
+                                            env['LOCATION_NAME'],
+                                            env['MAPSET'],
+                                            '.bash_history'), 'r')
+        except IOError:
+            self.SetItems([])
+            return
+        
+        try:
+            hist = []
+            for line in fileHistory.readlines():
+                hist.append(line.replace('\n', ''))
+            
+            self.SetItems(hist)
+        finally:
+            fileHistory.close()
+            return
+        
+        self.SetItems([])
+        
+    def SetChoices(self, choices, type = 'module'):
+        """!Sets the choices available in the popup wx.ListBox.
+        The items will be sorted case insensitively.
+
+        @param choices list of choices
+        @param type type of choices (module, param, flag, raster, vector)
+        """
+        self._choices = choices
+        self._choiceType = type
+        
+        self.dropdownlistbox.SetWindowStyleFlag(wx.LC_REPORT | wx.LC_SINGLE_SEL |
+                                                wx.LC_SORT_ASCENDING | wx.LC_NO_HEADER)
+        if not isinstance(choices, list):
+            self._choices = [ x for x in choices ]
+        if self._choiceType not in ('raster', 'vector'):
+            # do not sort raster/vector maps
+            utils.ListSortLower(self._choices)
+        
+        self._updateDataList(self._choices)
+        
+        self.dropdownlistbox.InsertColumn(0, "")
+        for num, colVal in enumerate(self._choices):
+            index = self.dropdownlistbox.InsertImageStringItem(sys.maxint, colVal, -1)
+            self.dropdownlistbox.SetStringItem(index, 0, colVal)
+            self.dropdownlistbox.SetItemData(index, num)
+        self._setListSize()
+        
+        # there is only one choice for both search and fetch if setting a single column:
+        self._colSearch = 0
+        self._colFetch = -1
+
+    def OnClick(self, event):
+        """Left mouse button pressed"""
+        sel = self.dropdownlistbox.GetFirstSelected()
+        if not self.dropdown.IsShown():
+            if sel > -1:
+                self.dropdownlistbox.Select(sel)
+            else:
+                self.dropdownlistbox.Select(0)
+            self._listItemVisible()
+            self._showDropDown()
+        else:
+            self.dropdown.Hide()
+        
+    def OnCommandSelect(self, event):
+        """!Command selected from history"""
+        self._historyItem = event.GetSelection() - len(self.GetItems())
+        self.SetFocus()
+        
+    def OnListClick(self, evt):
+        """!Left mouse button pressed"""
+        toSel, flag = self.dropdownlistbox.HitTest( evt.GetPosition() )
+        #no values on poition, return
+        if toSel == -1: return
+        self.dropdownlistbox.Select(toSel)
+
+    def OnListDClick(self, evt):
+        """!Mouse button double click"""
+        self._setValueFromSelected()
+
+    def OnListColClick(self, evt):
+        """!Left mouse button pressed on column"""
+        col = evt.GetColumn()
+        # reverse the sort
+        if col == self._colSearch:
+            self._ascending = not self._ascending
+        self.SortListItems( evt.GetColumn(), ascending=self._ascending )
+        self._colSearch = evt.GetColumn()
+        evt.Skip()
+
+    def OnListItemSelected(self, event):
+        """!Item selected"""
+        self._setValueFromSelected()
+        event.Skip()
+
+    def OnEnteredText(self, event):
+        """!Text entered"""
+        text = event.GetString()
+        
+        if not text:
+            # control is empty; hide dropdown if shown:
+            if self.dropdown.IsShown():
+                self._showDropDown(False)
+            event.Skip()
+            return
+        
+        try:
+            cmd = shlex.split(str(text))
+        except ValueError, e:
+            self.statusbar.SetStatusText(str(e))
+            cmd = text.split(' ')
+        pattern = str(text)
+        
+        if len(cmd) > 0 and cmd[0] in self._choicesCmd and not self._module:
+            self._setModule(cmd[0])
+        elif len(cmd) > 1 and cmd[0] in self._choicesCmd:
+            if self._module:
+                if len(cmd[-1].split('=', 1)) == 1:
+                    # new option
+                    if cmd[-1][0] == '-':
+                        # -> flags
+                        self.SetChoices(self._choicesMap['flag'], type = 'flag')
+                        pattern = cmd[-1].lstrip('-')
+                    else:
+                        # -> options
+                        self.SetChoices(self._choicesMap['param'], type = 'param')
+                        pattern = cmd[-1]
+                else:
+                    # value
+                    pattern = cmd[-1].split('=', 1)[1]
+        else:
+            # search for GRASS modules
+            if self._module:
+                # -> switch back to GRASS modules list
+                self.SetChoices(self._choicesCmd)
+                self._module = None
+                self._choiceType = None
+        
+        self._choiceType
+        self._choicesMap
+        found = False
+        choices = self._choices
+        for numCh, choice in enumerate(choices):
+            if choice.lower().startswith(pattern):
+                found = True
+            if found:
+                self._showDropDown(True)
+                item = self.dropdownlistbox.GetItem(numCh)
+                toSel = item.GetId()
+                self.dropdownlistbox.Select(toSel)
+                break
+        
+        if not found:
+            self.dropdownlistbox.Select(self.dropdownlistbox.GetFirstSelected(), False)
+            if self._hideOnNoMatch:
+                self._showDropDown(False)
+                if self._module and '=' not in cmd[-1]:
+                    message = ''
+                    if cmd[-1][0] == '-': # flag
+                        message = _("Warning: flag <%s> not found in '%s'") % \
+                            (cmd[-1][1:], self._module.name)
+                    else: # option
+                        message = _("Warning: option <%s> not found in '%s'") % \
+                            (cmd[-1], self._module.name)
+                    self.statusbar.SetStatusText(message)
+        
+        if self._module and len(cmd[-1]) == 2 and cmd[-1][-2] == '=':
+            optType = self._module.get_param(cmd[-1][:-2])['prompt']
+            if optType in ('raster', 'vector'):
+                # -> raster/vector map
+                self.SetChoices(self._choicesMap[optType], optType)
+        
+        self._listItemVisible()
+        
+        event.Skip()
+        
+    def OnKeyDown (self, event):
+        """!Do some work when the user press on the keys: up and down:
+        move the cursor left and right: move the search
+        """
+        skip = True
+        sel = self.dropdownlistbox.GetFirstSelected()
+        visible = self.dropdown.IsShown()
+        KC = event.GetKeyCode()
+        
+        if KC == wx.WXK_RIGHT:
+            # right -> show choices
+            if sel < (self.dropdownlistbox.GetItemCount() - 1):
+                self.dropdownlistbox.Select(sel + 1)
+                self._listItemVisible()
+            self._showDropDown()
+            skip = False
+        elif KC == wx.WXK_UP:
+            if visible:
+                if sel > 0:
+                    self.dropdownlistbox.Select(sel - 1)
+                    self._listItemVisible()
+                self._showDropDown()
+                skip = False
+            else:
+                self._historyItem -= 1
+                try:
+                    self.SetValue(self.GetItems()[self._historyItem])
+                except IndexError:
+                    self._historyItem += 1
+        elif KC == wx.WXK_DOWN:
+            if visible:
+                if sel < (self.dropdownlistbox.GetItemCount() - 1):
+                    self.dropdownlistbox.Select(sel + 1)
+                    self._listItemVisible()
+                self._showDropDown()
+                skip = False
+            else:
+                if self._historyItem < -1:
+                    self._historyItem += 1
+                    self.SetValue(self.GetItems()[self._historyItem])
+        
+        if visible:
+            if event.GetKeyCode() == wx.WXK_RETURN:
+                self._setValueFromSelected()
+                skip = False
+            if event.GetKeyCode() == wx.WXK_ESCAPE:
+                self._showDropDown(False)
+                skip = False
+        if skip:
+            event.Skip()
+        
+    def OnControlChanged(self, event):
+        """!Control changed"""
+        if self.IsShown():
+            self._showDropDown(False)
+        
+        event.Skip()
+
+class GPromptSTC(wx.stc.StyledTextCtrl):
     """!Styled GRASS prompt with autocomplete and calltips"""    
     def __init__(self, parent, id, size=wx.DefaultSize, margin=False, wrap=None):
         wx.stc.StyledTextCtrl.__init__(self, parent, id)
@@ -464,4 +1100,4 @@
             self.parent.statusbar.SetStatusText("")
         else:
             self.parent.statusbar.SetStatusText(_("Type GRASS command and run by pressing ENTER"))
-            event.Skip()
\ No newline at end of file
+            event.Skip()

Modified: grass/branches/develbranch_6/gui/wxpython/wxgui.py
===================================================================
--- grass/branches/develbranch_6/gui/wxpython/wxgui.py	2009-12-19 18:38:18 UTC (rev 40070)
+++ grass/branches/develbranch_6/gui/wxpython/wxgui.py	2009-12-19 18:55:41 UTC (rev 40071)
@@ -264,7 +264,7 @@
 
         # create command output text area and add it to main notebook page
         self.goutput = goutput.GMConsole(self, pageid=1)
-        self.outpage = self.notebook.AddPage(self.goutput, text=_("Command output"))
+        self.outpage = self.notebook.AddPage(self.goutput, text=_("Command console"))
 
         # bindings
         self.gm_cb.Bind(FN.EVT_FLATNOTEBOOK_PAGE_CHANGED, self.OnCBPageChanged)



More information about the grass-commit mailing list