├── PI Emoji Picker ├── en.lproj │ ├── InfoPlist.strings │ └── Credits.rtf ├── PI Emoji Picker-Prefix.pch ├── main.m ├── PIAppDelegate.h ├── PIEmojiViewController.h ├── PIEmojiViewController.m ├── Images.xcassets │ └── AppIcon.appiconset │ │ └── Contents.json ├── PI Emoji Picker-Info.plist ├── PIAppDelegate.m └── Base.lproj │ └── MainMenu.xib ├── Emoji Picker ├── EmojiView.xcassets │ ├── car_n.imageset │ │ ├── car_n.png │ │ ├── car_n@2x.png │ │ └── Contents.json │ ├── car_s.imageset │ │ ├── car_s.png │ │ ├── car_s@2x.png │ │ └── Contents.json │ ├── bell_n.imageset │ │ ├── bell_n.png │ │ ├── bell_n@2x.png │ │ └── Contents.json │ ├── bell_s.imageset │ │ ├── bell_s.png │ │ ├── bell_s@2x.png │ │ └── Contents.json │ ├── face_n.imageset │ │ ├── face_n.png │ │ ├── face_n@2x.png │ │ └── Contents.json │ ├── face_s.imageset │ │ ├── face_s.png │ │ ├── face_s@2x.png │ │ └── Contents.json │ ├── flower_n.imageset │ │ ├── flower_n.png │ │ ├── flower_n@2x.png │ │ └── Contents.json │ ├── flower_s.imageset │ │ ├── flower_s.png │ │ ├── flower_s@2x.png │ │ └── Contents.json │ ├── recent_n.imageset │ │ ├── recent_n.png │ │ ├── recent_n@2x.png │ │ └── Contents.json │ ├── recent_s.imageset │ │ ├── recent_s.png │ │ ├── recent_s@2x.png │ │ └── Contents.json │ ├── backspace_n.imageset │ │ ├── backspace_n.png │ │ ├── backspace_n@2x.png │ │ └── Contents.json │ ├── characters_n.imageset │ │ ├── characters_n.png │ │ ├── characters_n@2x.png │ │ └── Contents.json │ └── characters_s.imageset │ │ ├── characters_s.png │ │ ├── characters_s@2x.png │ │ └── Contents.json ├── RPBorderlessSegmented │ ├── RPBorderlessSegmentedCell.h │ ├── RPBorderlessSegmentedControl.h │ ├── NSImage+DrawAsTemplate.h │ ├── RPBorderlessSegmentedControl.m │ ├── RPBorderlessSegmentedCell.m │ └── NSImage+DrawAsTemplate.m ├── PIEmojiKeyboardView.h ├── PIEmojiPageView.h ├── PIEmojiPageView.m ├── EmojiView.xib ├── PIEmojiKeyboardView.m └── EmojisList.plist ├── PI Emoji Picker.xcodeproj ├── project.xcworkspace │ └── contents.xcworkspacedata ├── xcuserdata │ └── akac.xcuserdatad │ │ ├── xcdebugger │ │ └── Breakpoints_v2.xcbkptlist │ │ └── xcschemes │ │ └── PI Emoji Picker.xcscheme └── project.pbxproj ├── .gitignore ├── LICENSE └── README.md /PI Emoji Picker/en.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Localized versions of Info.plist keys */ 2 | 3 | -------------------------------------------------------------------------------- /Emoji Picker/EmojiView.xcassets/car_n.imageset/car_n.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WebISInc/PI_EmojiPicker/HEAD/Emoji Picker/EmojiView.xcassets/car_n.imageset/car_n.png -------------------------------------------------------------------------------- /Emoji Picker/EmojiView.xcassets/car_s.imageset/car_s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WebISInc/PI_EmojiPicker/HEAD/Emoji Picker/EmojiView.xcassets/car_s.imageset/car_s.png -------------------------------------------------------------------------------- /Emoji Picker/EmojiView.xcassets/bell_n.imageset/bell_n.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WebISInc/PI_EmojiPicker/HEAD/Emoji Picker/EmojiView.xcassets/bell_n.imageset/bell_n.png -------------------------------------------------------------------------------- /Emoji Picker/EmojiView.xcassets/bell_s.imageset/bell_s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WebISInc/PI_EmojiPicker/HEAD/Emoji Picker/EmojiView.xcassets/bell_s.imageset/bell_s.png -------------------------------------------------------------------------------- /Emoji Picker/EmojiView.xcassets/car_n.imageset/car_n@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WebISInc/PI_EmojiPicker/HEAD/Emoji Picker/EmojiView.xcassets/car_n.imageset/car_n@2x.png -------------------------------------------------------------------------------- /Emoji Picker/EmojiView.xcassets/car_s.imageset/car_s@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WebISInc/PI_EmojiPicker/HEAD/Emoji Picker/EmojiView.xcassets/car_s.imageset/car_s@2x.png -------------------------------------------------------------------------------- /Emoji Picker/EmojiView.xcassets/face_n.imageset/face_n.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WebISInc/PI_EmojiPicker/HEAD/Emoji Picker/EmojiView.xcassets/face_n.imageset/face_n.png -------------------------------------------------------------------------------- /Emoji Picker/EmojiView.xcassets/face_s.imageset/face_s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WebISInc/PI_EmojiPicker/HEAD/Emoji Picker/EmojiView.xcassets/face_s.imageset/face_s.png -------------------------------------------------------------------------------- /Emoji Picker/EmojiView.xcassets/bell_n.imageset/bell_n@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WebISInc/PI_EmojiPicker/HEAD/Emoji Picker/EmojiView.xcassets/bell_n.imageset/bell_n@2x.png -------------------------------------------------------------------------------- /Emoji Picker/EmojiView.xcassets/bell_s.imageset/bell_s@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WebISInc/PI_EmojiPicker/HEAD/Emoji Picker/EmojiView.xcassets/bell_s.imageset/bell_s@2x.png -------------------------------------------------------------------------------- /Emoji Picker/EmojiView.xcassets/face_n.imageset/face_n@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WebISInc/PI_EmojiPicker/HEAD/Emoji Picker/EmojiView.xcassets/face_n.imageset/face_n@2x.png -------------------------------------------------------------------------------- /Emoji Picker/EmojiView.xcassets/face_s.imageset/face_s@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WebISInc/PI_EmojiPicker/HEAD/Emoji Picker/EmojiView.xcassets/face_s.imageset/face_s@2x.png -------------------------------------------------------------------------------- /Emoji Picker/EmojiView.xcassets/flower_n.imageset/flower_n.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WebISInc/PI_EmojiPicker/HEAD/Emoji Picker/EmojiView.xcassets/flower_n.imageset/flower_n.png -------------------------------------------------------------------------------- /Emoji Picker/EmojiView.xcassets/flower_s.imageset/flower_s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WebISInc/PI_EmojiPicker/HEAD/Emoji Picker/EmojiView.xcassets/flower_s.imageset/flower_s.png -------------------------------------------------------------------------------- /Emoji Picker/EmojiView.xcassets/recent_n.imageset/recent_n.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WebISInc/PI_EmojiPicker/HEAD/Emoji Picker/EmojiView.xcassets/recent_n.imageset/recent_n.png -------------------------------------------------------------------------------- /Emoji Picker/EmojiView.xcassets/recent_s.imageset/recent_s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WebISInc/PI_EmojiPicker/HEAD/Emoji Picker/EmojiView.xcassets/recent_s.imageset/recent_s.png -------------------------------------------------------------------------------- /Emoji Picker/EmojiView.xcassets/flower_n.imageset/flower_n@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WebISInc/PI_EmojiPicker/HEAD/Emoji Picker/EmojiView.xcassets/flower_n.imageset/flower_n@2x.png -------------------------------------------------------------------------------- /Emoji Picker/EmojiView.xcassets/flower_s.imageset/flower_s@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WebISInc/PI_EmojiPicker/HEAD/Emoji Picker/EmojiView.xcassets/flower_s.imageset/flower_s@2x.png -------------------------------------------------------------------------------- /Emoji Picker/EmojiView.xcassets/recent_n.imageset/recent_n@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WebISInc/PI_EmojiPicker/HEAD/Emoji Picker/EmojiView.xcassets/recent_n.imageset/recent_n@2x.png -------------------------------------------------------------------------------- /Emoji Picker/EmojiView.xcassets/recent_s.imageset/recent_s@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WebISInc/PI_EmojiPicker/HEAD/Emoji Picker/EmojiView.xcassets/recent_s.imageset/recent_s@2x.png -------------------------------------------------------------------------------- /Emoji Picker/EmojiView.xcassets/backspace_n.imageset/backspace_n.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WebISInc/PI_EmojiPicker/HEAD/Emoji Picker/EmojiView.xcassets/backspace_n.imageset/backspace_n.png -------------------------------------------------------------------------------- /Emoji Picker/EmojiView.xcassets/backspace_n.imageset/backspace_n@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WebISInc/PI_EmojiPicker/HEAD/Emoji Picker/EmojiView.xcassets/backspace_n.imageset/backspace_n@2x.png -------------------------------------------------------------------------------- /Emoji Picker/EmojiView.xcassets/characters_n.imageset/characters_n.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WebISInc/PI_EmojiPicker/HEAD/Emoji Picker/EmojiView.xcassets/characters_n.imageset/characters_n.png -------------------------------------------------------------------------------- /Emoji Picker/EmojiView.xcassets/characters_s.imageset/characters_s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WebISInc/PI_EmojiPicker/HEAD/Emoji Picker/EmojiView.xcassets/characters_s.imageset/characters_s.png -------------------------------------------------------------------------------- /Emoji Picker/EmojiView.xcassets/characters_n.imageset/characters_n@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WebISInc/PI_EmojiPicker/HEAD/Emoji Picker/EmojiView.xcassets/characters_n.imageset/characters_n@2x.png -------------------------------------------------------------------------------- /Emoji Picker/EmojiView.xcassets/characters_s.imageset/characters_s@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WebISInc/PI_EmojiPicker/HEAD/Emoji Picker/EmojiView.xcassets/characters_s.imageset/characters_s@2x.png -------------------------------------------------------------------------------- /PI Emoji Picker.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /PI Emoji Picker/PI Emoji Picker-Prefix.pch: -------------------------------------------------------------------------------- 1 | // 2 | // Prefix header 3 | // 4 | // The contents of this file are implicitly included at the beginning of every source file. 5 | // 6 | 7 | #ifdef __OBJC__ 8 | #import 9 | #endif 10 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # CocoaPods 2 | # 3 | # We recommend against adding the Pods directory to your .gitignore. However 4 | # you should judge for yourself, the pros and cons are mentioned at: 5 | # http://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control? 6 | # 7 | # Pods/ 8 | 9 | -------------------------------------------------------------------------------- /PI Emoji Picker/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // PI Emoji Picker 4 | // 5 | // Created by Alex Kac on 5/29/14. 6 | // Copyright (c) 2014 Web Information Solutions, Inc. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | int main(int argc, const char * argv[]) 12 | { 13 | return NSApplicationMain(argc, argv); 14 | } 15 | -------------------------------------------------------------------------------- /Emoji Picker/RPBorderlessSegmented/RPBorderlessSegmentedCell.h: -------------------------------------------------------------------------------- 1 | // 2 | // RPBorderlessSegmentedCell.h 3 | // RPBorderlessSegmentedControlDemo 4 | // 5 | // Created by Brandon Evans on 2/11/2014. 6 | // Copyright (c) 2014 Robots and Pencils. All rights reserved. 7 | // 8 | 9 | @interface RPBorderlessSegmentedCell : NSSegmentedCell 10 | 11 | @end 12 | -------------------------------------------------------------------------------- /Emoji Picker/RPBorderlessSegmented/RPBorderlessSegmentedControl.h: -------------------------------------------------------------------------------- 1 | // 2 | // RPBorderlessSegmentedControl.h 3 | // RPBorderlessSegmentedControlDemo 4 | // 5 | // Created by Brandon Evans on 2/10/2014. 6 | // Copyright (c) 2014 Robots and Pencils. All rights reserved. 7 | // 8 | 9 | @interface RPBorderlessSegmentedControl : NSSegmentedControl 10 | 11 | @end 12 | -------------------------------------------------------------------------------- /PI Emoji Picker/PIAppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // PIAppDelegate.h 3 | // PI Emoji Picker 4 | // 5 | // Created by Alex Kac on 5/29/14. 6 | // Copyright (c) 2014 Web Information Solutions, Inc. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface PIAppDelegate : NSObject 12 | 13 | @property (assign) IBOutlet NSWindow *window; 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /Emoji Picker/EmojiView.xcassets/bell_n.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x", 6 | "filename" : "bell_n.png" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x", 11 | "filename" : "bell_n@2x.png" 12 | } 13 | ], 14 | "info" : { 15 | "version" : 1, 16 | "author" : "xcode" 17 | } 18 | } -------------------------------------------------------------------------------- /Emoji Picker/EmojiView.xcassets/bell_s.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x", 6 | "filename" : "bell_s.png" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x", 11 | "filename" : "bell_s@2x.png" 12 | } 13 | ], 14 | "info" : { 15 | "version" : 1, 16 | "author" : "xcode" 17 | } 18 | } -------------------------------------------------------------------------------- /Emoji Picker/EmojiView.xcassets/car_n.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x", 6 | "filename" : "car_n.png" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x", 11 | "filename" : "car_n@2x.png" 12 | } 13 | ], 14 | "info" : { 15 | "version" : 1, 16 | "author" : "xcode" 17 | } 18 | } -------------------------------------------------------------------------------- /Emoji Picker/EmojiView.xcassets/car_s.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x", 6 | "filename" : "car_s.png" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x", 11 | "filename" : "car_s@2x.png" 12 | } 13 | ], 14 | "info" : { 15 | "version" : 1, 16 | "author" : "xcode" 17 | } 18 | } -------------------------------------------------------------------------------- /Emoji Picker/EmojiView.xcassets/face_n.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x", 6 | "filename" : "face_n.png" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x", 11 | "filename" : "face_n@2x.png" 12 | } 13 | ], 14 | "info" : { 15 | "version" : 1, 16 | "author" : "xcode" 17 | } 18 | } -------------------------------------------------------------------------------- /Emoji Picker/EmojiView.xcassets/face_s.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x", 6 | "filename" : "face_s.png" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x", 11 | "filename" : "face_s@2x.png" 12 | } 13 | ], 14 | "info" : { 15 | "version" : 1, 16 | "author" : "xcode" 17 | } 18 | } -------------------------------------------------------------------------------- /Emoji Picker/EmojiView.xcassets/flower_n.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x", 6 | "filename" : "flower_n.png" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x", 11 | "filename" : "flower_n@2x.png" 12 | } 13 | ], 14 | "info" : { 15 | "version" : 1, 16 | "author" : "xcode" 17 | } 18 | } -------------------------------------------------------------------------------- /Emoji Picker/EmojiView.xcassets/flower_s.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x", 6 | "filename" : "flower_s.png" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x", 11 | "filename" : "flower_s@2x.png" 12 | } 13 | ], 14 | "info" : { 15 | "version" : 1, 16 | "author" : "xcode" 17 | } 18 | } -------------------------------------------------------------------------------- /Emoji Picker/EmojiView.xcassets/recent_n.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x", 6 | "filename" : "recent_n.png" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x", 11 | "filename" : "recent_n@2x.png" 12 | } 13 | ], 14 | "info" : { 15 | "version" : 1, 16 | "author" : "xcode" 17 | } 18 | } -------------------------------------------------------------------------------- /Emoji Picker/EmojiView.xcassets/recent_s.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x", 6 | "filename" : "recent_s.png" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x", 11 | "filename" : "recent_s@2x.png" 12 | } 13 | ], 14 | "info" : { 15 | "version" : 1, 16 | "author" : "xcode" 17 | } 18 | } -------------------------------------------------------------------------------- /Emoji Picker/EmojiView.xcassets/backspace_n.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x", 6 | "filename" : "backspace_n.png" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x", 11 | "filename" : "backspace_n@2x.png" 12 | } 13 | ], 14 | "info" : { 15 | "version" : 1, 16 | "author" : "xcode" 17 | } 18 | } -------------------------------------------------------------------------------- /Emoji Picker/EmojiView.xcassets/characters_n.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x", 6 | "filename" : "characters_n.png" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x", 11 | "filename" : "characters_n@2x.png" 12 | } 13 | ], 14 | "info" : { 15 | "version" : 1, 16 | "author" : "xcode" 17 | } 18 | } -------------------------------------------------------------------------------- /Emoji Picker/EmojiView.xcassets/characters_s.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x", 6 | "filename" : "characters_s.png" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x", 11 | "filename" : "characters_s@2x.png" 12 | } 13 | ], 14 | "info" : { 15 | "version" : 1, 16 | "author" : "xcode" 17 | } 18 | } -------------------------------------------------------------------------------- /PI Emoji Picker/PIEmojiViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // PIEmojiViewController.h 3 | // PI Emoji Picker 4 | // 5 | // Created by Alex Kac on 5/29/14. 6 | // Copyright (c) 2014 Web Information Solutions, Inc. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "PIEmojiKeyboardView.h" 11 | 12 | @interface PIEmojiViewController : NSViewController 13 | @property (nonatomic, weak) id delegate; 14 | 15 | @end 16 | 17 | -------------------------------------------------------------------------------- /PI Emoji Picker/en.lproj/Credits.rtf: -------------------------------------------------------------------------------- 1 | {\rtf0\ansi{\fonttbl\f0\fswiss Helvetica;} 2 | {\colortbl;\red255\green255\blue255;} 3 | \paperw9840\paperh8400 4 | \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural 5 | 6 | \f0\b\fs24 \cf0 Engineering: 7 | \b0 \ 8 | Some people\ 9 | \ 10 | 11 | \b Human Interface Design: 12 | \b0 \ 13 | Some other people\ 14 | \ 15 | 16 | \b Testing: 17 | \b0 \ 18 | Hopefully not nobody\ 19 | \ 20 | 21 | \b Documentation: 22 | \b0 \ 23 | Whoever\ 24 | \ 25 | 26 | \b With special thanks to: 27 | \b0 \ 28 | Mom\ 29 | } 30 | -------------------------------------------------------------------------------- /PI Emoji Picker.xcodeproj/xcuserdata/akac.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 8 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /PI Emoji Picker/PIEmojiViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // PIEmojiViewController.m 3 | // PI Emoji Picker 4 | // 5 | // Created by Alex Kac on 5/29/14. 6 | // Copyright (c) 2014 Web Information Solutions, Inc. All rights reserved. 7 | // 8 | 9 | #import "PIEmojiViewController.h" 10 | 11 | @interface PIEmojiViewController () 12 | @end 13 | 14 | @implementation PIEmojiViewController 15 | 16 | - (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 17 | { 18 | self = [super initWithNibName:@"EmojiView" bundle:nil]; 19 | if (self) { 20 | } 21 | return self; 22 | } 23 | 24 | -(void)setDelegate:(id)delegate 25 | { 26 | PIEmojiKeyboardView* emojiKeyboardView = (PIEmojiKeyboardView*)self.view; 27 | emojiKeyboardView.delegate = delegate; 28 | } 29 | 30 | @end 31 | -------------------------------------------------------------------------------- /Emoji Picker/RPBorderlessSegmented/NSImage+DrawAsTemplate.h: -------------------------------------------------------------------------------- 1 | // 2 | // NSImage+DrawAsTemplate.h 3 | // RPBorderlessSegmentedControlDemo 4 | // 5 | // Created by Brandon Evans on 2/10/2014. 6 | // Copyright (c) 2014 Robots and Pencils. All rights reserved. 7 | // 8 | 9 | @interface NSImage (DrawAsTemplate) 10 | 11 | /** 12 | * Draws the image as a template similar to the Xcode toolbar controls 13 | * Based on Ole Zorn's Stack Overflow response http://stackoverflow.com/a/7138497/1082395 14 | * 15 | * @param rect the rect that the image will be drawn inside 16 | * @param view the view (usually the controlView) that the image will be drawn inside 17 | * @param highlighted whether the image should be drawn with a blue highlight 18 | * @param enabled whether the image should be drawn as if the control were enabled 19 | */ 20 | - (void)drawAsTemplateInRect:(NSRect)rect inView:(NSView *)view highlighted:(BOOL)highlighted enabled:(BOOL)enabled; 21 | 22 | @end 23 | -------------------------------------------------------------------------------- /Emoji Picker/PIEmojiKeyboardView.h: -------------------------------------------------------------------------------- 1 | // 2 | // PIEmojiKeyboardView.h 3 | // PI Emoji Picker 4 | // 5 | // Created by Alex Kac on 5/30/14. 6 | // Copyright (c) 2014 Web Information Solutions, Inc. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @protocol PIEmojiViewDelegate; 12 | 13 | 14 | @interface PIEmojiKeyboardView : NSView 15 | @property (nonatomic, weak) id delegate; 16 | @end 17 | 18 | /** 19 | Protocol to be followed by the delegate of `PIEmojiView`. 20 | */ 21 | @protocol PIEmojiViewDelegate 22 | 23 | /** 24 | Delegate method called when user taps an emoji button 25 | 26 | @param emojiKeyBoardView EmojiKeyBoardView object on which user has tapped. 27 | 28 | @param emoji Emoji used by user 29 | */ 30 | - (void)emojiKeyDidUseEmoji:(NSString *)emoji; 31 | 32 | /** 33 | Delegate method called when user taps on the backspace button 34 | 35 | @param emojiKeyBoardView EmojiKeyBoardView object on which user has tapped. 36 | */ 37 | - (void)emojiKeyBoardViewDidPressBackSpace; 38 | 39 | @end 40 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2014 Web Information Solutions, Inc. 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /PI Emoji Picker/Images.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "mac", 5 | "size" : "16x16", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "mac", 10 | "size" : "16x16", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "mac", 15 | "size" : "32x32", 16 | "scale" : "1x" 17 | }, 18 | { 19 | "idiom" : "mac", 20 | "size" : "32x32", 21 | "scale" : "2x" 22 | }, 23 | { 24 | "idiom" : "mac", 25 | "size" : "128x128", 26 | "scale" : "1x" 27 | }, 28 | { 29 | "idiom" : "mac", 30 | "size" : "128x128", 31 | "scale" : "2x" 32 | }, 33 | { 34 | "idiom" : "mac", 35 | "size" : "256x256", 36 | "scale" : "1x" 37 | }, 38 | { 39 | "idiom" : "mac", 40 | "size" : "256x256", 41 | "scale" : "2x" 42 | }, 43 | { 44 | "idiom" : "mac", 45 | "size" : "512x512", 46 | "scale" : "1x" 47 | }, 48 | { 49 | "idiom" : "mac", 50 | "size" : "512x512", 51 | "scale" : "2x" 52 | } 53 | ], 54 | "info" : { 55 | "version" : 1, 56 | "author" : "xcode" 57 | } 58 | } -------------------------------------------------------------------------------- /PI Emoji Picker/PI Emoji Picker-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIconFile 10 | 11 | CFBundleIdentifier 12 | net.webis.${PRODUCT_NAME:rfc1034identifier} 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | ${PRODUCT_NAME} 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | 1 25 | LSMinimumSystemVersion 26 | ${MACOSX_DEPLOYMENT_TARGET} 27 | NSHumanReadableCopyright 28 | Copyright © 2014 Web Information Solutions, Inc. All rights reserved. 29 | NSMainNibFile 30 | MainMenu 31 | NSPrincipalClass 32 | NSApplication 33 | 34 | 35 | -------------------------------------------------------------------------------- /PI Emoji Picker/PIAppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // PIAppDelegate.m 3 | // PI Emoji Picker 4 | // 5 | // Created by Alex Kac on 5/29/14. 6 | // Copyright (c) 2014 Web Information Solutions, Inc. All rights reserved. 7 | // 8 | 9 | #import "PIAppDelegate.h" 10 | #import "PIEmojiViewController.h" 11 | 12 | @interface PIAppDelegate () 13 | @property (weak) IBOutlet NSTextField *textField; 14 | 15 | @end 16 | 17 | @implementation PIAppDelegate 18 | 19 | - (void)applicationDidFinishLaunching:(NSNotification *)aNotification 20 | { 21 | // Insert code here to initialize your application 22 | } 23 | 24 | - (IBAction)openEmojiPicker:(NSButton *)sender { 25 | PIEmojiViewController* emojiVC = [[PIEmojiViewController alloc] initWithNibName:nil bundle:nil]; 26 | emojiVC.delegate = self; 27 | 28 | NSPopover* popover = [[NSPopover alloc] init]; 29 | popover.contentViewController = emojiVC; 30 | [popover showRelativeToRect:sender.bounds 31 | ofView:sender 32 | preferredEdge:NSMinXEdge | NSMinYEdge]; 33 | } 34 | 35 | -(void)emojiKeyDidUseEmoji:(NSString *)emoji 36 | { 37 | NSString* oldString = self.textField.stringValue; 38 | self.textField.stringValue = [oldString stringByAppendingString:emoji]; 39 | } 40 | 41 | -(void)emojiKeyBoardViewDidPressBackSpace 42 | { 43 | NSString* oldString = self.textField.stringValue; 44 | if (oldString.length) 45 | { 46 | NSUInteger lastCharIndex = [oldString length] - 1; // I assume string is not empty 47 | NSRange rangeOfLastChar = [oldString rangeOfComposedCharacterSequenceAtIndex: lastCharIndex]; 48 | self.textField.stringValue = [oldString substringToIndex: rangeOfLastChar.location]; 49 | } 50 | } 51 | 52 | @end 53 | -------------------------------------------------------------------------------- /Emoji Picker/PIEmojiPageView.h: -------------------------------------------------------------------------------- 1 | // 2 | // PIEmojiPageView.h 3 | // PI Emoji Picker 4 | // 5 | // Created by Alex Kac on 5/30/14. 6 | // Copyright (c) 2014 Web Information Solutions, Inc. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @protocol PIEmojiPageViewDelegate; 12 | 13 | 14 | @interface PIEmojiPageView : NSView 15 | @property (nonatomic, assign) id delegate; 16 | 17 | /** 18 | Creates and returns an EmojiPageView 19 | 20 | @param backSpaceButtonImage Imge to be used to present the back space button. 21 | @param buttonsSize Size for the button representing a single emoji 22 | @param rows Number of rows in a single EmojiPageView 23 | @param columns Number of columns in a single EmojiPageView. Also represents the number of emojis shown in a row. 24 | 25 | @return An instance of EmojiPageView 26 | */ 27 | - (id)initWithFrame:(NSRect)frame 28 | buttonSize:(NSSize)buttonSize 29 | rows:(NSUInteger)rows 30 | columns:(NSUInteger)columns; 31 | 32 | /** 33 | Sets texts on buttons in the EmojiPageView. 34 | 35 | @param buttonTexts An array of texts to be set on buttons in EmojiPageView 36 | */ 37 | - (void)setButtonTexts:(NSMutableArray *)buttonTexts; 38 | 39 | @end 40 | 41 | @protocol PIEmojiPageViewDelegate 42 | 43 | /** 44 | Delegate method called when user taps an emoji button 45 | @param emojiPageView EmojiPageView object on which user has tapped. 46 | @param emoji Emoji pressed by user 47 | */ 48 | - (void)emojiPageView:(PIEmojiPageView *)emojiPageView didUseEmoji:(NSString *)emoji; 49 | 50 | /** 51 | Delegate method called when user taps on the backspace button 52 | @param emojiPageView EmojiPageView object on which user has tapped. 53 | */ 54 | - (void)emojiPageViewDidPressBackSpace:(PIEmojiPageView *)emojiPageView; 55 | 56 | @end 57 | -------------------------------------------------------------------------------- /Emoji Picker/RPBorderlessSegmented/RPBorderlessSegmentedControl.m: -------------------------------------------------------------------------------- 1 | // 2 | // RPBorderlessSegmentedControl.m 3 | // RPBorderlessSegmentedControlDemo 4 | // 5 | // Created by Brandon Evans on 2/10/2014. 6 | // Copyright (c) 2014 Robots and Pencils. All rights reserved. 7 | // 8 | 9 | #import "RPBorderlessSegmentedControl.h" 10 | #import "RPBorderlessSegmentedCell.h" 11 | 12 | @implementation RPBorderlessSegmentedControl 13 | 14 | + (Class)cellClass { 15 | return [RPBorderlessSegmentedCell class]; 16 | } 17 | 18 | - (id)initWithFrame:(NSRect)frameRect { 19 | self = [super initWithFrame:frameRect]; 20 | if (self) { 21 | [self setWantsLayer:YES]; 22 | } 23 | return self; 24 | } 25 | 26 | - (id)initWithCoder:(NSCoder *)aDecoder { 27 | if (![aDecoder isKindOfClass:[NSKeyedUnarchiver class]]) { 28 | return [super initWithCoder:aDecoder]; 29 | } 30 | 31 | NSKeyedUnarchiver *unarchiver = (NSKeyedUnarchiver *)aDecoder; 32 | Class oldClass = [[self superclass] cellClass]; 33 | Class newClass = [[self class] cellClass]; 34 | 35 | [unarchiver setClass:newClass forClassName:NSStringFromClass(oldClass)]; 36 | self = [super initWithCoder:aDecoder]; 37 | [unarchiver setClass:oldClass forClassName:NSStringFromClass(oldClass)]; 38 | 39 | return self; 40 | } 41 | 42 | - (void)awakeFromNib { 43 | [super awakeFromNib]; 44 | [self setWantsLayer:YES]; 45 | } 46 | 47 | - (void)drawRect:(NSRect)rect { 48 | CGFloat segmentWidth = rect.size.width / [self segmentCount]; 49 | CGFloat segmentHeight = rect.size.height - 1; 50 | NSRect segmentRect = NSMakeRect(0, 0, segmentWidth, segmentHeight); 51 | 52 | for (NSInteger segmentIndex = 0; segmentIndex < [self segmentCount]; segmentIndex += 1) { 53 | [(NSSegmentedCell *)self.cell drawSegment:segmentIndex inFrame:segmentRect withView:self]; 54 | segmentRect.origin.x += segmentWidth; 55 | } 56 | } 57 | 58 | @end 59 | -------------------------------------------------------------------------------- /Emoji Picker/RPBorderlessSegmented/RPBorderlessSegmentedCell.m: -------------------------------------------------------------------------------- 1 | // 2 | // RPBorderlessSegmentedCell.m 3 | // RPBorderlessSegmentedControlDemo 4 | // 5 | // Created by Brandon Evans on 2/11/2014. 6 | // Copyright (c) 2014 Robots and Pencils. All rights reserved. 7 | // 8 | 9 | #import "RPBorderlessSegmentedCell.h" 10 | #import "NSImage+DrawAsTemplate.h" 11 | 12 | @implementation RPBorderlessSegmentedCell 13 | 14 | - (void)drawSegment:(NSInteger)segment inFrame:(NSRect)frame withView:(NSView *)controlView { 15 | CGFloat alpha; 16 | 17 | if ([[controlView window] isKeyWindow]) { 18 | alpha = 0.5; 19 | } 20 | else { 21 | alpha = 0.2; 22 | } 23 | 24 | NSImage *image = [self imageForSegment:segment]; 25 | if (image) { 26 | [[NSGraphicsContext currentContext] setImageInterpolation:NSImageInterpolationHigh]; 27 | [self drawCenteredImage:image inFrame:frame alpha:alpha selected:[self isSelectedForSegment:segment] enabled:[(NSControl *)controlView isEnabled]]; 28 | } 29 | } 30 | 31 | - (void)drawCenteredImage:(NSImage*)image inFrame:(NSRect)frame alpha:(CGFloat)alpha selected:(BOOL)selected enabled:(BOOL)enabled { 32 | double sourceRatio = image.size.width / image.size.height; 33 | double targetRatio = NSWidth(frame) / NSHeight(frame); 34 | 35 | NSSize finalSize; 36 | if (sourceRatio > targetRatio) { 37 | finalSize = NSMakeSize(NSWidth(frame), NSWidth(frame) / sourceRatio); 38 | } 39 | else { 40 | finalSize = NSMakeSize(NSHeight(frame) * sourceRatio, NSHeight(frame)); 41 | } 42 | 43 | CGFloat x = frame.origin.x + (frame.size.width - finalSize.width) / 2.0; 44 | CGFloat y = frame.origin.y + (frame.size.height - finalSize.height) / 2.0; 45 | 46 | CGRect rect = CGRectIntegral(NSMakeRect(x, y + 1, finalSize.width, finalSize.height)); 47 | [image drawAsTemplateInRect:rect inView:self.controlView highlighted:selected enabled:enabled]; 48 | } 49 | 50 | @end 51 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | PI_EmojiPicker 2 | ============== 3 | 4 | Simple NSView or NSViewController based picker for Emoji. 5 | 6 | I took the wonderful work of AGEmojiKeyboard (https://github.com/ayushgoel/iOS-emoji-keyboard) as a base to create an OS X version. 7 | 8 | Its extremely simple and worth a couple hours of work. Its useful if you want to allow a user to enter Emoji without having to use the "special keyboard" in the edit menu. 9 | 10 | An example would be like Messages/iChat which has a smiley face picker next to the text entry. 11 | 12 | ![Image](http://webis.s3.amazonaws.com/PIEmojiDesktopScreenshot.png) 13 | 14 | ## Installation 15 | 16 | Copy the files in Emoji Picker into your project and look at the PI Emoji Picker folder to see how the classes are used for more detail. 17 | 18 | ## Usage 19 | 20 | The example file uses a simple NSViewController subclass to show the Emoji picker within an NSPopover: 21 | 22 | ```objective-c 23 | @interface PIEmojiViewController : NSViewController 24 | @property (nonatomic, weak) id delegate; 25 | 26 | @end 27 | 28 | - (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 29 | { 30 | self = [super initWithNibName:@"EmojiView" bundle:nil]; 31 | if (self) { 32 | } 33 | return self; 34 | } 35 | 36 | -(void)setDelegate:(id)delegate 37 | { 38 | PIEmojiKeyboardView* emojiKeyboardView = (PIEmojiKeyboardView*)self.view; 39 | emojiKeyboardView.delegate = delegate; 40 | } 41 | 42 | ``` 43 | 44 | Implement two delegate methods: 45 | 46 | ```objective-c 47 | -(void)emojiKeyDidUseEmoji:(NSString *)emoji 48 | { 49 | } 50 | 51 | -(void)emojiKeyBoardViewDidPressBackSpace 52 | { 53 | } 54 | ``` 55 | 56 | ## Requirements 57 | 58 | Written and tested only on 10.9 Mavericks, with Xcode 5.11, and using ARC 59 | 60 | ## Author 61 | 62 | PI_EmojiPicker is authored by Alex Kac 63 | 64 | AGEmojiKeyboard is authored by Ayush Goel, ayushgoel111@gmail.com 65 | 66 | ## License 67 | 68 | PI_EmojiPicker is available under the MIT license. See the LICENSE file for more info. 69 | 70 | -------------------------------------------------------------------------------- /Emoji Picker/RPBorderlessSegmented/NSImage+DrawAsTemplate.m: -------------------------------------------------------------------------------- 1 | // 2 | // NSImage+DrawAsTemplate.m 3 | // RPBorderlessSegmentedControlDemo 4 | // 5 | // Created by Brandon Evans on 2/10/2014. 6 | // Copyright (c) 2014 Robots and Pencils. All rights reserved. 7 | // 8 | 9 | #import "NSImage+DrawAsTemplate.h" 10 | 11 | @implementation NSImage (DrawAsTemplate) 12 | 13 | - (void)drawAsTemplateInRect:(NSRect)rect inView:(NSView *)view highlighted:(BOOL)highlighted enabled:(BOOL)enabled { 14 | CGFloat dropShadowOffsetY = -1.0; 15 | CGFloat innerShadowBlurRadius = 1.0; 16 | 17 | NSGraphicsContext *graphicsContext = [NSGraphicsContext currentContext]; 18 | CGContextRef context = [graphicsContext graphicsPort]; 19 | 20 | [graphicsContext saveGraphicsState]; 21 | 22 | CGRect deviceRect = CGContextConvertRectToDeviceSpace(context, rect); 23 | CGFloat scale = CGRectGetHeight(deviceRect) / CGRectGetHeight(rect); 24 | 25 | if ([graphicsContext isFlipped]) { 26 | CGContextTranslateCTM(context, 0.0f, CGRectGetHeight(view.frame)); 27 | CGContextScaleCTM(context, 1.0f, -1.0f); 28 | } 29 | 30 | // Create mask image 31 | NSRect maskRect = rect; 32 | CGImageRef maskImage = [self CGImageForProposedRect:&maskRect context:graphicsContext hints:nil]; 33 | 34 | // Draw image and white drop shadow 35 | CGContextSetShadowWithColor(context, CGSizeMake(0, dropShadowOffsetY), 0, CGColorGetConstantColor(kCGColorWhite)); 36 | [self drawInRect:maskRect fromRect:NSMakeRect(0, 0, self.size.width, self.size.height) operation:NSCompositeSourceOver fraction:0.5]; 37 | 38 | // Clip drawing to mask 39 | CGContextClipToMask(context, NSRectToCGRect(maskRect), maskImage); 40 | 41 | // Draw gradient 42 | NSColor *startColor; 43 | NSColor *endColor; 44 | if (highlighted) { 45 | startColor = [NSColor colorWithCalibratedRed:0.0 green:0.55 blue:0.98 alpha:1.0]; 46 | endColor = [NSColor colorWithCalibratedRed:0.0 green:0.15 blue:0.75 alpha:1.0]; 47 | } 48 | else { 49 | startColor = [NSColor colorWithDeviceWhite:0.33 alpha:1.0]; 50 | endColor = [NSColor colorWithDeviceWhite:0.46 alpha:1.0]; 51 | } 52 | if (!enabled) { 53 | startColor = [startColor colorWithAlphaComponent:0.5]; 54 | endColor = [endColor colorWithAlphaComponent:0.5]; 55 | } 56 | NSGradient *gradient = [[NSGradient alloc] initWithStartingColor:startColor endingColor:endColor]; 57 | [gradient drawInRect:maskRect angle:90.0]; 58 | 59 | // Draw inner shadow with inverted mask 60 | CGContextSetShadowWithColor(context, CGSizeMake(0, -1), innerShadowBlurRadius, [[NSColor colorWithCalibratedWhite:0.1 alpha:0.75] CGColor]); 61 | CGRect cgRect = CGRectMake( 0, 0, maskRect.size.width * scale, maskRect.size.height * scale); 62 | CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 63 | CGContextRef maskContext = CGBitmapContextCreate(NULL, deviceRect.size.width, deviceRect.size.height, 8, 0, colorSpace, (CGBitmapInfo)kCGImageAlphaPremultipliedLast); 64 | CGColorSpaceRelease(colorSpace); 65 | CGContextSetBlendMode(maskContext, kCGBlendModeXOR); 66 | CGContextDrawImage(maskContext, cgRect, maskImage); 67 | CGContextSetRGBFillColor(maskContext, 1.0, 1.0, 1.0, 1.0); 68 | CGContextFillRect(maskContext, cgRect); 69 | CGImageRef invertedMaskImage = CGBitmapContextCreateImage(maskContext); 70 | 71 | CGContextDrawImage(context, maskRect, invertedMaskImage); 72 | 73 | CGImageRelease(invertedMaskImage); 74 | CGContextRelease(maskContext); 75 | 76 | [graphicsContext restoreGraphicsState]; 77 | } 78 | 79 | @end 80 | -------------------------------------------------------------------------------- /PI Emoji Picker.xcodeproj/xcuserdata/akac.xcuserdatad/xcschemes/PI Emoji Picker.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 33 | 39 | 40 | 41 | 42 | 43 | 49 | 50 | 51 | 52 | 61 | 62 | 68 | 69 | 70 | 71 | 72 | 73 | 79 | 80 | 86 | 87 | 88 | 89 | 91 | 92 | 95 | 96 | 97 | -------------------------------------------------------------------------------- /Emoji Picker/PIEmojiPageView.m: -------------------------------------------------------------------------------- 1 | // 2 | // PIEmojiPageView.m 3 | // PI Emoji Picker 4 | // 5 | // Created by Alex Kac on 5/30/14. 6 | // Copyright (c) 2014 Web Information Solutions, Inc. All rights reserved. 7 | // 8 | 9 | #import "PIEmojiPageView.h" 10 | 11 | #define BACKSPACE_BUTTON_TAG 10 12 | #define BUTTON_FONT_SIZE 32 13 | 14 | @interface PIEmojiPageView () 15 | 16 | @property (nonatomic, assign) NSSize buttonSize; 17 | @property (nonatomic, retain) NSMutableArray *buttons; 18 | @property (nonatomic, assign) NSUInteger columns; 19 | @property (nonatomic, assign) NSUInteger rows; 20 | 21 | @end 22 | 23 | 24 | @implementation PIEmojiPageView 25 | 26 | - (void)drawRect:(NSRect)dirtyRect 27 | { 28 | [super drawRect:dirtyRect]; 29 | 30 | // [[NSColor redColor] setFill]; 31 | // NSRectFill(dirtyRect); 32 | } 33 | 34 | @synthesize buttonSize = buttonSize_; 35 | @synthesize buttons = buttons_; 36 | @synthesize columns = columns_; 37 | @synthesize rows = rows_; 38 | @synthesize delegate = delegate_; 39 | 40 | -(BOOL)isFlipped 41 | { 42 | return YES; 43 | } 44 | 45 | - (void)setButtonTexts:(NSMutableArray *)buttonTexts { 46 | NSAssert(buttonTexts != nil, @"Array containing texts to be set on buttons is nil"); 47 | 48 | if (([self.buttons count] - 1) == [buttonTexts count]) { 49 | // just reset text on each button 50 | 51 | [buttonTexts enumerateObjectsUsingBlock:^(NSString* title, NSUInteger idx, BOOL *stop) { 52 | ((NSButton*)(self.buttons[idx])).title = title; 53 | }]; 54 | } else { 55 | [self.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)]; 56 | self.buttons = nil; 57 | self.buttons = [NSMutableArray arrayWithCapacity:self.rows * self.columns]; 58 | 59 | for (NSUInteger i = 0; i < [buttonTexts count]; ++i) { 60 | NSButton *button = [self createButtonAtIndex:i]; 61 | [button setTitle:buttonTexts[i]]; 62 | [self addToViewButton:button]; 63 | } 64 | 65 | NSButton *button = [self createButtonAtIndex:self.rows * self.columns - 1]; 66 | [button setImage:[NSImage imageNamed:@"backspace_n"]]; 67 | button.tag = BACKSPACE_BUTTON_TAG; 68 | [self addToViewButton:button]; 69 | } 70 | } 71 | 72 | - (void)addToViewButton:(NSButton *)button { 73 | 74 | NSAssert(button != nil, @"Button to be added is nil"); 75 | 76 | [self.buttons addObject:button]; 77 | [self addSubview:button]; 78 | } 79 | 80 | // Padding is the expected space between two buttons. 81 | // Thus, space of top button = padding / 2 82 | // extra padding according to particular button's pos = pos * padding 83 | // Margin includes, size of buttons in between = pos * buttonSize 84 | // Thus, margin = padding / 2 85 | // + pos * padding 86 | // + pos * buttonSize 87 | 88 | - (CGFloat)XMarginForButtonInColumn:(NSInteger)column { 89 | CGFloat padding = ((CGRectGetWidth(self.bounds) - self.columns * self.buttonSize.width) / self.columns); 90 | return (padding / 2 + column * (padding + self.buttonSize.width)); 91 | } 92 | 93 | - (CGFloat)YMarginForButtonInRow:(NSInteger)rowNumber { 94 | CGFloat padding = ((CGRectGetHeight(self.bounds) - self.rows * self.buttonSize.height) / self.rows); 95 | return (padding / 2 + rowNumber * (padding + self.buttonSize.height)); 96 | } 97 | 98 | - (NSButton *)createButtonAtIndex:(NSUInteger)index { 99 | NSButton *button = [[NSButton alloc] initWithFrame: NSZeroRect]; 100 | [button setButtonType: NSMomentaryLightButton]; 101 | [button setBezelStyle: NSRoundedDisclosureBezelStyle]; 102 | [button setBordered: NO]; 103 | [button setTarget: self]; 104 | [button setAction: @selector(emojiButtonPressed:)]; 105 | [button.cell setImageScaling:NSImageScaleProportionallyDown]; 106 | 107 | button.font = [NSFont fontWithName:@"Apple color emoji" size:BUTTON_FONT_SIZE]; 108 | NSInteger row = (NSInteger)(index / self.columns); 109 | NSInteger column = (NSInteger)(index % self.columns); 110 | button.frame = CGRectIntegral(CGRectMake([self XMarginForButtonInColumn:column], 111 | [self YMarginForButtonInRow:row], 112 | self.buttonSize.width, 113 | self.buttonSize.height)); 114 | return button; 115 | } 116 | 117 | - (id)initWithFrame:(NSRect)frame buttonSize:(NSSize)buttonSize rows:(NSUInteger)rows columns:(NSUInteger)columns { 118 | self = [super initWithFrame:frame]; 119 | if (self) { 120 | self.buttonSize = buttonSize; 121 | self.columns = columns; 122 | self.rows = rows; 123 | self.buttons = [[NSMutableArray alloc] initWithCapacity:self.rows * columns]; 124 | } 125 | return self; 126 | } 127 | 128 | - (void)emojiButtonPressed:(NSButton *)button { 129 | if (button.tag == BACKSPACE_BUTTON_TAG) { 130 | [self.delegate emojiPageViewDidPressBackSpace:self]; 131 | return; 132 | } 133 | [self.delegate emojiPageView:self didUseEmoji: button.title]; 134 | } 135 | 136 | - (void)dealloc { 137 | self.buttons = nil; 138 | } 139 | 140 | 141 | @end 142 | -------------------------------------------------------------------------------- /Emoji Picker/EmojiView.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | -------------------------------------------------------------------------------- /Emoji Picker/PIEmojiKeyboardView.m: -------------------------------------------------------------------------------- 1 | // 2 | // PIEmojiKeyboardView.m 3 | // PI Emoji Picker 4 | // 5 | // Created by Alex Kac on 5/30/14. 6 | // Copyright (c) 2014 Web Information Solutions, Inc. All rights reserved. 7 | // 8 | 9 | #import "PIEmojiKeyboardView.h" 10 | #import "PIEmojiPageView.h" 11 | 12 | static const CGFloat ButtonWidth = 45; 13 | static const CGFloat ButtonHeight = 37; 14 | 15 | #define RECENT_EMOJIS_MAINTAINED_COUNT 50 16 | #define DEFAULT_SELECTED_SEGMENT 0 17 | 18 | static NSString *const segmentRecentName = @"Recent"; 19 | NSString *const RecentUsedEmojiCharactersKey = @"RecentUsedEmojiCharactersKey"; 20 | 21 | @interface PIEmojiKeyboardView () 22 | @property (nonatomic) NSDictionary *emojis; 23 | @property (weak) IBOutlet NSSegmentedControl *segmentsBar; 24 | @property (weak) IBOutlet NSScrollView *scrollView; 25 | @property (nonatomic) NSString *category; 26 | @end 27 | 28 | 29 | @implementation PIEmojiKeyboardView 30 | 31 | - (id)initWithFrame:(NSRect)frame 32 | { 33 | self = [super initWithFrame:frame]; 34 | if (self) { 35 | self.category = segmentRecentName; 36 | } 37 | return self; 38 | } 39 | 40 | - (instancetype)initWithCoder:(NSCoder *)coder 41 | { 42 | self = [super initWithCoder:coder]; 43 | if (self) { 44 | self.category = segmentRecentName; 45 | } 46 | return self; 47 | } 48 | 49 | - (NSDictionary *)emojis { 50 | if (!_emojis) { 51 | NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"EmojisList" 52 | ofType:@"plist"]; 53 | _emojis = [[NSDictionary dictionaryWithContentsOfFile:plistPath] copy]; 54 | } 55 | return _emojis; 56 | } 57 | 58 | // recent emojis are backed in NSUserDefaults to save them across app restarts. 59 | - (NSMutableArray *)recentEmojis { 60 | NSArray *emojis = [[NSUserDefaults standardUserDefaults] arrayForKey:RecentUsedEmojiCharactersKey]; 61 | NSMutableArray *recentEmojis = [emojis mutableCopy]; 62 | if (recentEmojis == nil) { 63 | recentEmojis = [NSMutableArray array]; 64 | } 65 | return recentEmojis; 66 | } 67 | 68 | - (void)setRecentEmojis:(NSMutableArray *)recentEmojis { 69 | // remove emojis if they cross the cache maintained limit 70 | if ([recentEmojis count] > RECENT_EMOJIS_MAINTAINED_COUNT) { 71 | NSIndexSet *indexesToBeRemoved = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(RECENT_EMOJIS_MAINTAINED_COUNT, [recentEmojis count] - RECENT_EMOJIS_MAINTAINED_COUNT)]; 72 | [recentEmojis removeObjectsAtIndexes:indexesToBeRemoved]; 73 | } 74 | [[NSUserDefaults standardUserDefaults] setObject:recentEmojis forKey:RecentUsedEmojiCharactersKey]; 75 | } 76 | 77 | - (NSArray*)imagesForSelectedSegments 78 | { 79 | return @[[NSImage imageNamed:@"recent_n"], 80 | [NSImage imageNamed:@"face_n"], 81 | [NSImage imageNamed:@"bell_n"], 82 | [NSImage imageNamed:@"flower_n"], 83 | [NSImage imageNamed:@"car_n"], 84 | [NSImage imageNamed:@"characters_n"]]; 85 | } 86 | 87 | - (void)_setupSegmentedControl 88 | { 89 | NSArray* images = self.imagesForSelectedSegments; 90 | [self.segmentsBar setSegmentCount:images.count]; 91 | 92 | [images enumerateObjectsUsingBlock:^(NSImage* image, NSUInteger idx, BOOL *stop) { 93 | NSSegmentedCell* cell = [self.segmentsBar cell]; 94 | [cell setImage:image forSegment:idx]; 95 | [cell setTag:idx forSegment:idx]; 96 | }]; 97 | 98 | [self setSelectedCategoryImageInSegmentControl:self.segmentsBar AtIndex:DEFAULT_SELECTED_SEGMENT]; 99 | self.segmentsBar.selectedSegment = DEFAULT_SELECTED_SEGMENT; 100 | 101 | [self.segmentsBar setFocusRingType:NSFocusRingTypeNone]; 102 | } 103 | 104 | -(void)layout 105 | { 106 | [super layout]; 107 | 108 | CGFloat width = self.bounds.size.width/self.segmentsBar.segmentCount; 109 | for (int index = 0; index < self.segmentsBar.segmentCount; ++index) 110 | [self.segmentsBar setWidth:width forSegment:index]; 111 | } 112 | 113 | -(void)awakeFromNib 114 | { 115 | [self _setupSegmentedControl]; 116 | [self setCurrentEmojiPageView]; 117 | } 118 | 119 | #pragma mark event handlers 120 | 121 | - (void)setSelectedCategoryImageInSegmentControl:(NSSegmentedControl *)segmentsBar AtIndex:(NSInteger)index { 122 | NSArray *imagesNamesForSelectedSegments = @[@"recent_s", 123 | @"face_s", 124 | @"bell_s", 125 | @"flower_s", 126 | @"car_s", 127 | @"characters_s"]; 128 | NSArray *imagesForNonSelectedSegments = @[[NSImage imageNamed:@"recent_n"], 129 | [NSImage imageNamed:@"face_n"], 130 | [NSImage imageNamed:@"bell_n"], 131 | [NSImage imageNamed:@"flower_n"], 132 | [NSImage imageNamed:@"car_n"], 133 | [NSImage imageNamed:@"characters_n"]]; 134 | 135 | for (int i=0; i < segmentsBar.segmentCount; ++i) { 136 | [[segmentsBar cell] setImage:imagesForNonSelectedSegments[i] forSegment:i]; 137 | } 138 | 139 | NSImage* selectedImage = [NSImage imageNamed: imagesNamesForSelectedSegments[index] ]; 140 | [[segmentsBar cell] setImage:selectedImage forSegment:index]; 141 | } 142 | 143 | - (IBAction)categoryChangedViaSegmentsBar:(NSSegmentedControl *)sender { 144 | // recalculate number of pages for new category and recreate emoji pages 145 | NSArray *categoryList = @[segmentRecentName, @"People", @"Objects", @"Nature", @"Places", @"Symbols"]; 146 | 147 | self.category = categoryList[sender.selectedSegment]; 148 | 149 | [self setSelectedCategoryImageInSegmentControl:sender AtIndex:sender.selectedSegment]; 150 | 151 | [self setCurrentEmojiPageView]; 152 | } 153 | 154 | // Set emoji page view for given index. 155 | - (void)setCurrentEmojiPageView { 156 | NSMutableArray *buttonTexts = [self emojiTextsForCategory:self.category]; 157 | NSUInteger columns = [self numberOfColumnsForFrameSize:self.scrollView.bounds.size]; 158 | NSUInteger rows = ceil(buttonTexts.count / columns) + 1; 159 | 160 | //set the height of this now 161 | NSRect thisBounds = self.scrollView.bounds; 162 | thisBounds.size.height = rows * ButtonHeight; 163 | 164 | PIEmojiPageView *pageView = [[PIEmojiPageView alloc] initWithFrame:thisBounds 165 | buttonSize:CGSizeMake(ButtonWidth, ButtonHeight) 166 | rows:rows 167 | columns:columns]; 168 | [pageView setButtonTexts:buttonTexts]; 169 | pageView.delegate = self; 170 | 171 | [self.scrollView setDocumentView:pageView]; 172 | } 173 | 174 | #pragma mark data methods 175 | 176 | - (NSUInteger)numberOfColumnsForFrameSize:(CGSize)frameSize { 177 | return (NSUInteger)floor(frameSize.width / ButtonWidth); 178 | } 179 | 180 | - (NSArray *)emojiListForCategory:(NSString *)category { 181 | if ([category isEqualToString:segmentRecentName]) { 182 | return [self recentEmojis]; 183 | } 184 | return [self.emojis objectForKey:category]; 185 | } 186 | 187 | // return the emojis for a category, given a staring and an ending index 188 | - (NSMutableArray *)emojiTextsForCategory:(NSString *)category 189 | { 190 | NSArray *emojis = [self emojiListForCategory:category]; 191 | return [emojis mutableCopy]; 192 | } 193 | 194 | #pragma mark EmojiPageViewDelegate 195 | 196 | - (void)setInRecentsEmoji:(NSString *)emoji { 197 | NSAssert(emoji != nil, @"Emoji can't be nil"); 198 | 199 | NSMutableArray *recentEmojis = [self recentEmojis]; 200 | for (int i = 0; i < [recentEmojis count]; ++i) { 201 | if ([recentEmojis[i] isEqualToString:emoji]) { 202 | [recentEmojis removeObjectAtIndex:i]; 203 | } 204 | } 205 | [recentEmojis insertObject:emoji atIndex:0]; 206 | [self setRecentEmojis:recentEmojis]; 207 | } 208 | 209 | // add the emoji to recents 210 | - (void)emojiPageView:(PIEmojiPageView *)emojiPageView didUseEmoji:(NSString *)emoji { 211 | [self setInRecentsEmoji:emoji]; 212 | [self.delegate emojiKeyDidUseEmoji:emoji]; 213 | } 214 | 215 | - (void)emojiPageViewDidPressBackSpace:(PIEmojiPageView *)emojiPageView { 216 | NSLog(@"Back button pressed"); 217 | [self.delegate emojiKeyBoardViewDidPressBackSpace]; 218 | } 219 | 220 | 221 | 222 | @end 223 | -------------------------------------------------------------------------------- /Emoji Picker/EmojisList.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Nature 6 | 7 | 🐶 8 | 🐺 9 | 🐱 10 | 🐭 11 | 🐹 12 | 🐰 13 | 🐸 14 | 🐯 15 | 🐨 16 | 🐻 17 | 🐷 18 | 🐽 19 | 🐮 20 | 🐗 21 | 🐵 22 | 🐒 23 | 🐴 24 | 🐑 25 | 🐘 26 | 🐼 27 | 🐧 28 | 🐦 29 | 🐤 30 | 🐥 31 | 🐣 32 | 🐔 33 | 🐍 34 | 🐢 35 | 🐛 36 | 🐝 37 | 🐜 38 | 🐞 39 | 🐌 40 | 🐙 41 | 🐚 42 | 🐠 43 | 🐟 44 | 🐬 45 | 🐳 46 | 🐋 47 | 🐄 48 | 🐏 49 | 🐀 50 | 🐃 51 | 🐅 52 | 🐇 53 | 🐉 54 | 🐎 55 | 🐐 56 | 🐓 57 | 🐕 58 | 🐖 59 | 🐁 60 | 🐂 61 | 🐲 62 | 🐡 63 | 🐊 64 | 🐫 65 | 🐪 66 | 🐆 67 | 🐈 68 | 🐩 69 | 🐾 70 | 💐 71 | 🌸 72 | 🌷 73 | 🍀 74 | 🌹 75 | 🌻 76 | 🌺 77 | 🍁 78 | 🍃 79 | 🍂 80 | 🌿 81 | 🌾 82 | 🍄 83 | 🌵 84 | 🌴 85 | 🌲 86 | 🌳 87 | 🌰 88 | 🌱 89 | 🌼 90 | 🌐 91 | 🌞 92 | 🌝 93 | 🌚 94 | 🌑 95 | 🌒 96 | 🌓 97 | 🌔 98 | 🌕 99 | 🌖 100 | 🌗 101 | 🌘 102 | 🌜 103 | 🌛 104 | 🌙 105 | 🌍 106 | 🌎 107 | 🌏 108 | 🌋 109 | 🌌 110 | 🌠 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 🌀 120 | 🌁 121 | 🌈 122 | 🌊 123 | 124 | Objects 125 | 126 | 🎍 127 | 💝 128 | 🎎 129 | 🎒 130 | 🎓 131 | 🎏 132 | 🎆 133 | 🎇 134 | 🎐 135 | 🎑 136 | 🎃 137 | 👻 138 | 🎅 139 | 🎄 140 | 🎁 141 | 🎋 142 | 🎉 143 | 🎊 144 | 🎈 145 | 🎌 146 | 🔮 147 | 🎥 148 | 📷 149 | 📹 150 | 📼 151 | 💿 152 | 📀 153 | 💽 154 | 💾 155 | 💻 156 | 📱 157 | 158 | 📞 159 | 📟 160 | 📠 161 | 📡 162 | 📺 163 | 📻 164 | 🔊 165 | 🔉 166 | 🔈 167 | 🔇 168 | 🔔 169 | 🔕 170 | 📢 171 | 📣 172 | 173 | 174 | 175 | 176 | 🔓 177 | 🔒 178 | 🔏 179 | 🔐 180 | 🔑 181 | 🔎 182 | 💡 183 | 🔦 184 | 🔆 185 | 🔅 186 | 🔌 187 | 🔋 188 | 🔍 189 | 🛁 190 | 🛀 191 | 🚿 192 | 🚽 193 | 🔧 194 | 🔩 195 | 🔨 196 | 🚪 197 | 🚬 198 | 💣 199 | 🔫 200 | 🔪 201 | 💊 202 | 💉 203 | 💰 204 | 💴 205 | 💵 206 | 💷 207 | 💶 208 | 💳 209 | 💸 210 | 📲 211 | 📧 212 | 📥 213 | 📤 214 | 215 | 📩 216 | 📨 217 | 📯 218 | 📫 219 | 📪 220 | 📬 221 | 📭 222 | 📮 223 | 📦 224 | 📝 225 | 📄 226 | 📃 227 | 📑 228 | 📊 229 | 📈 230 | 📉 231 | 📜 232 | 📋 233 | 📅 234 | 📆 235 | 📇 236 | 📁 237 | 📂 238 | 239 | 📌 240 | 📎 241 | 242 | 243 | 📏 244 | 📐 245 | 📕 246 | 📗 247 | 📘 248 | 📙 249 | 📓 250 | 📔 251 | 📒 252 | 📚 253 | 📖 254 | 🔖 255 | 📛 256 | 🔬 257 | 🔭 258 | 📰 259 | 🎨 260 | 🎬 261 | 🎤 262 | 🎧 263 | 🎼 264 | 🎵 265 | 🎶 266 | 🎹 267 | 🎻 268 | 🎺 269 | 🎷 270 | 🎸 271 | 👾 272 | 🎮 273 | 🃏 274 | 🎴 275 | 🀄 276 | 🎲 277 | 🎯 278 | 🏈 279 | 🏀 280 | 281 | 282 | 🎾 283 | 🎱 284 | 🏉 285 | 🎳 286 | 287 | 🚵 288 | 🚴 289 | 🏁 290 | 🏇 291 | 🏆 292 | 🎿 293 | 🏂 294 | 🏊 295 | 🏄 296 | 🎣 297 | 298 | 🍵 299 | 🍶 300 | 🍼 301 | 🍺 302 | 🍻 303 | 🍸 304 | 🍹 305 | 🍷 306 | 🍴 307 | 🍕 308 | 🍔 309 | 🍟 310 | 🍗 311 | 🍖 312 | 🍝 313 | 🍛 314 | 🍤 315 | 🍱 316 | 🍣 317 | 🍥 318 | 🍙 319 | 🍘 320 | 🍚 321 | 🍜 322 | 🍲 323 | 🍢 324 | 🍡 325 | 🍳 326 | 🍞 327 | 🍩 328 | 🍮 329 | 🍦 330 | 🍨 331 | 🍧 332 | 🎂 333 | 🍰 334 | 🍪 335 | 🍫 336 | 🍬 337 | 🍭 338 | 🍯 339 | 🍎 340 | 🍏 341 | 🍊 342 | 🍋 343 | 🍒 344 | 🍇 345 | 🍉 346 | 🍓 347 | 🍑 348 | 🍈 349 | 🍌 350 | 🍐 351 | 🍍 352 | 🍠 353 | 🍆 354 | 🍅 355 | 🌽 356 | 357 | People 358 | 359 | 😄 360 | 😃 361 | 😀 362 | 😊 363 | 364 | 😉 365 | 😍 366 | 😘 367 | 😚 368 | 😗 369 | 😙 370 | 😜 371 | 😝 372 | 😛 373 | 😳 374 | 😁 375 | 😔 376 | 😌 377 | 😒 378 | 😞 379 | 😣 380 | 😢 381 | 😂 382 | 😭 383 | 😪 384 | 😥 385 | 😰 386 | 😅 387 | 😓 388 | 😩 389 | 😫 390 | 😨 391 | 😱 392 | 😠 393 | 😡 394 | 😤 395 | 😖 396 | 😆 397 | 😋 398 | 😷 399 | 😎 400 | 😴 401 | 😵 402 | 😲 403 | 😟 404 | 😦 405 | 😧 406 | 😈 407 | 👿 408 | 😮 409 | 😬 410 | 😐 411 | 😕 412 | 😯 413 | 😶 414 | 😇 415 | 😏 416 | 😑 417 | 👲 418 | 👳 419 | 👮 420 | 👷 421 | 💂 422 | 👶 423 | 👦 424 | 👧 425 | 👨 426 | 👩 427 | 👴 428 | 👵 429 | 👱 430 | 👼 431 | 👸 432 | 😺 433 | 😸 434 | 😻 435 | 😽 436 | 😼 437 | 🙀 438 | 😿 439 | 😹 440 | 😾 441 | 👹 442 | 👺 443 | 🙈 444 | 🙉 445 | 🙊 446 | 💀 447 | 👽 448 | 💩 449 | 🔥 450 | 451 | 🌟 452 | 💫 453 | 💥 454 | 💢 455 | 💦 456 | 💧 457 | 💤 458 | 💨 459 | 👂 460 | 👀 461 | 👃 462 | 👅 463 | 👄 464 | 👍 465 | 👎 466 | 👌 467 | 👊 468 | 469 | 470 | 👋 471 | 472 | 👐 473 | 👆 474 | 👇 475 | 👉 476 | 👈 477 | 🙌 478 | 🙏 479 | 480 | 👏 481 | 💪 482 | 🚶 483 | 🏃 484 | 💃 485 | 👫 486 | 👪 487 | 👬 488 | 👭 489 | 💏 490 | 💑 491 | 👯 492 | 🙆 493 | 🙅 494 | 💁 495 | 🙋 496 | 💆 497 | 💇 498 | 💅 499 | 👰 500 | 🙎 501 | 🙍 502 | 🙇 503 | 🎩 504 | 👑 505 | 👒 506 | 👟 507 | 👞 508 | 👡 509 | 👠 510 | 👢 511 | 👕 512 | 👔 513 | 👚 514 | 👗 515 | 🎽 516 | 👖 517 | 👘 518 | 👙 519 | 💼 520 | 👜 521 | 👝 522 | 👛 523 | 👓 524 | 🎀 525 | 🌂 526 | 💄 527 | 💛 528 | 💙 529 | 💜 530 | 💚 531 | 532 | 💔 533 | 💗 534 | 💓 535 | 💕 536 | 💖 537 | 💞 538 | 💘 539 | 💌 540 | 💋 541 | 💍 542 | 💎 543 | 👤 544 | 👥 545 | 💬 546 | 👣 547 | 💭 548 | 549 | Places 550 | 551 | 🏠 552 | 🏡 553 | 🏫 554 | 🏢 555 | 🏣 556 | 🏥 557 | 🏦 558 | 🏪 559 | 🏩 560 | 🏨 561 | 💒 562 | 563 | 🏬 564 | 🏤 565 | 🌇 566 | 🌆 567 | 🏯 568 | 🏰 569 | 570 | 🏭 571 | 🗼 572 | 🗾 573 | 🗻 574 | 🌄 575 | 🌅 576 | 🌃 577 | 🗽 578 | 🌉 579 | 🎠 580 | 🎡 581 | 582 | 🎢 583 | 🚢 584 | 585 | 🚤 586 | 🚣 587 | 588 | 🚀 589 | 590 | 💺 591 | 🚁 592 | 🚂 593 | 🚊 594 | 🚉 595 | 🚞 596 | 🚆 597 | 🚄 598 | 🚅 599 | 🚈 600 | 🚇 601 | 🚝 602 | 🚋 603 | 🚃 604 | 🚎 605 | 🚌 606 | 🚍 607 | 🚙 608 | 🚘 609 | 🚗 610 | 🚕 611 | 🚖 612 | 🚛 613 | 🚚 614 | 🚨 615 | 🚓 616 | 🚔 617 | 🚒 618 | 🚑 619 | 🚐 620 | 🚲 621 | 🚡 622 | 🚟 623 | 🚠 624 | 🚜 625 | 💈 626 | 🚏 627 | 🎫 628 | 🚦 629 | 🚥 630 | 631 | 🚧 632 | 🔰 633 | 634 | 🏮 635 | 🎰 636 | 637 | 🗿 638 | 🎪 639 | 🎭 640 | 📍 641 | 🚩 642 | 🇯🇵 643 | 🇰🇷 644 | 🇩🇪 645 | 🇨🇳 646 | 🇺🇸 647 | 🇫🇷 648 | 🇪🇸 649 | 🇮🇹 650 | 🇷🇺 651 | 652 | Symbols 653 | 654 | 1⃣ 655 | 2⃣ 656 | 3⃣ 657 | 4⃣ 658 | 5⃣ 659 | 6⃣ 660 | 7⃣ 661 | 8⃣ 662 | 9⃣ 663 | 0⃣ 664 | 🔟 665 | 🔢 666 | #⃣ 667 | 🔣 668 | 669 | 670 | 671 | 672 | 🔠 673 | 🔡 674 | 🔤 675 | 676 | 677 | 678 | 679 | 680 | 681 | 🔄 682 | 683 | 684 | 🔼 685 | 🔽 686 | 687 | 688 | 689 | 690 | 691 | 692 | 693 | 694 | 695 | 🆗 696 | 🔀 697 | 🔁 698 | 🔂 699 | 🆕 700 | 🆙 701 | 🆒 702 | 🆓 703 | 🆖 704 | 📶 705 | 🎦 706 | 🈁 707 | 🈯 708 | 🈳 709 | 🈵 710 | 🈴 711 | 🈲 712 | 🉐 713 | 🈹 714 | 🈺 715 | 🈶 716 | 🈚 717 | 🚻 718 | 🚹 719 | 🚺 720 | 🚼 721 | 🚾 722 | 🚰 723 | 🚮 724 | 🅿 725 | 726 | 🚭 727 | 🈷 728 | 🈸 729 | 🈂 730 | 731 | 🛂 732 | 🛄 733 | 🛅 734 | 🛃 735 | 🉑 736 | 737 | 738 | 🆑 739 | 🆘 740 | 🆔 741 | 🚫 742 | 🔞 743 | 📵 744 | 🚯 745 | 🚱 746 | 🚳 747 | 🚷 748 | 🚸 749 | 750 | 751 | 752 | 753 | 754 | 755 | 💟 756 | 🆚 757 | 📳 758 | 📴 759 | 🅰 760 | 🅱 761 | 🆎 762 | 🅾 763 | 💠 764 | 765 | 766 | 767 | 768 | 769 | 770 | 771 | 772 | 773 | 774 | 775 | 776 | 777 | 778 | 779 | 🔯 780 | 🏧 781 | 💹 782 | 💲 783 | 💱 784 | © 785 | ® 786 | 787 | 788 | 789 | 790 | 791 | 792 | 793 | 794 | 795 | 🔝 796 | 🔚 797 | 🔙 798 | 🔛 799 | 🔜 800 | 🔃 801 | 🕛 802 | 🕧 803 | 🕐 804 | 🕜 805 | 🕑 806 | 🕝 807 | 🕒 808 | 🕞 809 | 🕓 810 | 🕟 811 | 🕔 812 | 🕠 813 | 🕕 814 | 🕖 815 | 🕗 816 | 🕘 817 | 🕙 818 | 🕚 819 | 🕡 820 | 🕢 821 | 🕣 822 | 🕤 823 | 🕥 824 | 🕦 825 | 826 | 827 | 828 | 829 | 830 | 831 | 832 | 833 | 💮 834 | 💯 835 | 836 | 837 | 🔘 838 | 🔗 839 | 840 | 841 | 842 | 🔱 843 | 844 | 845 | 846 | 847 | 848 | 849 | 🔺 850 | 🔲 851 | 🔳 852 | 853 | 854 | 🔴 855 | 🔵 856 | 🔻 857 | 858 | 859 | 🔶 860 | 🔷 861 | 🔸 862 | 🔹 863 | 864 | 865 | 866 | -------------------------------------------------------------------------------- /PI Emoji Picker.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 4049123A1937BBEB0087BC2F /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 404912391937BBEB0087BC2F /* Cocoa.framework */; }; 11 | 404912441937BBEB0087BC2F /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 404912421937BBEB0087BC2F /* InfoPlist.strings */; }; 12 | 404912461937BBEB0087BC2F /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 404912451937BBEB0087BC2F /* main.m */; }; 13 | 4049124A1937BBEB0087BC2F /* Credits.rtf in Resources */ = {isa = PBXBuildFile; fileRef = 404912481937BBEB0087BC2F /* Credits.rtf */; }; 14 | 4049124D1937BBEB0087BC2F /* PIAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 4049124C1937BBEB0087BC2F /* PIAppDelegate.m */; }; 15 | 404912501937BBEB0087BC2F /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4049124E1937BBEB0087BC2F /* MainMenu.xib */; }; 16 | 404912521937BBEB0087BC2F /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 404912511937BBEB0087BC2F /* Images.xcassets */; }; 17 | 404912591937BBEB0087BC2F /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 404912581937BBEB0087BC2F /* XCTest.framework */; }; 18 | 4049125A1937BBEB0087BC2F /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 404912391937BBEB0087BC2F /* Cocoa.framework */; }; 19 | 4049126F1937F9300087BC2F /* PIEmojiViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4049126E1937F9300087BC2F /* PIEmojiViewController.m */; }; 20 | 406D2ACD19399F29002E1413 /* EmojisList.plist in Resources */ = {isa = PBXBuildFile; fileRef = 406D2AC719399F29002E1413 /* EmojisList.plist */; }; 21 | 406D2ACE19399F29002E1413 /* EmojiView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 406D2AC819399F29002E1413 /* EmojiView.xib */; }; 22 | 406D2ACF19399F29002E1413 /* PIEmojiKeyboardView.m in Sources */ = {isa = PBXBuildFile; fileRef = 406D2ACA19399F29002E1413 /* PIEmojiKeyboardView.m */; }; 23 | 406D2AD019399F29002E1413 /* PIEmojiPageView.m in Sources */ = {isa = PBXBuildFile; fileRef = 406D2ACC19399F29002E1413 /* PIEmojiPageView.m */; }; 24 | 406D2AD219399F42002E1413 /* EmojiView.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 406D2AD119399F42002E1413 /* EmojiView.xcassets */; }; 25 | 40CCD348193D8011004A027F /* RPBorderlessSegmentedCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 40CCD345193D8011004A027F /* RPBorderlessSegmentedCell.m */; }; 26 | 40CCD349193D8011004A027F /* RPBorderlessSegmentedControl.m in Sources */ = {isa = PBXBuildFile; fileRef = 40CCD347193D8011004A027F /* RPBorderlessSegmentedControl.m */; }; 27 | 40CCD34C193D8052004A027F /* NSImage+DrawAsTemplate.m in Sources */ = {isa = PBXBuildFile; fileRef = 40CCD34B193D8052004A027F /* NSImage+DrawAsTemplate.m */; }; 28 | /* End PBXBuildFile section */ 29 | 30 | /* Begin PBXContainerItemProxy section */ 31 | 4049125B1937BBEB0087BC2F /* PBXContainerItemProxy */ = { 32 | isa = PBXContainerItemProxy; 33 | containerPortal = 4049122E1937BBEB0087BC2F /* Project object */; 34 | proxyType = 1; 35 | remoteGlobalIDString = 404912351937BBEB0087BC2F; 36 | remoteInfo = "PI Emoji Picker"; 37 | }; 38 | /* End PBXContainerItemProxy section */ 39 | 40 | /* Begin PBXFileReference section */ 41 | 404912361937BBEB0087BC2F /* PI Emoji Picker.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "PI Emoji Picker.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 42 | 404912391937BBEB0087BC2F /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; 43 | 4049123C1937BBEB0087BC2F /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; }; 44 | 4049123D1937BBEB0087BC2F /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = System/Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; }; 45 | 4049123E1937BBEB0087BC2F /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 46 | 404912411937BBEB0087BC2F /* PI Emoji Picker-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "PI Emoji Picker-Info.plist"; sourceTree = ""; }; 47 | 404912431937BBEB0087BC2F /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 48 | 404912451937BBEB0087BC2F /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 49 | 404912471937BBEB0087BC2F /* PI Emoji Picker-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "PI Emoji Picker-Prefix.pch"; sourceTree = ""; }; 50 | 404912491937BBEB0087BC2F /* en */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; name = en; path = en.lproj/Credits.rtf; sourceTree = ""; }; 51 | 4049124B1937BBEB0087BC2F /* PIAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PIAppDelegate.h; sourceTree = ""; }; 52 | 4049124C1937BBEB0087BC2F /* PIAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PIAppDelegate.m; sourceTree = ""; }; 53 | 4049124F1937BBEB0087BC2F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; 54 | 404912511937BBEB0087BC2F /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 55 | 404912571937BBEB0087BC2F /* PI Emoji PickerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "PI Emoji PickerTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 56 | 404912581937BBEB0087BC2F /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; 57 | 4049126D1937F9300087BC2F /* PIEmojiViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PIEmojiViewController.h; sourceTree = ""; }; 58 | 4049126E1937F9300087BC2F /* PIEmojiViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PIEmojiViewController.m; sourceTree = ""; }; 59 | 406D2AC719399F29002E1413 /* EmojisList.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = EmojisList.plist; path = "Emoji Picker/EmojisList.plist"; sourceTree = SOURCE_ROOT; }; 60 | 406D2AC819399F29002E1413 /* EmojiView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = EmojiView.xib; path = "Emoji Picker/EmojiView.xib"; sourceTree = SOURCE_ROOT; }; 61 | 406D2AC919399F29002E1413 /* PIEmojiKeyboardView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PIEmojiKeyboardView.h; path = "Emoji Picker/PIEmojiKeyboardView.h"; sourceTree = SOURCE_ROOT; }; 62 | 406D2ACA19399F29002E1413 /* PIEmojiKeyboardView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = PIEmojiKeyboardView.m; path = "Emoji Picker/PIEmojiKeyboardView.m"; sourceTree = SOURCE_ROOT; }; 63 | 406D2ACB19399F29002E1413 /* PIEmojiPageView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PIEmojiPageView.h; path = "Emoji Picker/PIEmojiPageView.h"; sourceTree = SOURCE_ROOT; }; 64 | 406D2ACC19399F29002E1413 /* PIEmojiPageView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = PIEmojiPageView.m; path = "Emoji Picker/PIEmojiPageView.m"; sourceTree = SOURCE_ROOT; }; 65 | 406D2AD119399F42002E1413 /* EmojiView.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = EmojiView.xcassets; path = "Emoji Picker/EmojiView.xcassets"; sourceTree = SOURCE_ROOT; }; 66 | 40CCD344193D8011004A027F /* RPBorderlessSegmentedCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RPBorderlessSegmentedCell.h; sourceTree = ""; }; 67 | 40CCD345193D8011004A027F /* RPBorderlessSegmentedCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RPBorderlessSegmentedCell.m; sourceTree = ""; }; 68 | 40CCD346193D8011004A027F /* RPBorderlessSegmentedControl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RPBorderlessSegmentedControl.h; sourceTree = ""; }; 69 | 40CCD347193D8011004A027F /* RPBorderlessSegmentedControl.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RPBorderlessSegmentedControl.m; sourceTree = ""; }; 70 | 40CCD34A193D8052004A027F /* NSImage+DrawAsTemplate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSImage+DrawAsTemplate.h"; sourceTree = ""; }; 71 | 40CCD34B193D8052004A027F /* NSImage+DrawAsTemplate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSImage+DrawAsTemplate.m"; sourceTree = ""; }; 72 | /* End PBXFileReference section */ 73 | 74 | /* Begin PBXFrameworksBuildPhase section */ 75 | 404912331937BBEB0087BC2F /* Frameworks */ = { 76 | isa = PBXFrameworksBuildPhase; 77 | buildActionMask = 2147483647; 78 | files = ( 79 | 4049123A1937BBEB0087BC2F /* Cocoa.framework in Frameworks */, 80 | ); 81 | runOnlyForDeploymentPostprocessing = 0; 82 | }; 83 | 404912541937BBEB0087BC2F /* Frameworks */ = { 84 | isa = PBXFrameworksBuildPhase; 85 | buildActionMask = 2147483647; 86 | files = ( 87 | 4049125A1937BBEB0087BC2F /* Cocoa.framework in Frameworks */, 88 | 404912591937BBEB0087BC2F /* XCTest.framework in Frameworks */, 89 | ); 90 | runOnlyForDeploymentPostprocessing = 0; 91 | }; 92 | /* End PBXFrameworksBuildPhase section */ 93 | 94 | /* Begin PBXGroup section */ 95 | 4049122D1937BBEB0087BC2F = { 96 | isa = PBXGroup; 97 | children = ( 98 | 404912A1193901550087BC2F /* Emoji Picker */, 99 | 4049123F1937BBEB0087BC2F /* Example App */, 100 | 404912381937BBEB0087BC2F /* Frameworks */, 101 | 404912371937BBEB0087BC2F /* Products */, 102 | ); 103 | sourceTree = ""; 104 | }; 105 | 404912371937BBEB0087BC2F /* Products */ = { 106 | isa = PBXGroup; 107 | children = ( 108 | 404912361937BBEB0087BC2F /* PI Emoji Picker.app */, 109 | 404912571937BBEB0087BC2F /* PI Emoji PickerTests.xctest */, 110 | ); 111 | name = Products; 112 | sourceTree = ""; 113 | }; 114 | 404912381937BBEB0087BC2F /* Frameworks */ = { 115 | isa = PBXGroup; 116 | children = ( 117 | 404912391937BBEB0087BC2F /* Cocoa.framework */, 118 | 404912581937BBEB0087BC2F /* XCTest.framework */, 119 | 4049123B1937BBEB0087BC2F /* Other Frameworks */, 120 | ); 121 | name = Frameworks; 122 | sourceTree = ""; 123 | }; 124 | 4049123B1937BBEB0087BC2F /* Other Frameworks */ = { 125 | isa = PBXGroup; 126 | children = ( 127 | 4049123C1937BBEB0087BC2F /* AppKit.framework */, 128 | 4049123D1937BBEB0087BC2F /* CoreData.framework */, 129 | 4049123E1937BBEB0087BC2F /* Foundation.framework */, 130 | ); 131 | name = "Other Frameworks"; 132 | sourceTree = ""; 133 | }; 134 | 4049123F1937BBEB0087BC2F /* Example App */ = { 135 | isa = PBXGroup; 136 | children = ( 137 | 4049124B1937BBEB0087BC2F /* PIAppDelegate.h */, 138 | 4049124C1937BBEB0087BC2F /* PIAppDelegate.m */, 139 | 4049126D1937F9300087BC2F /* PIEmojiViewController.h */, 140 | 4049126E1937F9300087BC2F /* PIEmojiViewController.m */, 141 | 4049124E1937BBEB0087BC2F /* MainMenu.xib */, 142 | 404912511937BBEB0087BC2F /* Images.xcassets */, 143 | 404912401937BBEB0087BC2F /* Supporting Files */, 144 | ); 145 | name = "Example App"; 146 | path = "PI Emoji Picker"; 147 | sourceTree = ""; 148 | }; 149 | 404912401937BBEB0087BC2F /* Supporting Files */ = { 150 | isa = PBXGroup; 151 | children = ( 152 | 404912411937BBEB0087BC2F /* PI Emoji Picker-Info.plist */, 153 | 404912421937BBEB0087BC2F /* InfoPlist.strings */, 154 | 404912451937BBEB0087BC2F /* main.m */, 155 | 404912471937BBEB0087BC2F /* PI Emoji Picker-Prefix.pch */, 156 | 404912481937BBEB0087BC2F /* Credits.rtf */, 157 | ); 158 | name = "Supporting Files"; 159 | sourceTree = ""; 160 | }; 161 | 404912A1193901550087BC2F /* Emoji Picker */ = { 162 | isa = PBXGroup; 163 | children = ( 164 | 406D2AC719399F29002E1413 /* EmojisList.plist */, 165 | 406D2AC819399F29002E1413 /* EmojiView.xib */, 166 | 406D2AC919399F29002E1413 /* PIEmojiKeyboardView.h */, 167 | 406D2ACA19399F29002E1413 /* PIEmojiKeyboardView.m */, 168 | 406D2ACB19399F29002E1413 /* PIEmojiPageView.h */, 169 | 406D2ACC19399F29002E1413 /* PIEmojiPageView.m */, 170 | 406D2AD119399F42002E1413 /* EmojiView.xcassets */, 171 | 40CCD343193D8011004A027F /* RPBorderlessSegmented */, 172 | ); 173 | name = "Emoji Picker"; 174 | path = "PI Emoji Picker"; 175 | sourceTree = ""; 176 | }; 177 | 40CCD343193D8011004A027F /* RPBorderlessSegmented */ = { 178 | isa = PBXGroup; 179 | children = ( 180 | 40CCD34A193D8052004A027F /* NSImage+DrawAsTemplate.h */, 181 | 40CCD34B193D8052004A027F /* NSImage+DrawAsTemplate.m */, 182 | 40CCD344193D8011004A027F /* RPBorderlessSegmentedCell.h */, 183 | 40CCD345193D8011004A027F /* RPBorderlessSegmentedCell.m */, 184 | 40CCD346193D8011004A027F /* RPBorderlessSegmentedControl.h */, 185 | 40CCD347193D8011004A027F /* RPBorderlessSegmentedControl.m */, 186 | ); 187 | name = RPBorderlessSegmented; 188 | path = "Emoji Picker/RPBorderlessSegmented"; 189 | sourceTree = SOURCE_ROOT; 190 | }; 191 | /* End PBXGroup section */ 192 | 193 | /* Begin PBXNativeTarget section */ 194 | 404912351937BBEB0087BC2F /* PI Emoji Picker */ = { 195 | isa = PBXNativeTarget; 196 | buildConfigurationList = 404912671937BBEB0087BC2F /* Build configuration list for PBXNativeTarget "PI Emoji Picker" */; 197 | buildPhases = ( 198 | 404912321937BBEB0087BC2F /* Sources */, 199 | 404912331937BBEB0087BC2F /* Frameworks */, 200 | 404912341937BBEB0087BC2F /* Resources */, 201 | ); 202 | buildRules = ( 203 | ); 204 | dependencies = ( 205 | ); 206 | name = "PI Emoji Picker"; 207 | productName = "PI Emoji Picker"; 208 | productReference = 404912361937BBEB0087BC2F /* PI Emoji Picker.app */; 209 | productType = "com.apple.product-type.application"; 210 | }; 211 | 404912561937BBEB0087BC2F /* PI Emoji PickerTests */ = { 212 | isa = PBXNativeTarget; 213 | buildConfigurationList = 4049126A1937BBEB0087BC2F /* Build configuration list for PBXNativeTarget "PI Emoji PickerTests" */; 214 | buildPhases = ( 215 | 404912531937BBEB0087BC2F /* Sources */, 216 | 404912541937BBEB0087BC2F /* Frameworks */, 217 | 404912551937BBEB0087BC2F /* Resources */, 218 | ); 219 | buildRules = ( 220 | ); 221 | dependencies = ( 222 | 4049125C1937BBEB0087BC2F /* PBXTargetDependency */, 223 | ); 224 | name = "PI Emoji PickerTests"; 225 | productName = "PI Emoji PickerTests"; 226 | productReference = 404912571937BBEB0087BC2F /* PI Emoji PickerTests.xctest */; 227 | productType = "com.apple.product-type.bundle.unit-test"; 228 | }; 229 | /* End PBXNativeTarget section */ 230 | 231 | /* Begin PBXProject section */ 232 | 4049122E1937BBEB0087BC2F /* Project object */ = { 233 | isa = PBXProject; 234 | attributes = { 235 | CLASSPREFIX = PI; 236 | LastUpgradeCheck = 0510; 237 | ORGANIZATIONNAME = "Web Information Solutions, Inc."; 238 | TargetAttributes = { 239 | 404912561937BBEB0087BC2F = { 240 | TestTargetID = 404912351937BBEB0087BC2F; 241 | }; 242 | }; 243 | }; 244 | buildConfigurationList = 404912311937BBEB0087BC2F /* Build configuration list for PBXProject "PI Emoji Picker" */; 245 | compatibilityVersion = "Xcode 3.2"; 246 | developmentRegion = English; 247 | hasScannedForEncodings = 0; 248 | knownRegions = ( 249 | en, 250 | Base, 251 | ); 252 | mainGroup = 4049122D1937BBEB0087BC2F; 253 | productRefGroup = 404912371937BBEB0087BC2F /* Products */; 254 | projectDirPath = ""; 255 | projectRoot = ""; 256 | targets = ( 257 | 404912351937BBEB0087BC2F /* PI Emoji Picker */, 258 | 404912561937BBEB0087BC2F /* PI Emoji PickerTests */, 259 | ); 260 | }; 261 | /* End PBXProject section */ 262 | 263 | /* Begin PBXResourcesBuildPhase section */ 264 | 404912341937BBEB0087BC2F /* Resources */ = { 265 | isa = PBXResourcesBuildPhase; 266 | buildActionMask = 2147483647; 267 | files = ( 268 | 406D2AD219399F42002E1413 /* EmojiView.xcassets in Resources */, 269 | 406D2ACD19399F29002E1413 /* EmojisList.plist in Resources */, 270 | 404912441937BBEB0087BC2F /* InfoPlist.strings in Resources */, 271 | 404912521937BBEB0087BC2F /* Images.xcassets in Resources */, 272 | 4049124A1937BBEB0087BC2F /* Credits.rtf in Resources */, 273 | 404912501937BBEB0087BC2F /* MainMenu.xib in Resources */, 274 | 406D2ACE19399F29002E1413 /* EmojiView.xib in Resources */, 275 | ); 276 | runOnlyForDeploymentPostprocessing = 0; 277 | }; 278 | 404912551937BBEB0087BC2F /* Resources */ = { 279 | isa = PBXResourcesBuildPhase; 280 | buildActionMask = 2147483647; 281 | files = ( 282 | ); 283 | runOnlyForDeploymentPostprocessing = 0; 284 | }; 285 | /* End PBXResourcesBuildPhase section */ 286 | 287 | /* Begin PBXSourcesBuildPhase section */ 288 | 404912321937BBEB0087BC2F /* Sources */ = { 289 | isa = PBXSourcesBuildPhase; 290 | buildActionMask = 2147483647; 291 | files = ( 292 | 40CCD34C193D8052004A027F /* NSImage+DrawAsTemplate.m in Sources */, 293 | 404912461937BBEB0087BC2F /* main.m in Sources */, 294 | 406D2ACF19399F29002E1413 /* PIEmojiKeyboardView.m in Sources */, 295 | 4049126F1937F9300087BC2F /* PIEmojiViewController.m in Sources */, 296 | 40CCD349193D8011004A027F /* RPBorderlessSegmentedControl.m in Sources */, 297 | 40CCD348193D8011004A027F /* RPBorderlessSegmentedCell.m in Sources */, 298 | 406D2AD019399F29002E1413 /* PIEmojiPageView.m in Sources */, 299 | 4049124D1937BBEB0087BC2F /* PIAppDelegate.m in Sources */, 300 | ); 301 | runOnlyForDeploymentPostprocessing = 0; 302 | }; 303 | 404912531937BBEB0087BC2F /* Sources */ = { 304 | isa = PBXSourcesBuildPhase; 305 | buildActionMask = 2147483647; 306 | files = ( 307 | ); 308 | runOnlyForDeploymentPostprocessing = 0; 309 | }; 310 | /* End PBXSourcesBuildPhase section */ 311 | 312 | /* Begin PBXTargetDependency section */ 313 | 4049125C1937BBEB0087BC2F /* PBXTargetDependency */ = { 314 | isa = PBXTargetDependency; 315 | target = 404912351937BBEB0087BC2F /* PI Emoji Picker */; 316 | targetProxy = 4049125B1937BBEB0087BC2F /* PBXContainerItemProxy */; 317 | }; 318 | /* End PBXTargetDependency section */ 319 | 320 | /* Begin PBXVariantGroup section */ 321 | 404912421937BBEB0087BC2F /* InfoPlist.strings */ = { 322 | isa = PBXVariantGroup; 323 | children = ( 324 | 404912431937BBEB0087BC2F /* en */, 325 | ); 326 | name = InfoPlist.strings; 327 | sourceTree = ""; 328 | }; 329 | 404912481937BBEB0087BC2F /* Credits.rtf */ = { 330 | isa = PBXVariantGroup; 331 | children = ( 332 | 404912491937BBEB0087BC2F /* en */, 333 | ); 334 | name = Credits.rtf; 335 | sourceTree = ""; 336 | }; 337 | 4049124E1937BBEB0087BC2F /* MainMenu.xib */ = { 338 | isa = PBXVariantGroup; 339 | children = ( 340 | 4049124F1937BBEB0087BC2F /* Base */, 341 | ); 342 | name = MainMenu.xib; 343 | sourceTree = ""; 344 | }; 345 | /* End PBXVariantGroup section */ 346 | 347 | /* Begin XCBuildConfiguration section */ 348 | 404912651937BBEB0087BC2F /* Debug */ = { 349 | isa = XCBuildConfiguration; 350 | buildSettings = { 351 | ALWAYS_SEARCH_USER_PATHS = NO; 352 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 353 | CLANG_CXX_LIBRARY = "libc++"; 354 | CLANG_ENABLE_MODULES = YES; 355 | CLANG_ENABLE_OBJC_ARC = YES; 356 | CLANG_WARN_BOOL_CONVERSION = YES; 357 | CLANG_WARN_CONSTANT_CONVERSION = YES; 358 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 359 | CLANG_WARN_EMPTY_BODY = YES; 360 | CLANG_WARN_ENUM_CONVERSION = YES; 361 | CLANG_WARN_INT_CONVERSION = YES; 362 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 363 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 364 | COPY_PHASE_STRIP = NO; 365 | GCC_C_LANGUAGE_STANDARD = gnu99; 366 | GCC_DYNAMIC_NO_PIC = NO; 367 | GCC_ENABLE_OBJC_EXCEPTIONS = YES; 368 | GCC_OPTIMIZATION_LEVEL = 0; 369 | GCC_PREPROCESSOR_DEFINITIONS = ( 370 | "DEBUG=1", 371 | "$(inherited)", 372 | ); 373 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 374 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 375 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 376 | GCC_WARN_UNDECLARED_SELECTOR = YES; 377 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 378 | GCC_WARN_UNUSED_FUNCTION = YES; 379 | GCC_WARN_UNUSED_VARIABLE = YES; 380 | MACOSX_DEPLOYMENT_TARGET = 10.9; 381 | ONLY_ACTIVE_ARCH = YES; 382 | SDKROOT = macosx; 383 | }; 384 | name = Debug; 385 | }; 386 | 404912661937BBEB0087BC2F /* Release */ = { 387 | isa = XCBuildConfiguration; 388 | buildSettings = { 389 | ALWAYS_SEARCH_USER_PATHS = NO; 390 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 391 | CLANG_CXX_LIBRARY = "libc++"; 392 | CLANG_ENABLE_MODULES = YES; 393 | CLANG_ENABLE_OBJC_ARC = YES; 394 | CLANG_WARN_BOOL_CONVERSION = YES; 395 | CLANG_WARN_CONSTANT_CONVERSION = YES; 396 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 397 | CLANG_WARN_EMPTY_BODY = YES; 398 | CLANG_WARN_ENUM_CONVERSION = YES; 399 | CLANG_WARN_INT_CONVERSION = YES; 400 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 401 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 402 | COPY_PHASE_STRIP = YES; 403 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 404 | ENABLE_NS_ASSERTIONS = NO; 405 | GCC_C_LANGUAGE_STANDARD = gnu99; 406 | GCC_ENABLE_OBJC_EXCEPTIONS = YES; 407 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 408 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 409 | GCC_WARN_UNDECLARED_SELECTOR = YES; 410 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 411 | GCC_WARN_UNUSED_FUNCTION = YES; 412 | GCC_WARN_UNUSED_VARIABLE = YES; 413 | MACOSX_DEPLOYMENT_TARGET = 10.9; 414 | SDKROOT = macosx; 415 | }; 416 | name = Release; 417 | }; 418 | 404912681937BBEB0087BC2F /* Debug */ = { 419 | isa = XCBuildConfiguration; 420 | buildSettings = { 421 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 422 | COMBINE_HIDPI_IMAGES = YES; 423 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 424 | GCC_PREFIX_HEADER = "PI Emoji Picker/PI Emoji Picker-Prefix.pch"; 425 | INFOPLIST_FILE = "PI Emoji Picker/PI Emoji Picker-Info.plist"; 426 | PRODUCT_NAME = "$(TARGET_NAME)"; 427 | WRAPPER_EXTENSION = app; 428 | }; 429 | name = Debug; 430 | }; 431 | 404912691937BBEB0087BC2F /* Release */ = { 432 | isa = XCBuildConfiguration; 433 | buildSettings = { 434 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 435 | COMBINE_HIDPI_IMAGES = YES; 436 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 437 | GCC_PREFIX_HEADER = "PI Emoji Picker/PI Emoji Picker-Prefix.pch"; 438 | INFOPLIST_FILE = "PI Emoji Picker/PI Emoji Picker-Info.plist"; 439 | PRODUCT_NAME = "$(TARGET_NAME)"; 440 | WRAPPER_EXTENSION = app; 441 | }; 442 | name = Release; 443 | }; 444 | 4049126B1937BBEB0087BC2F /* Debug */ = { 445 | isa = XCBuildConfiguration; 446 | buildSettings = { 447 | BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/PI Emoji Picker.app/Contents/MacOS/PI Emoji Picker"; 448 | COMBINE_HIDPI_IMAGES = YES; 449 | FRAMEWORK_SEARCH_PATHS = ( 450 | "$(DEVELOPER_FRAMEWORKS_DIR)", 451 | "$(inherited)", 452 | ); 453 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 454 | GCC_PREFIX_HEADER = "PI Emoji Picker/PI Emoji Picker-Prefix.pch"; 455 | GCC_PREPROCESSOR_DEFINITIONS = ( 456 | "DEBUG=1", 457 | "$(inherited)", 458 | ); 459 | INFOPLIST_FILE = "PI Emoji PickerTests/PI Emoji PickerTests-Info.plist"; 460 | PRODUCT_NAME = "$(TARGET_NAME)"; 461 | TEST_HOST = "$(BUNDLE_LOADER)"; 462 | WRAPPER_EXTENSION = xctest; 463 | }; 464 | name = Debug; 465 | }; 466 | 4049126C1937BBEB0087BC2F /* Release */ = { 467 | isa = XCBuildConfiguration; 468 | buildSettings = { 469 | BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/PI Emoji Picker.app/Contents/MacOS/PI Emoji Picker"; 470 | COMBINE_HIDPI_IMAGES = YES; 471 | FRAMEWORK_SEARCH_PATHS = ( 472 | "$(DEVELOPER_FRAMEWORKS_DIR)", 473 | "$(inherited)", 474 | ); 475 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 476 | GCC_PREFIX_HEADER = "PI Emoji Picker/PI Emoji Picker-Prefix.pch"; 477 | INFOPLIST_FILE = "PI Emoji PickerTests/PI Emoji PickerTests-Info.plist"; 478 | PRODUCT_NAME = "$(TARGET_NAME)"; 479 | TEST_HOST = "$(BUNDLE_LOADER)"; 480 | WRAPPER_EXTENSION = xctest; 481 | }; 482 | name = Release; 483 | }; 484 | /* End XCBuildConfiguration section */ 485 | 486 | /* Begin XCConfigurationList section */ 487 | 404912311937BBEB0087BC2F /* Build configuration list for PBXProject "PI Emoji Picker" */ = { 488 | isa = XCConfigurationList; 489 | buildConfigurations = ( 490 | 404912651937BBEB0087BC2F /* Debug */, 491 | 404912661937BBEB0087BC2F /* Release */, 492 | ); 493 | defaultConfigurationIsVisible = 0; 494 | defaultConfigurationName = Release; 495 | }; 496 | 404912671937BBEB0087BC2F /* Build configuration list for PBXNativeTarget "PI Emoji Picker" */ = { 497 | isa = XCConfigurationList; 498 | buildConfigurations = ( 499 | 404912681937BBEB0087BC2F /* Debug */, 500 | 404912691937BBEB0087BC2F /* Release */, 501 | ); 502 | defaultConfigurationIsVisible = 0; 503 | defaultConfigurationName = Release; 504 | }; 505 | 4049126A1937BBEB0087BC2F /* Build configuration list for PBXNativeTarget "PI Emoji PickerTests" */ = { 506 | isa = XCConfigurationList; 507 | buildConfigurations = ( 508 | 4049126B1937BBEB0087BC2F /* Debug */, 509 | 4049126C1937BBEB0087BC2F /* Release */, 510 | ); 511 | defaultConfigurationIsVisible = 0; 512 | defaultConfigurationName = Release; 513 | }; 514 | /* End XCConfigurationList section */ 515 | }; 516 | rootObject = 4049122E1937BBEB0087BC2F /* Project object */; 517 | } 518 | -------------------------------------------------------------------------------- /PI Emoji Picker/Base.lproj/MainMenu.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | 271 | 272 | 273 | 274 | 275 | 276 | 277 | 278 | 279 | 280 | 281 | 282 | 283 | 284 | 285 | 286 | 287 | 288 | 289 | 290 | 291 | 292 | 293 | 294 | 295 | 296 | 297 | 298 | 299 | 300 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308 | 309 | 310 | 311 | 312 | 313 | 314 | 315 | 316 | 317 | 318 | 319 | 320 | 321 | 322 | 323 | 324 | 325 | 326 | 327 | 328 | 329 | 330 | 331 | 332 | 333 | 334 | 335 | 336 | 337 | 338 | 339 | 340 | 341 | 342 | 343 | 344 | 345 | 346 | 347 | 348 | 349 | 350 | 351 | 352 | 353 | 354 | 355 | 356 | 357 | 358 | 359 | 360 | 361 | 362 | 363 | 364 | 365 | 366 | 367 | 368 | 369 | 370 | 371 | 372 | 373 | 374 | 375 | 376 | 377 | 378 | 379 | 380 | 381 | 382 | 383 | 384 | 385 | 386 | 387 | 388 | 389 | 390 | 391 | 392 | 393 | 394 | 395 | 396 | 397 | 398 | 399 | 400 | 401 | 402 | 403 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 419 | 420 | 421 | 422 | 423 | 424 | 425 | 426 | 427 | 428 | 429 | 430 | 431 | 432 | 433 | 434 | 435 | 436 | 437 | 438 | 439 | 440 | 441 | 442 | 443 | 444 | 445 | 446 | 447 | 448 | 449 | 450 | 451 | 452 | 453 | 454 | 455 | 456 | 457 | 458 | 459 | 460 | 461 | 462 | 463 | 464 | 465 | 466 | 467 | 468 | 469 | 470 | 471 | 472 | 473 | 474 | 475 | 476 | 477 | 478 | 479 | 480 | 481 | 482 | 483 | 484 | 485 | 486 | 487 | 488 | 489 | 490 | 491 | 492 | 493 | 494 | 495 | 496 | 497 | 498 | 499 | 500 | 501 | 502 | 503 | 504 | 505 | 506 | 507 | 508 | 509 | 510 | 511 | 512 | 513 | 514 | 515 | 516 | 517 | 518 | 519 | 520 | 521 | 522 | 523 | 524 | 525 | 526 | 527 | 528 | 529 | 530 | 531 | 532 | 533 | 534 | 535 | 536 | 537 | 538 | 539 | Default 540 | 541 | 542 | 543 | 544 | 545 | 546 | Left to Right 547 | 548 | 549 | 550 | 551 | 552 | 553 | Right to Left 554 | 555 | 556 | 557 | 558 | 559 | 560 | 561 | 562 | 563 | 564 | Default 565 | 566 | 567 | 568 | 569 | 570 | 571 | Left to Right 572 | 573 | 574 | 575 | 576 | 577 | 578 | Right to Left 579 | 580 | 581 | 582 | 583 | 584 | 585 | 586 | 587 | 588 | 589 | 590 | 591 | 592 | 593 | 594 | 595 | 596 | 597 | 598 | 599 | 600 | 601 | 602 | 603 | 604 | 605 | 606 | 607 | 608 | 609 | 610 | 611 | 612 | 613 | 614 | 615 | 616 | 617 | 618 | 619 | 620 | 621 | 622 | 623 | 624 | 625 | 626 | 627 | 628 | 629 | 630 | 631 | 632 | 633 | 634 | 635 | 636 | 637 | 638 | 639 | 640 | 641 | 642 | 643 | 644 | 645 | 646 | 647 | 648 | 649 | 650 | 651 | 652 | 653 | 654 | 655 | 656 | 657 | 658 | 659 | 660 | 661 | 662 | 663 | 664 | 665 | 666 | 667 | 668 | 669 | 670 | 671 | 672 | 673 | 674 | 675 | 676 | 677 | 678 | 679 | 690 | 691 | 692 | 693 | 694 | 695 | 696 | 697 | 698 | 699 | 700 | 701 | 702 | 703 | 704 | --------------------------------------------------------------------------------