class Formotion::RowType::TagsRow

Constants

NO
TAGS_EDIT_VIEW_TAG
TAGS_VIEW_TAG
YES

Public Instance Methods

_on_select(tableView, tableViewDelegate) click to toggle source
# File lib/formotion/row_type/tags_row.rb, line 79
def _on_select(tableView, tableViewDelegate)
end
add_plus_accessory(cell) click to toggle source
# File lib/formotion/row_type/tags_row.rb, line 82
def add_plus_accessory(cell)
  @add_button ||= begin
    button = UIButton.buttonWithType(UIButtonTypeContactAdd)
    button.accessibilityLabel = BW.localized_string("add tag", nil)
    button.when(UIControlEventTouchUpInside) do
      if row.on_tap_callback
        row.on_tap_callback.call(self.row)
      end
    end
    button
  end
  cell.accessoryView = cell.editingAccessoryView = @add_button
end
add_tag(text) click to toggle source
# File lib/formotion/row_type/tags_row.rb, line 121
def add_tag(text)
  return if @btns.has_key?(text)
  btn = UIButton.buttonWithType(UIButtonTypeCustom)
  btn.adjustsImageWhenHighlighted = false
  btn.contentEdgeInsets = UIEdgeInsetsMake(0.0, 5.0, 0.0, 5.0)
  textsize = text.sizeWithFont(UIFont.systemFontOfSize(14.0))
  width = textsize.width+14.0
  btn.frame = CGRectMake(0.0, 0.0, width, 24.0)
  [UIControlStateNormal, UIControlStateHighlighted, UIControlStateSelected].each do |state|
    btn.setBackgroundImage(image_for_state(state), forState:state)
    attr_text = NSAttributedString.alloc.initWithString(text, attributes:attrib_for_state(state))          
    btn.setAttributedTitle(attr_text, forState:state)
  end

  if row.editable?
    btn.addTarget(self, action:'button_click:', forControlEvents:UIControlEventTouchUpInside)
  end
    
  btn.translatesAutoresizingMaskIntoConstraints = false
  @scroll_view.addSubview(btn)
  unless row.value.include?(text)
    row.value << text
  end
  @btns[text] = btn
end
alertView(alert_view, clickedButtonAtIndex:button_index) click to toggle source
# File lib/formotion/row_type/tags_row.rb, line 158
def alertView(alert_view, clickedButtonAtIndex:button_index)
  if alert_view.buttonTitleAtIndex(button_index)==NO
    @del_btn = nil
    return
  end 
  @del_btn.removeFromSuperview
  @btns.delete(@del_btn)
  row.value.delete(@del_btn.currentAttributedTitle.string)
end
attrib_for_state(state) click to toggle source
# File lib/formotion/row_type/tags_row.rb, line 108
def attrib_for_state(state)
  case state
  when UIControlStateNormal
    return { NSFontAttributeName => UIFont.systemFontOfSize(14.0),
             NSForegroundColorAttributeName => UIColor.blackColor }
    
  when UIControlStateHighlighted, UIControlStateSelected
    return { NSFontAttributeName => UIFont.systemFontOfSize(14.0),
             NSForegroundColorAttributeName => UIColor.whiteColor }
             
  end
