GnuCash 2.4.99
Public Member Functions | Data Fields
pycons::console::Console Class Reference

Public Member Functions

def __init__
def history_init
def history_save
def history_add
def history_reset
def history_next
def history_prev
def raw_input
def grab_focus
def write
def overwrite
def last_line
def prompt
def key_press_event
def execute
def quit

Data Fields

 do_quit
 view
 buffer
 color_pat
 killbuffer
 argv
 cout
 shell
 interrupt
 input_mode
 input
 stdout
 stderr
 stdin
 fifoname
 piperead
 pipewrite
 history_file
 history_size
 history_index

Detailed Description

GTK python console 

Definition at line 122 of file console.py.


Constructor & Destructor Documentation

def pycons::console::Console::__init__ (   self,
  argv = [],
  shelltype = 'python',
  banner = [],
  filename = None,
  size = 100 
)
Console interface building + initialization

Definition at line 125 of file console.py.

00127                                          :
00128 
00129         """ Console interface building + initialization"""
00130 
00131         # GTK interface
00132         self.do_quit = False
00133         gtk.ScrolledWindow.__init__(self)
00134         self.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
00135         self.set_shadow_type (gtk.SHADOW_NONE)
00136         self.set_border_width(0)
00137         self.view = gtk.TextView()
00138         self.view.modify_font (pango.FontDescription("Mono 10"))
00139         self.view.set_editable (True)
00140         self.view.set_wrap_mode(True)
00141         self.view.set_left_margin(0)
00142         self.view.set_right_margin(0)
00143         self.buffer = self.view.get_buffer()
00144         self.buffer.create_tag ('title',
00145                                 indent = 2,
00146                                 weight=pango.WEIGHT_BOLD,
00147                                 foreground='blue',
00148                                 font='Mono 12')
00149         self.buffer.create_tag ('subtitle',
00150                                 indent = 2,
00151                                 foreground='blue',
00152                                 font='Mono 8')
00153         self.buffer.create_tag ('output',
00154                                 foreground = 'blue',
00155                                 font='Mono 10')
00156         self.buffer.create_tag ('error',
00157                                 foreground='red',
00158                                 style=pango.STYLE_OBLIQUE,
00159                                 font='Mono 10')
00160         self.buffer.create_tag ('prompt',
00161                                 foreground='blue',
00162                                 weight=pango.WEIGHT_BOLD,
00163                                 font='Mono 10')
00164         self.buffer.create_tag('0')
00165         self.color_pat = re.compile('\x01?\x1b\[(.*?)m\x02?')
00166         for code in ansi_colors:
00167             self.buffer.create_tag(code,
00168                                    foreground=ansi_colors[code],
00169                                    weight=700)
00170         for text, style in banner:
00171             self.write (text, style)
00172         iter = self.buffer.get_iter_at_mark(self.buffer.get_insert())
00173         self.buffer.create_mark ('linestart', iter, True)
00174         self.view.add_events(gtk.gdk.KEY_PRESS_MASK)
00175         self.view.connect ('key-press-event', self.key_press_event)
00176         self.add(self.view)
00177         self.show_all()
00178         self.killbuffer = None
00179 
00180         # Console stuff
00181         self.argv = argv
00182         self.history_init(filename, size)
00183         self.cout = StringIO()
00184         self.cout.truncate(0)
00185         if shelltype=='ipython':
00186             self.shell = ishell.Shell(argv,locals(),globals(),
00187                                 cout=self.cout, cerr=self.cout,
00188                                 input_func=self.raw_input)
00189         else:
00190             self.shell = shell.Shell(locals(),globals())
00191         self.interrupt = False
00192         self.input_mode = False
00193         self.input = None
00194         self.stdout = ConsoleOut (self, sys.stdout.fileno(), 'output')
00195         self.stderr = ConsoleOut (self, sys.stderr.fileno(), 'error')
00196         self.stdin  = ConsoleIn  (self, sys.stdin.fileno())
00197 
00198         # Create a named pipe for system stdout/stderr redirection
00199         self.fifoname = tempfile.mktemp()
00200         if not os.path.exists (self.fifoname):
00201             os.mkfifo (self.fifoname)
00202         self.piperead  = os.open (self.fifoname, os.O_RDONLY | os.O_NONBLOCK)
00203         self.pipewrite = os.open (self.fifoname, os.O_WRONLY | os.O_NONBLOCK)
00204         self.shell.eval(self)
00205         self.cout.truncate(0)


Member Function Documentation

def pycons::console::Console::grab_focus (   self)
Give focus to the TextView 

Definition at line 246 of file console.py.

00247                          :
00248         """ Give focus to the TextView """
00249 
00250         self.view.grab_focus()

def pycons::console::Console::key_press_event (   self,
  widget,
  event 
)
Handle key press event 

Definition at line 300 of file console.py.

