text: import webbrowser
  
  import wx
  
  from gooey.gui.lang.i18n import _
  from .widgets.basictextconsole import BasicTextConsole
  
  
  class Console(wx.Panel):
      '''
      Textbox console/terminal displayed during the client program's execution.
      '''
  
      def __init__(self, parent, buildSpec, **kwargs):
          wx.Panel.__init__(self, parent, **kwargs)
          self.buildSpec = buildSpec
  
          self.text = wx.StaticText(self, label=_("status"))
          if buildSpec["richtext_controls"]:
              from .widgets.richtextconsole import RichTextConsole
              self.textbox = RichTextConsole(self)
          else:
              self.textbox = BasicTextConsole(self)
  
          self.defaultFont = self.textbox.GetFont()
  
          self.textbox.SetFont(wx.Font(
              self.buildSpec['terminal_font_size'] or self.defaultFont.GetPointSize(),
              self.getFontStyle(),
              wx.NORMAL,
              self.buildSpec['terminal_font_weight'] or wx.NORMAL,
              False,
              self.getFontFace(),
          ))
          self.textbox.SetForegroundColour(self.buildSpec['terminal_font_color'])
           
          self.layoutComponent()
          self.Layout()
          self.Bind(wx.EVT_TEXT_URL, self.evtUrl, self.textbox)
  
      def evtUrl(self, event):
          if event.MouseEvent.LeftUp():
              # The rich console provides the embedded URL via GetString()
              # but the basic console does not
              webbrowser.open(
                  event.GetString() or
                  self.textbox.GetRange(event.URLStart,event.URLEnd))
          event.Skip()
  
  
      def getFontStyle(self):
          """
          Force wx.Modern style to support legacy
          monospace_display param when present
          """
          return (wx.MODERN
                  if self.buildSpec['monospace_display']
                  else wx.DEFAULT)
  
  
      def getFontFace(self):
          """Choose the best font face available given the user options"""
          userFace = self.buildSpec['terminal_font_family'] or self.defaultFont.GetFaceName()
          return (''
                  if self.buildSpec['monospace_display']
                  else userFace)
  
  
      def logOutput(self, *args, **kwargs):
          """Event Handler for console updates coming from the client's program"""
          self.appendText(kwargs.get('msg'))
  
  
      def appendText(self, txt):
          """
          Append the text to the main TextCtrl.
  
          Note! Must be called from a Wx specific thread handler to avoid
          multi-threaded explosions (e.g. wx.CallAfter)
          """
          self.textbox.AppendText(txt)
  
      def clear(self):
          """
              Clear the the main TextCtrl.
          """
          self.textbox.Clear()
  
  
      def getText(self):
          return self.textbox.GetValue()
  
      def layoutComponent(self):
          self.SetBackgroundColour(self.buildSpec.get('terminal_bg_color', '#F0F0F0'))
          sizer = wx.BoxSizer(wx.VERTICAL)
          sizer.AddSpacer(10)
          sizer.Add(self.text, 0, wx.LEFT, 20)
          sizer.AddSpacer(10)
          sizer.Add(self.textbox, 1, wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.EXPAND, 20)
          sizer.AddSpacer(20)
          self.SetSizer(sizer)
  
  
  