FLEXArgumentInputViewFactory.m 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  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 "FLEXArgumentInputJSONObjectView.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 "FLEXArgumentInputFontsPickerView.h"
  19. @implementation FLEXArgumentInputViewFactory
  20. + (FLEXArgumentInputView *)argumentInputViewForTypeEncoding:(const char *)typeEncoding
  21. {
  22. Class subclass = [self argumentInputViewSubclassForTypeEncoding:typeEncoding currentValue:nil];
  23. if (!subclass) {
  24. // Fall back to a FLEXArgumentInputNotSupportedView if we can't find a subclass that fits the type encoding.
  25. // The unsupported view shows "nil" and does not allow user input.
  26. subclass = [FLEXArgumentInputNotSupportedView class];
  27. }
  28. return [[subclass alloc] initWithArgumentTypeEncoding:typeEncoding];
  29. }
  30. + (Class)argumentInputViewSubclassForTypeEncoding:(const char *)typeEncoding currentValue:(id)currentValue
  31. {
  32. Class argumentInputViewSubclass = nil;
  33. // Note that order is important here since multiple subclasses may support the same type.
  34. // An example is the number subclass and the bool subclass for the type @encode(BOOL).
  35. // Both work, but we'd prefer to use the bool subclass.
  36. if ([FLEXArgumentInputColorView supportsObjCType:typeEncoding withCurrentValue:currentValue]) {
  37. argumentInputViewSubclass = [FLEXArgumentInputColorView class];
  38. } else if ([FLEXArgumentInputFontView supportsObjCType:typeEncoding withCurrentValue:currentValue]) {
  39. argumentInputViewSubclass = [FLEXArgumentInputFontView class];
  40. } else if ([FLEXArgumentInputStringView supportsObjCType:typeEncoding withCurrentValue:currentValue]) {
  41. argumentInputViewSubclass = [FLEXArgumentInputStringView class];
  42. } else if ([FLEXArgumentInputStructView supportsObjCType:typeEncoding withCurrentValue:currentValue]) {
  43. argumentInputViewSubclass = [FLEXArgumentInputStructView class];
  44. } else if ([FLEXArgumentInputSwitchView supportsObjCType:typeEncoding withCurrentValue:currentValue]) {
  45. argumentInputViewSubclass = [FLEXArgumentInputSwitchView class];
  46. } else if ([FLEXArgumentInputNumberView supportsObjCType:typeEncoding withCurrentValue:currentValue]) {
  47. argumentInputViewSubclass = [FLEXArgumentInputNumberView class];
  48. } else if ([FLEXArgumentInputJSONObjectView supportsObjCType:typeEncoding withCurrentValue:currentValue]) {
  49. argumentInputViewSubclass = [FLEXArgumentInputJSONObjectView class];
  50. } else if ([FLEXArgumentInputFontsPickerView supportsObjCType:typeEncoding withCurrentValue:currentValue]) {
  51. argumentInputViewSubclass = [FLEXArgumentInputFontsPickerView class];
  52. }
  53. return argumentInputViewSubclass;
  54. }
  55. + (BOOL)canEditFieldWithTypeEncoding:(const char *)typeEncoding currentValue:(id)currentValue
  56. {
  57. return [self argumentInputViewSubclassForTypeEncoding:typeEncoding currentValue:currentValue] != nil;
  58. }
  59. @end