00301                                              :
00302         """ Handle key press event """
00303 
00304         keyname = gtk.gdk.keyval_name (event.keyval)
00305 
00306         # New command
00307         if keyname in ['Return', 'KP_Enter']:
00308             line = self.last_line()
00309             self.history_add (line)
00310             if self.input_mode:
00311                 self.input_mode = False
00312                 self.input = self.last_line()
00313                 self.write('\n')
00314             else:
00315                 self.execute()
00316             return True
00317 
00318         # Prevent cursor to go back past prompt
00319         elif keyname in ['Left', 'BackSpace']:
00320             mark = self.buffer.get_mark('linestart')
00321             linestart = self.buffer.get_iter_at_mark(mark)
00322             iter = self.buffer.get_iter_at_mark(self.buffer.get_insert())
00323             if iter.compare(linestart) <= 0:
00324                 return True
00325 
00326         elif keyname == 'Right':
00327             return False
00328         
00329         # Next history item
00330         elif keyname == 'Down':
00331             self.overwrite (self.history_next())
00332             return True
00333 
00334         # Previous history item
00335         elif keyname == 'Up':
00336             self.overwrite (self.history_prev())
00337             return True
00338 
00339         # Move cursor just after prompt
00340         elif keyname == 'Home':
00341             mark = self.buffer.get_mark('linestart')
00342             linestart = self.buffer.get_iter_at_mark(mark)
00343             self.buffer.place_cursor (linestart)
00344             return True
00345 
00346         # Completion if line not empty
00347         elif keyname == 'Tab':
00348             line = self.last_line()
00349             if not line.strip():
00350                 return False
00351             completed, possibilities = self.shell.complete(line)
00352             if len(possibilities) > 1:
00353                 slice = line
00354                 self.write('\n')
00355                 for symbol in possibilities:
00356                     self.write(symbol+'\n')
00357                 self.prompt('prompt')
00358             self.overwrite(completed or slice)
00359             return True
00360 
00361         # Controls
00362         elif event.state & gtk.gdk.CONTROL_MASK:
00363             if keyname in ['a','A']:
00364                 mark = self.buffer.get_mark('linestart')
00365                 linestart = self.buffer.get_iter_at_mark(mark)
00366                 self.buffer.place_cursor (linestart)
00367                 return True
00368             elif keyname in ['e','E']:
00369                 end = self.buffer.get_end_iter()
00370                 self.buffer.place_cursor (end)
00371                 return True
00372             elif keyname in ['k','K']:
00373                 start = self.buffer.get_iter_at_mark (self.buffer.get_insert())
00374                 end = self.buffer.get_end_iter()
00375                 self.killbuffer = self.buffer.get_text(start,end)
00376                 self.buffer.delete(start,end)
00377                 return True
00378             elif keyname in ['y','Y']:
00379                 if self.killbuffer:
00380                     iter = self.buffer.get_iter_at_mark (self.buffer.get_insert())
00381                     self.buffer.insert(iter, self.killbuffer)
00382                 return True
00383             elif keyname in ['l', 'L']:
00384                 start = self.buffer.get_start_iter()
00385                 end = self.buffer.get_end_iter()
00386                 end.backward_sentence_start()
00387                 self.buffer.delete (start,end)
00388             elif keyname in ['d', 'D']:
00389                 if not len(self.last_line().strip()):
00390                     self.quit()
00391 
00392         # Editing before prompt is forbidden
00393         else:
00394             mark = self.buffer.get_mark('linestart')
00395             linestart = self.buffer.get_iter_at_mark(mark)
00396             iter = self.buffer.get_iter_at_mark(self.buffer.get_insert())
00397             if iter.compare(linestart) < 0:
00398                 iter = self.buffer.get_end_iter()
00399                 self.buffer.place_cursor (iter)
00400         return False
00401 

def pycons::console::Console::last_line (   self)
Get last line (without prompt) 

Definition at line 278 of file console.py.

00279                         :
00280         """ Get last line (without prompt) """
00281         
00282         mark = self.buffer.get_mark('linestart')
00283         start = self.buffer.get_iter_at_mark(mark)
00284         end = self.buffer.get_end_iter()
00285         return self.buffer.get_text (start,end,True)
00286 

def pycons::console::Console::overwrite (   self,
  text,
  style = None 
)
Overwrite text after prompt with text 

Definition at line 269 of file console.py.

00270                                           :
00271         """ Overwrite text after prompt with text """
00272 
00273         mark = self.buffer.get_mark('linestart')
00274         start = self.buffer.get_iter_at_mark(mark)
00275         end = self.buffer.get_end_iter()
00276         self.buffer.delete (start,end)
00277         self.write (text, style)

def pycons::console::Console::prompt (   self,
  style = None 
)
Display prompt 

Definition at line 287 of file console.py.

00288                                  :
00289         """ Display prompt """
00290 
00291         iter = self.buffer.get_end_iter()
00292         self.buffer.place_cursor (iter)
00293         self.write (self.shell.prompt, style)
00294         iter = self.buffer.get_iter_at_mark(self.buffer.get_insert())
00295         self.buffer.move_mark (self.buffer.get_mark('linestart'), iter)
00296         self.history_reset()
00297         self.view.scroll_mark_onscreen(self.buffer.get_insert())
00298         while gtk.events_pending():
00299             gtk.main_iteration()

def pycons::console::Console::quit (   self)
Quit console 

Definition at line 431 of file console.py.

00432                   :
00433         """ Quit console """
00434 
00435         gtk.main_quit()
00436         self.history_save()
00437         try:
00438             os.close (self.piperead)
00439             os.close (self.pipewrite)
00440         except:
00441             pass
00442         if os.path.exists (self.fifoname):
00443             os.remove (self.fifoname)
00444         self.do_quit = True
def pycons::console::Console::write (   self,
  text,
  style = None 
)
Write text using given style (if any) 

Definition at line 251 of file console.py.

00252                                       :
00253         """ Write text using given style (if any) """
00254         segments = self.color_pat.split(text)
00255         segment = segments.pop(0)
00256         start,end = self.buffer.get_bounds()
00257         if style==None:
00258             self.buffer.insert(end, segment)
00259         else:
00260             self.buffer.insert_with_tags_by_name(end, segment, style)
00261         if segments:
00262             ansi_tags = self.color_pat.findall(text)
00263             for tag in ansi_tags:
00264                 i = segments.index(tag)
00265                 self.buffer.insert_with_tags_by_name(self.buffer.get_end_iter(),
00266                                                      segments[i+1], tag)
00267                 segments.pop(i)
00268         self.view.scroll_mark_onscreen(self.buffer.get_insert())


The documentation for this class was generated from the following file:
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Defines