text: #@+leo-ver=5-thin
  #@+node:ekr.20170428084207.121: * @file ../external/npyscreen/fmActionForm.py
  #!/usr/bin/python
  import leo.core.leoGlobals as g
  assert g
  #@+others
  #@+node:ekr.20170428084207.122: ** Declarations
  import weakref
  from . import fmForm
  from . import wgwidget as widget
  #@+node:ekr.20170428084207.123: ** class ActionForm
  class ActionForm(fmForm.Form):
      """A form with OK and Cancel buttons.  Users should override the on_ok and on_cancel methods."""
      CANCEL_BUTTON_BR_OFFSET = (2, 12)
      OK_BUTTON_TEXT          = "OK"
      CANCEL_BUTTON_TEXT      = "Cancel"
  
      #@+others
      #@+node:ekr.20170428084207.124: *3* set_up_exit_condition_handlers
      def set_up_exit_condition_handlers(self):
          super(ActionForm, self).set_up_exit_condition_handlers()
          self.how_exited_handers.update({
              widget.EXITED_ESCAPE:   self.find_cancel_button
          })
  
      #@+node:ekr.20170428084207.125: *3* ActionForm.find_cancel_button
      def find_cancel_button(self):
          self.editw = len(self._widgets__)-2
  
      #@+node:ekr.20170428084207.126: *3* ActionForm.edit
      def edit(self):
          
          g.trace('===== (ActionForm)')
          # Add ok and cancel buttons. Will remove later
          tmp_rely, tmp_relx = self.nextrely, self.nextrelx
  
          c_button_text = self.CANCEL_BUTTON_TEXT
          cmy, cmx = self.curses_pad.getmaxyx()
          cmy -= self.__class__.CANCEL_BUTTON_BR_OFFSET[0]
          cmx -= len(c_button_text)+self.__class__.CANCEL_BUTTON_BR_OFFSET[1]
          self.c_button = self.add_widget(self.__class__.OKBUTTON_TYPE, name=c_button_text, rely=cmy, relx=cmx, use_max_space=True)
          c_button_postion = len(self._widgets__)-1
          self.c_button.update()
  
          my, mx = self.curses_pad.getmaxyx()
          ok_button_text = self.OK_BUTTON_TEXT
          my -= self.__class__.OK_BUTTON_BR_OFFSET[0]
          mx -= len(ok_button_text)+self.__class__.OK_BUTTON_BR_OFFSET[1]
          self.ok_button = self.add_widget(self.__class__.OKBUTTON_TYPE, name=ok_button_text, rely=my, relx=mx, use_max_space=True)
          ok_button_postion = len(self._widgets__)-1
          # End add buttons
  
          self.editing=True
          if self.editw < 0: self.editw=0
          if self.editw > len(self._widgets__)-1:
              self.editw = len(self._widgets__)-1
          if not self.preserve_selected_widget:
              self.editw = 0
  
  
          if not self._widgets__[self.editw].editable: self.find_next_editable()
          self.ok_button.update()
  
          self.display()
  
          while not self._widgets__[self.editw].editable:
              self.editw += 1
              if self.editw > len(self._widgets__)-2:
                  self.editing = False
                  return False
  
          self.edit_return_value = None
          while self.editing:
              if not self.ALL_SHOWN: self.on_screen()
              try:
                  self.while_editing(weakref.proxy(self._widgets__[self.editw]))
              except TypeError:
                  self.while_editing()
              self._widgets__[self.editw].edit()
              self._widgets__[self.editw].display()
  
              self.handle_exiting_widgets(self._widgets__[self.editw].how_exited)
  
              if self.editw > len(self._widgets__)-1: self.editw = len(self._widgets__)-1
              if self.ok_button.value or self.c_button.value:
                  self.editing = False
  
              if self.ok_button.value:
                  self.ok_button.value = False
                  self.edit_return_value = self.on_ok()
              elif self.c_button.value:
                  self.c_button.value = False
                  self.edit_return_value = self.on_cancel()
  
          self.ok_button.destroy()
          self.c_button.destroy()
          del self._widgets__[ok_button_postion]
          del self.ok_button
          del self._widgets__[c_button_postion]
          del self.c_button
          self.nextrely, self.nextrelx = tmp_rely, tmp_relx
          self.display()
          self.editing = False
  
          return self.edit_return_value
  
      #@+node:ekr.20170428084207.127: *3* on_cancel
      def on_cancel(self):
          pass
  
      #@+node:ekr.20170428084207.128: *3* on_ok
      def on_ok(self):
          pass
  
      #@+node:ekr.20170428084207.129: *3* move_ok_button
      def move_ok_button(self):
          super(ActionForm, self).move_ok_button()
          if hasattr(self, 'c_button'):
              c_button_text = self.CANCEL_BUTTON_TEXT
              cmy, cmx = self.curses_pad.getmaxyx()
              cmy -= self.__class__.CANCEL_BUTTON_BR_OFFSET[0]
              cmx -= len(c_button_text)+self.__class__.CANCEL_BUTTON_BR_OFFSET[1]
              self.c_button.rely = cmy
              self.c_button.relx = cmx
  
  
  
      #@-others
  #@+node:ekr.20170428084207.130: ** class ActionFormExpanded
  class ActionFormExpanded(ActionForm):
      BLANK_LINES_BASE   = 1
      OK_BUTTON_BR_OFFSET = (1,6)
      CANCEL_BUTTON_BR_OFFSET = (1, 12)
  
  
  #@-others
  #@@language python
  #@@tabwidth -4
  #@-leo
  