// // DeviceNodePopupView.m // kneet2 // // Created by Jason Lee on 11/5/15. // Copyright (c) 2015 ntels. All rights reserved. // #import "JDObject.h" #import "RequestHandler.h" #import "JDJSONModel.h" #import "CustomLabel.h" #import "CustomTextField.h" #import "CustomTableView.h" #import "CustomImageView.h" #import "CustomButton.h" #import "CustomCheckBox.h" #import "ValidateUtil.h" #import "ImageUtil.h" #import "UIImageView+WebCache.h" #import "DeviceNodePopupView.h" #import "CustomRadioGroup.h" #import "CommandClassControlNodeView.h" @implementation DeviceNodePopupTableViewCell @end @interface DeviceNodePopupView () { CustomRadioReusableGroup *_rgroup; BOOL _isNotFirstLoading, _hasSelectedNode; UIImage *_bgCellImage1, *_bgCellImage2; NSMutableArray *_checkedItems; NSMutableArray *_controlViewArray; } @end @implementation DeviceNodePopupView - (id)initFromNib { for (UIView *view in [CommonUtil nibViews:@"DeviceNodePopupView"]) { if ([view isKindOfClass:[DeviceNodePopupView class]]) { self = (DeviceNodePopupView *)view; //XIB의 경우, 현재 화면 사이즈로 맞춰줘야 함. self.frame = [UIScreen mainScreen].bounds; [self initTableViewAsDefaultStyle:_tableView]; UINib *nib = [UINib nibWithNibName:@"DeviceNodePopupTableViewCell" bundle:nil]; [_tableView registerNib:nib forCellReuseIdentifier:@"NodeCellIdentifier"]; _controlViewArray = [[NSMutableArray alloc] init]; //set radio group _rgroup = [[CustomRadioReusableGroup alloc] init]; _rgroup.tableView = _tableView; [self.imgTitleBar setImage:[UIImage imageNamed:@"img_popup_bg_head"]inset:UIEdgeInsetsMake(kfTopInset,kfRightInset,kfBottomInset,kfLeftInset)]; [self.btnConfirm setBackgroundImage:[UIImage imageNamed:@"img_popup_btn_right"] forState:UIControlStateNormal capInsets:UIEdgeInsetsMake(kfTopInset,kfRightInset,kfBottomInset,kfLeftInset)]; [self.btnConfirm setBackgroundImage:[UIImage imageNamed:@"img_popup_btn_right_press"] forState:UIControlStateHighlighted capInsets:UIEdgeInsetsMake(kfTopInset,kfRightInset,kfBottomInset,kfLeftInset)]; [self.btnCancel setBackgroundImage:[UIImage imageNamed:@"img_popup_btn_left"] forState:UIControlStateNormal capInsets:UIEdgeInsetsMake(kfTopInset,kfRightInset,kfBottomInset,kfLeftInset)]; [self.btnCancel setBackgroundImage:[UIImage imageNamed:@"img_popup_btn_left_press"] forState:UIControlStateHighlighted capInsets:UIEdgeInsetsMake(kfTopInset,kfRightInset,kfBottomInset,kfLeftInset)]; //Localization [self.btnConfirm setTitle:NSLocalizedString(@"확인", @"확인") forState:UIControlStateNormal]; [self.btnCancel setTitle:NSLocalizedString(@"취소", @"취소") forState:UIControlStateNormal]; UIEdgeInsets insets = UIEdgeInsetsMake(1, 1, 1, 2); _bgCellImage1 = [ImageUtil resizableImageWithCapInsets:insets resizingMode:UIImageResizingModeStretch img:[UIImage imageNamed:@"img_list_bg_01"]]; _bgCellImage2 = [ImageUtil resizableImageWithCapInsets:insets resizingMode:UIImageResizingModeStretch img:[UIImage imageNamed:@"img_list_bg_02"]]; } } return self; } - (void)initTableViewAsDefaultStyle:(CustomTableView *)tableView { tableView.dataSource = self; tableView.delegate = self; tableView.separatorStyle = UITableViewCellSeparatorStyleNone; tableView.backgroundColor = [UIColor clearColor]; tableView.tableFooterView = [[UIView alloc] init]; //this call table events; } - (void)didMoveToSuperview { } - (void)setRefDevice:(ItemModel *)refDevice { _refDevice = refDevice; self.lblTitle.text = _refDevice.sourceName; // [self.imgvDevice sd_setImageWithURL:[NSURL URLWithString:_refDevice.imageFileName] placeholderImage:nil options:SDWebImageRefreshCached]; _hasSelectedNode = [_refDevice.subItems matchedObjectName:ksCustomRadioButtonStatus condition:YES] != nil; //이미 선택된 노드가 있는 지 확인, [_tableView reloadData]; } - (NSArray *)selectedItems { NSArray *items = nil; if ([_typeCode isEqualToString:ksItemTypeCodeAction]) { items = _checkedItems; } else { items = (NSArray *)@[_rgroup.valueForChecked]; } return items; } - (ItemSubModel *)selectedNode { return _rgroup.valueForChecked; } #pragma mark - Main Logic #pragma mark - UITableView DataSource & Delegate - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return 1; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return _refDevice.subItems ? _refDevice.subItems.count : 0; } - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { CGFloat height = 130; return height; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { ItemSubModel *subItem = _refDevice.subItems[indexPath.row]; DeviceNodePopupTableViewCell *tcell = (DeviceNodePopupTableViewCell *)[tableView dequeueReusableCellWithIdentifier:@"NodeCellIdentifier"]; tcell.lblNodeName.text = subItem.sourceSubName; //1.set node //뷰를 초기화함. [[tcell.controlContainer subviews] enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { UIView *subview = (UIView *)obj; [subview removeFromSuperview]; }]; if ([_typeCode isEqualToString:ksItemTypeCodeTrigger] || [_typeCode isEqualToString:ksItemTypeCodeCondition]) {//트리거 또는 컨디션 tcell.chkSelect.hidden = YES; tcell.rdoSelect.value = subItem; if (indexPath.row == 0 && !_isNotFirstLoading && !_hasSelectedNode) { _isNotFirstLoading = YES; tcell.rdoSelect.checked = YES; } else { tcell.rdoSelect.checked = [tcell.rdoSelect getRadioStatusFromValue]; } //추가일 경우, 현재 노드 및 선택된 노드 제외 //수정일 경우, 현재 노드와 선택되지 않은 노드를 선택 가능 if (!_isModifyMode) { } // tcell.rdoSelect.enabled = _isModifyMode; [_rgroup addRadioButton:tcell.rdoSelect]; } else if ([_typeCode isEqualToString:ksItemTypeCodeAction]) {//액션 tcell.rdoSelect.hidden = YES; tcell.chkSelect.delegate = self; tcell.chkSelect.value = subItem; tcell.chkSelect.checked = [tcell.chkSelect getCheckStatusFromValue]; } NSLog(@"SubItem : %@", subItem); CommandClassControlNodeView *controlView = _controlViewArray.count > indexPath.row ? _controlViewArray[indexPath.row] : nil; if (!controlView) { controlView = [CommandClassControlNodeView viewForCommandClass:subItem.cmdclsType]; controlView.delegate = self; [_controlViewArray addObject:controlView]; } controlView.nodeEnable = tcell.rdoSelect.checked; controlView.subItem = subItem; tcell.controlContainer.hidden = !controlView; if (!tcell.controlContainer.hidden) { UIView *superview = tcell.controlContainer; [superview addSubview:controlView]; [controlView mas_makeConstraints:^(MASConstraintMaker *make) { make.size.mas_equalTo(controlView.frame.size); make.left.equalTo(superview); make.top.equalTo(superview); }]; } //set background image if (indexPath.row % 2 == 0) { tcell.backgroundView = [[UIImageView alloc] initWithImage:_bgCellImage1]; } else { tcell.backgroundView = [[UIImageView alloc] initWithImage:_bgCellImage2]; } return tcell; } - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { [tableView deselectRowAtIndexPath:indexPath animated:YES]; DeviceNodePopupTableViewCell *tcell = (DeviceNodePopupTableViewCell *)[self tableView:tableView cellForRowAtIndexPath:indexPath]; if ([_typeCode isEqualToString:ksItemTypeCodeTrigger] || [_typeCode isEqualToString:ksItemTypeCodeCondition]) { [_rgroup someRadioButtonTouched:tcell.rdoSelect]; } else if ([_typeCode isEqualToString:ksItemTypeCodeAction]) { [tcell.chkSelect checkBoxClicked]; } [_tableView reloadData]; } - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { // Remove seperator inset if ([cell respondsToSelector:@selector(setSeparatorInset:)]) { [cell setSeparatorInset:UIEdgeInsetsZero]; } // Prevent the cell from inheriting the Table View's margin settings if ([cell respondsToSelector:@selector(setPreservesSuperviewLayoutMargins:)]) { [cell setPreservesSuperviewLayoutMargins:NO]; } // Explictly set your cell's layout margins if ([cell respondsToSelector:@selector(setLayoutMargins:)]) { [cell setLayoutMargins:UIEdgeInsetsZero]; } } #pragma mark - CustomCheckBox Delegate - (void)didCheckBoxClicked:(id)sender { [_tableView reloadData]; } #pragma mark - CommandClassControlNodeView Delegate - (void)didControlNodeAction:(id)sender { CommandClassControlNodeView *nodeView = (CommandClassControlNodeView *)sender; [_tableView enumarateTableViewCellsUsingBlock:^(UITableViewCell *cell, BOOL *stop) { DeviceNodePopupTableViewCell *tcell = (DeviceNodePopupTableViewCell *)cell; if ([tcell.controlContainer isEqual:nodeView.superview]) { [_rgroup someRadioButtonTouched:tcell.rdoSelect]; *stop = YES; } }]; } #pragma mark - UI Events - (IBAction)btnConfirmTouched:(id)sender { //validate if ([_typeCode isEqualToString:ksItemTypeCodeAction]) {//디바이스 멀티 if ([_typeCode isEqualToString:ksItemTypeCodeAction]) {//디바이스 멀티 BOOL isSelected = NO; _checkedItems = (NSMutableArray *)[_refDevice.subItems matchedArrayByObjectName:ksCustomCheckBoxStatus condition:YES]; if (!_checkedItems || !_checkedItems.count) { [[JDFacade facade] alert:NSLocalizedString(@"선택된 항목이 없습니다", @"선택된 항목이 없습니다")]; return; } } } else {//동일한 노드의 액션이 이미 선택되었는지 체크, ItemSubModel *subItem = _rgroup.valueForChecked; CmdClsValueModel *cmdclsValue = nil; for (cmdclsValue in subItem.cmdclsValueList) { if (!_isModifyMode && cmdclsValue.isSelected) { [[JDFacade facade] toast:@"이미 추가되어 있습니다"]; return; } cmdclsValue.isSelected = [[[JDFacade facade] getRadioButtonStatus:cmdclsValue] boolValue]; if (cmdclsValue.isSelected) { subItem.cmdclsValue = cmdclsValue.cmdclsValue; subItem.cmdclsValueMsg = cmdclsValue.cmdclsValueMsg; } } } [super btnConfirmTouched:sender]; } @end