FLEXArgumentInputViewFactory.m 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. //
  2. // FLEXArgumentInputViewFactory.m
  3. // FLEXInjected
  4. //
  5. // Created by Ryan Olson on 6/15/14.
  6. //
  7. //
  8. #import "FLEXArgumentInputViewFactory.h"
  9. #import "FLEXArgumentInputView.h"
  10. #import "FLEXArgumentInputObjectView.h"
  11. #import "FLEXArgumentInputNumberView.h"
  12. #import "FLEXArgumentInputSwitchView.h"
  13. #import "FLEXArgumentInputStructView.h"
  14. #import "FLEXArgumentInputNotSupportedView.h"
  15. #import "FLEXArgumentInputStringView.h"
  16. #import "FLEXArgumentInputFontView.h"
  17. #import "FLEXArgumentInputColorView.h"
  18. #import "FLEXArgumentInputDateView.h"
  19. #import "FLEXRuntimeUtility.h"
  20. @implementation FLEXArgumentInputViewFactory
  21. + (FLEXArgumentInputView *)argumentInputViewForTypeEncoding:(const char *)typeEncoding
  22. {
  23. return [self argumentInputViewForTypeEncoding:typeEncoding currentValue:nil];
  24. }
  25. + (FLEXArgumentInputView *)argumentInputViewForTypeEncoding:(const char *)typeEncoding currentValue:(id)currentValue
  26. {
  27. Class subclass = [self argumentInputViewSubclassForTypeEncoding:typeEncoding currentValue:currentValue];
  28. if (!subclass) {
  29. // Fall back to a FLEXArgumentInputNotSupportedView if we can't find a subclass that fits the type encoding.
  30. // The unsupported view shows "nil" and does not allow user input.
  31. subclass = [FLEXArgumentInputNotSupportedView class];
  32. }
  33. // Remove the field name if there is any (e.g. \"width\"d -> d)
  34. const NSUInteger fieldNameOffset = [FLEXRuntimeUtility fieldNameOffsetForTypeEncoding:typeEncoding];
  35. return [[subclass alloc] initWithArgumentTypeEncoding:typeEncoding + fieldNameOffset];
  36. }
  37. + (Class)argumentInputViewSubclassForTypeEncoding:(const char *)typeEncoding currentValue:(id)currentValue
  38. {
  39. // Remove the field name if there is any (e.g. \"width\"d -> d)
  40. const NSUInteger fieldNameOffset = [FLEXRuntimeUtility fieldNameOffsetForTypeEncoding:typeEncoding];
  41. Class argumentInputViewSubclass = nil;
  42. NSArray<Class> *inputViewClasses = @[[FLEXArgumentInputColorView class],
  43. [FLEXArgumentInputFontView class],
  44. [FLEXArgumentInputStringView class],
  45. [FLEXArgumentInputStructView class],
  46. [FLEXArgumentInputSwitchView class],
  47. [FLEXArgumentInputDateView class],
  48. [FLEXArgumentInputNumberView class],
  49. [FLEXArgumentInputObjectView class]];
  50. // Note that order is important here since multiple subclasses may support the same type.
  51. // An example is the number subclass and the bool subclass for the type @encode(BOOL).
  52. // Both work, but we'd prefer to use the bool subclass.
  53. for (Class inputViewClass in inputViewClasses) {
  54. if ([inputViewClass supportsObjCType:typeEncoding + fieldNameOffset withCurrentValue:currentValue]) {
  55. argumentInputViewSubclass = inputViewClass;
  56. break;
  57. }
  58. }
  59. return argumentInputViewSubclass;
  60. }
  61. + (BOOL)canEditFieldWithTypeEncoding:(const char *)typeEncoding currentValue:(id)currentValue
  62. {
  63. return [self argumentInputViewSubclassForTypeEncoding:typeEncoding currentValue:currentValue] != nil;
  64. }
  65. @end