end
build_cell(cell) click to toggle source
# File lib/formotion/row_type/tags_row.rb, line 15
def build_cell(cell)
  # only show the "plus" when editable
  add_plus_accessory(cell) if row.editable?
  
  self.row.value = [] unless self.row.value.is_a?(Array)
  
  @scroll_view          = UIScrollView.alloc.init
  @scroll_view.tag      = row.editable? ? TAGS_EDIT_VIEW_TAG : TAGS_VIEW_TAG
  @scroll_view.delegate = self
  @scroll_view.pagingEnabled        = false
  @scroll_view.delaysContentTouches = true
  @scroll_view.showsHorizontalScrollIndicator = false
  @scroll_view.showsVerticalScrollIndicator   = false
  @btns = {}
  cell.addSubview(@scroll_view)
  
  row.value.each do |t|
    add_tag(t)
  end

  cell.swizzle(:layoutSubviews) do
    def layoutSubviews
      old_layoutSubviews

      # viewWithTag is terrible, but I think it's ok to use here...
      edittable = false
      formotion_field = self.viewWithTag(TAGS_VIEW_TAG)
      # is an editable row
      if formotion_field.nil?
        edittable = true
        formotion_field = self.viewWithTag(TAGS_EDIT_VIEW_TAG)
      end
      field_frame = formotion_field.frame
    
      field_frame.origin.x = self.textLabel.frame.origin.x + self.textLabel.frame.size.width + Formotion::RowType::Base.field_buffer
      edit_buffer = edittable ? 20.0 : 0.0
      field_frame.size.width  = self.frame.size.width - field_frame.origin.x - Formotion::RowType::Base.field_buffer - edit_buffer
      
      # rearrange the tags
      last = CGRectMake(0.0, 0.0, 0.0, 0.0)
      formotion_field.subviews.each do |sv|
        now = sv.frame
        now.origin.x = (last.origin.x+last.size.width)+5.0
        now.origin.y = last.origin.y
        if (now.origin.x+now.size.width)+3.0 > field_frame.size.width
          now.origin.x = 5.0
          now.origin.y += last.size.height + 5.0
        end
        sv.frame = now
        last = now
      end
      
      # set the height of the scroll box
      max_height = self.frame.size.height - 3.0
      field_frame.size.height = last.origin.y + last.size.height + 5.0
      field_frame.size.height = max_height if field_frame.size.height > max_height
      field_frame.origin.y = (self.frame.size.height - field_frame.size.height) / 2.0
      
      formotion_field.frame = field_frame
      
    end
  end
end
button_click(btn) click to toggle source
# File lib/formotion/row_type/tags_row.rb, line 147
def button_click(btn)
  @del_btn = btn
  App.alert(BW.localized_string("Remove Tag?"), cancel_button_title: NO) do |alert|
    alert.addButtonWithTitle(YES)
    alert.delegate = self
  end
end
image_for_state(state) click to toggle source
# File lib/formotion/row_type/tags_row.rb, line 96
def image_for_state(state)
  case state
  when UIControlStateNormal
    return UIImage.imageNamed("tags_row.png").stretchableImageWithLeftCapWidth(14, topCapHeight:0)
    
  when UIControlStateHighlighted, UIControlStateSelected
    return UIImage.imageNamed("tags_row-selected.png").stretchableImageWithLeftCapWidth(14, topCapHeight:0)
              
  end
  nil
end
layoutSubviews() click to toggle source
# File lib/formotion/row_type/tags_row.rb, line 36
def layoutSubviews
  old_layoutSubviews

  # viewWithTag is terrible, but I think it's ok to use here...
  edittable = false
  formotion_field = self.viewWithTag(TAGS_VIEW_TAG)
  # is an editable row
  if formotion_field.nil?
    edittable = true
    formotion_field = self.viewWithTag(TAGS_EDIT_VIEW_TAG)
  end
  field_frame = formotion_field.frame
    
  field_frame.origin.x = self.textLabel.frame.origin.x + self.textLabel.frame.size.width + Formotion::RowType::Base.field_buffer
  edit_buffer = edittable ? 20.0 : 0.0
  field_frame.size.width  = self.frame.size.width - field_frame.origin.x - Formotion::RowType::Base.field_buffer - edit_buffer
  
  # rearrange the tags
  last = CGRectMake(0.0, 0.0, 0.0, 0.0)
  formotion_field.subviews.each do |sv|
    now = sv.frame
    now.origin.x = (last.origin.x+last.size.width)+5.0
    now.origin.y = last.origin.y
    if (now.origin.x+now.size.width)+3.0 > field_frame.size.width
      now.origin.x = 5.0
      now.origin.y += last.size.height + 5.0
    end
    sv.frame = now
    last = now
  end
  
  # set the height of the scroll box
  max_height = self.frame.size.height - 3.0
  field_frame.size.height = last.origin.y + last.size.height + 5.0
  field_frame.size.height = max_height if field_frame.size.height > max_height
  field_frame.origin.y = (self.frame.size.height - field_frame.size.height) / 2.0
  
  formotion_field.frame = field_frame
  
end
scrollViewDidScroll(_scroll_view) click to toggle source
# File lib/formotion/row_type/tags_row.rb, line 168
def scrollViewDidScroll(_scroll_view)
end