
#  $Id: label.icn,v 1.1 2003-05-31 06:09:03 jeffery Exp $

##
#  This class implements a Text label.  The default width and
#  height are determined by dimensions of text
#
class Label : Component(
   label,
   internal_alignment,
   tx,
   tw
   )

   ##
   #  The internal alignment of the label, which should be one of
   #  ``l'', ``c'' or ``r'', for left, centre, or right
   #  alignment respectively.   The default is ``l''.
   #  @param x   The alignment.
   #
   method set_internal_alignment(x)
      return self.internal_alignment := x
   end

   ##
   #  Set the label.
   #  @param x   The label.
   #
   method set_label(x)
      self.label := x
      self$redisplay()
      return x
   end

   method resize()
      if /self.label then
         error("no label specified")

      if \self.draw_border_flag then {
         /self.w_spec := TextWidth(self.cwin, label) + 2 * DEFAULT_TEXT_X_SURROUND
         /self.h_spec := WAttrib(self.cwin, "fheight") + 2 * DEFAULT_TEXT_Y_SURROUND
      } else {
         /self.w_spec := TextWidth(self.cwin, label)
         /self.h_spec := WAttrib(self.cwin, "fheight")
      }
      self$Component.resize()

      if \self.draw_border_flag then {
         self.tx := self.x + DEFAULT_TEXT_X_SURROUND
         self.tw := self.w - 2 *  DEFAULT_TEXT_X_SURROUND
      } else {
         self.tx := self.x
         self.tw := self.w
      }
   end

   method display(buffer_flag)
   local yoff
      EraseRectangle(self.cbwin, self.x, self.y, self.w, self.h)

      yoff := self.y + self.h / 2

      if \self.draw_border_flag then
         DrawSunkenRectangle(self.cbwin, self.x, self.y, self.w, self.h,-2)

      Clip(self.cbwin, self.tx, self.y, self.tw, self.h)

      case self.internal_alignment of {
         "c" : center_string(self.cbwin, self.tx + self.tw / 2, yoff, self.label)
         "l" : left_string(self.cbwin, self.tx, yoff, self.label)
         "r" : right_string(self.cbwin, self.tx + self.tw, yoff, self.label)
         default : error("incorrect internal_alignment specifier")
      }

      Clip(self.cbwin)
      self$do_shading(self.cbwin)

      if /buffer_flag then
         CopyArea(self.cbwin, self.cwin, self.x, self.y, self.w, self.h, self.x, self.y)
   end

   method handle_event(e)
      fail
   end

   initially(argv[])
      self$Component.initially()
      self.internal_alignment := "l"
      if *argv > 0 then set_fields(argv)
end
