diff options
author | James Cowgill <james410@cowgill.org.uk> | 2013-08-23 09:57:55 +0100 |
---|---|---|
committer | James Cowgill <james410@cowgill.org.uk> | 2013-08-23 09:57:55 +0100 |
commit | 9a298ca833d9b6a3425bb30c2e52cf04e34aeb7c (patch) | |
tree | d46630a885bcea03bbea036b86c645dc6c55708d /examples | |
parent | 0969839d538a385254c6eced9648acc7299876cc (diff) |
Imported Upstream version 2.1+dfsg
Diffstat (limited to 'examples')
36 files changed, 7254 insertions, 0 deletions
diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt new file mode 100644 index 0000000..777a72e --- /dev/null +++ b/examples/CMakeLists.txt @@ -0,0 +1,18 @@ +
+# add the examples subdirectories +add_subdirectory(ftp)
+add_subdirectory(opengl)
+add_subdirectory(pong)
+add_subdirectory(shader)
+add_subdirectory(sockets)
+add_subdirectory(sound)
+add_subdirectory(sound_capture)
+add_subdirectory(voip)
+add_subdirectory(window)
+if(WINDOWS)
+ add_subdirectory(win32)
+elseif(LINUX)
+ add_subdirectory(X11) +elseif(MACOSX)
+ add_subdirectory(cocoa)
+endif()
diff --git a/examples/X11/CMakeLists.txt b/examples/X11/CMakeLists.txt new file mode 100644 index 0000000..d63ca9f --- /dev/null +++ b/examples/X11/CMakeLists.txt @@ -0,0 +1,16 @@ +
+set(SRCROOT ${PROJECT_SOURCE_DIR}/examples/X11)
+
+# all source files
+set(SRC ${SRCROOT}/X11.cpp)
+
+# find OpenGL, GLU and X11
+find_package(OpenGL REQUIRED)
+include_directories(${OPENGL_INCLUDE_DIR})
+find_package(X11 REQUIRED)
+include_directories(${X11_INCLUDE_DIR})
+
+# define the X11 target
+sfml_add_example(X11 GUI_APP
+ SOURCES ${SRC}
+ DEPENDS sfml-window sfml-system ${OPENGL_LIBRARIES} ${X11_LIBRARIES})
diff --git a/examples/X11/X11.cpp b/examples/X11/X11.cpp new file mode 100644 index 0000000..2ffa08b --- /dev/null +++ b/examples/X11/X11.cpp @@ -0,0 +1,199 @@ +
+////////////////////////////////////////////////////////////
+// Headers
+////////////////////////////////////////////////////////////
+#include <SFML/Window.hpp>
+#include <X11/Xlib.h>
+#include <GL/gl.h>
+#include <GL/glu.h>
+#include <iostream>
+
+
+////////////////////////////////////////////////////////////
+/// Initialize OpenGL states into the specified view
+///
+/// \param Window Target window to initialize
+///
+////////////////////////////////////////////////////////////
+void initialize(sf::Window& window)
+{
+ // Activate the window
+ window.setActive();
+
+ // Setup OpenGL states
+ // Set color and depth clear value
+ glClearDepth(1.f);
+ glClearColor(0.f, 0.5f, 0.5f, 0.f);
+
+ // Enable Z-buffer read and write
+ glEnable(GL_DEPTH_TEST);
+ glDepthMask(GL_TRUE);
+
+ // Setup a perspective projection
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective(90.f, 1.f, 1.f, 500.f);
+}
+
+////////////////////////////////////////////////////////////
+/// Draw the OpenGL scene (a rotating cube) into
+/// the specified view
+///
+/// \param window Target window for rendering
+/// \param elapsedTime Time elapsed since the last draw
+///
+////////////////////////////////////////////////////////////
+void draw(sf::Window& window, float elapsedTime)
+{
+ // Activate the window
+ window.setActive();
+
+ // Clear color and depth buffers
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ // Apply some transformations
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ glTranslatef(0.f, 0.f, -200.f);
+ glRotatef(elapsedTime * 0.05f, 1.f, 0.f, 0.f);
+ glRotatef(elapsedTime * 0.03f, 0.f, 1.f, 0.f);
+ glRotatef(elapsedTime * 0.09f, 0.f, 0.f, 1.f);
+
+ // Draw a cube
+ glBegin(GL_QUADS);
+
+ glColor3f(1.f, 1.f, 0.f);
+ glVertex3f(-50.f, -50.f, -50.f);
+ glVertex3f(-50.f, 50.f, -50.f);
+ glVertex3f( 50.f, 50.f, -50.f);
+ glVertex3f( 50.f, -50.f, -50.f);
+
+ glColor3f(1.f, 1.f, 0.f);
+ glVertex3f(-50.f, -50.f, 50.f);
+ glVertex3f(-50.f, 50.f, 50.f);
+ glVertex3f( 50.f, 50.f, 50.f);
+ glVertex3f( 50.f, -50.f, 50.f);
+
+ glColor3f(0.f, 1.f, 1.f);
+ glVertex3f(-50.f, -50.f, -50.f);
+ glVertex3f(-50.f, 50.f, -50.f);
+ glVertex3f(-50.f, 50.f, 50.f);
+ glVertex3f(-50.f, -50.f, 50.f);
+
+ glColor3f(0.f, 1.f, 1.f);
+ glVertex3f(50.f, -50.f, -50.f);
+ glVertex3f(50.f, 50.f, -50.f);
+ glVertex3f(50.f, 50.f, 50.f);
+ glVertex3f(50.f, -50.f, 50.f);
+
+ glColor3f(1.f, 0.f, 1.f);
+ glVertex3f(-50.f, -50.f, 50.f);
+ glVertex3f(-50.f, -50.f, -50.f);
+ glVertex3f( 50.f, -50.f, -50.f);
+ glVertex3f( 50.f, -50.f, 50.f);
+
+ glColor3f(1.f, 0.f, 1.f);
+ glVertex3f(-50.f, 50.f, 50.f);
+ glVertex3f(-50.f, 50.f, -50.f);
+ glVertex3f( 50.f, 50.f, -50.f);
+ glVertex3f( 50.f, 50.f, 50.f);
+
+ glEnd();
+}
+
+
+////////////////////////////////////////////////////////////
+/// Entry point of application
+///
+/// \return Error code
+///
+////////////////////////////////////////////////////////////
+int main()
+{
+ // Open a connection with the X server
+ Display* display = XOpenDisplay(NULL);
+ if (!display)
+ return EXIT_FAILURE;
+
+ // Get the default screen
+ int screen = DefaultScreen(display);
+
+ // Let's create the main window
+ XSetWindowAttributes attributes;
+ attributes.background_pixel = BlackPixel(display, screen);
+ attributes.event_mask = KeyPressMask;
+ Window window = XCreateWindow(display, RootWindow(display, screen),
+ 0, 0, 650, 330, 0,
+ DefaultDepth(display, screen),
+ InputOutput,
+ DefaultVisual(display, screen),
+ CWBackPixel | CWEventMask, &attributes);
+ if (!window)
+ return EXIT_FAILURE;
+
+ // Set the window's name
+ XStoreName(display, window , "SFML Window");
+
+ // Let's create the windows which will serve as containers for our SFML views
+ Window view1 = XCreateWindow(display, window,
+ 10, 10, 310, 310, 0,
+ DefaultDepth(display, screen),
+ InputOutput,
+ DefaultVisual(display, screen),
+ 0, NULL);
+ Window view2 = XCreateWindow(display, window,
+ 330, 10, 310, 310, 0,
+ DefaultDepth(display, screen),
+ InputOutput,
+ DefaultVisual(display, screen),
+ 0, NULL);
+
+ // Show our windows
+ XMapWindow(display, window);
+ XFlush(display);
+
+ // Create our SFML views
+ sf::Window SFMLView1(view1);
+ sf::Window SFMLView2(view2);
+
+ // Create a clock for measuring elapsed time
+ sf::Clock clock;
+
+ // Initialize our views
+ initialize(SFMLView1);
+ initialize(SFMLView2);
+
+ // Start the event loop
+ bool running = true;
+ while (running)
+ {
+ while (XPending(display))
+ {
+ // Get the next pending event
+ XEvent event;
+ XNextEvent(display, &event);
+
+ // Process it
+ switch (event.type)
+ {
+ // Any key is pressed : quit
+ case KeyPress :
+ running = false;
+ break;
+ }
+ }
+
+ // Draw something into our views
+ draw(SFMLView1, clock.getElapsedTime().asSeconds());
+ draw(SFMLView2, clock.getElapsedTime().asSeconds() * 0.3f);
+
+ // Display the views on screen
+ SFMLView1.display();
+ SFMLView2.display();
+ }
+
+ // Close the display
+ XCloseDisplay(display);
+
+ return EXIT_SUCCESS;
+}
diff --git a/examples/cocoa/CMakeLists.txt b/examples/cocoa/CMakeLists.txt new file mode 100644 index 0000000..b8b2b4e --- /dev/null +++ b/examples/cocoa/CMakeLists.txt @@ -0,0 +1,67 @@ +
+set(SRCROOT ${PROJECT_SOURCE_DIR}/examples/cocoa)
+
+# all source files
+set(SRC ${SRCROOT}/CocoaAppDelegate.h
+ ${SRCROOT}/CocoaAppDelegate.mm + ${SRCROOT}/NSString+stdstring.h + ${SRCROOT}/NSString+stdstring.mm + ${SRCROOT}/main.m) + +# all XIB files +set(XIBS MainMenu) + +# all resource files +set(RESOURCES ${SRCROOT}/resources/logo.png + ${SRCROOT}/resources/icon.icns + ${SRCROOT}/resources/sansation.ttf + ${SRCROOT}/resources/blue.png + ${SRCROOT}/resources/green.png + ${SRCROOT}/resources/red.png + ${SRCROOT}/resources/Credits.rtf) + +# define the cocoa target and customize it +add_executable(cocoa MACOSX_BUNDLE ${SRC} ${RESOURCES}) +set_source_files_properties(${RESOURCES} PROPERTIES + MACOSX_PACKAGE_LOCATION Resources) +set_target_properties(cocoa PROPERTIES + MACOSX_BUNDLE_INFO_PLIST ${SRCROOT}/resources/Cocoa-Info.plist) +target_link_libraries(cocoa "-framework Cocoa -framework Foundation" + sfml-system sfml-window sfml-graphics) +
+# set the target's folder (for IDEs that support it, e.g. Visual Studio)
+set_target_properties(cocoa PROPERTIES FOLDER "Examples")
+ +# compile XIB files +find_program(IBTOOL ibtool HINTS "/usr/bin" "${OSX_DEVELOPER_ROOT}/usr/bin") +if(${IBTOOL} STREQUAL "IBTOOL-NOTFOUND") + message(FATAL_ERROR "ibtool is required to compile .xib files but wasn't found.") +endif() +set(RESOURCE_PATH "cocoa.app/Contents/Resources") +set(XIB_OUTPUT_PATH "${RESOURCE_PATH}/") +set(XIB_INPUT_PATH "${SRCROOT}/") +foreach(XIB ${XIBS}) + add_custom_command(TARGET cocoa + POST_BUILD + COMMAND ${IBTOOL} --errors + --output-format human-readable-text + --compile ${XIB_OUTPUT_PATH}/${XIB}.nib + ${XIB_INPUT_PATH}/${XIB}.xib + COMMENT "Compiling ${XIB}.xib") + # deactivated options : --warnings --notices +endforeach() + +# add install rule +install(TARGETS cocoa
+ BUNDLE DESTINATION ${INSTALL_MISC_DIR}/examples/cocoa + COMPONENT examples)
+ +#
+# define the cocoa target +# sfml_add_example is not compatible with application bundles ! +#
+#sfml_add_example(cocoa
+# SOURCES ${SRC}
+# DEPENDS sfml-system sfml-window sfml-graphics) +# +
diff --git a/examples/cocoa/CocoaAppDelegate.h b/examples/cocoa/CocoaAppDelegate.h new file mode 100644 index 0000000..f259a8c --- /dev/null +++ b/examples/cocoa/CocoaAppDelegate.h @@ -0,0 +1,74 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2012 Marco Antognini (antognini.marco@gmail.com), +// Laurent Gomila (laurent.gom@gmail.com), +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#import <Cocoa/Cocoa.h> +#import <SFML/Graphics.hpp> + +/* + * NB : We need pointers for C++ objects fields in Obj-C interface ! + * The recomanded way is to use PIMP idiom. + * + * It's elegant. Moreover, we do no constrain + * other file including this one to be Obj-C++. + */ + +struct SFMLmainWindow; + +#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1060 +@interface CocoaAppDelegate : NSObject <NSApplicationDelegate> { +#else +@interface CocoaAppDelegate : NSObject { +#endif +@private + NSWindow *m_window; + NSView *m_sfmlView; + NSTextField *m_textField; + SFMLmainWindow *m_mainWindow; + NSTimer *m_renderTimer; + BOOL m_visible; + BOOL m_initialized; +} + +@property (retain) IBOutlet NSWindow *window; +@property (assign) IBOutlet NSView *sfmlView; +@property (assign) IBOutlet NSTextField *textField; + +-(IBAction)colorChanged:(NSPopUpButton *)sender; +-(IBAction)rotationChanged:(NSSlider *)sender; +-(IBAction)visibleChanged:(NSButton *)sender; +-(IBAction)textChanged:(NSTextField *)sender; +-(IBAction)updateText:(NSButton *)sender; + +@end + +/* + * This interface is used to prevent the system alert produced when the SFML view + * has the focus and the user press a key. + */ +@interface SilentWindow : NSWindow + +-(void)keyDown:(NSEvent *)theEvent; + +@end diff --git a/examples/cocoa/CocoaAppDelegate.mm b/examples/cocoa/CocoaAppDelegate.mm new file mode 100644 index 0000000..ff1bc1e --- /dev/null +++ b/examples/cocoa/CocoaAppDelegate.mm @@ -0,0 +1,241 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2012 Marco Antognini (antognini.marco@gmail.com), +// Laurent Gomila (laurent.gom@gmail.com), +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#import "CocoaAppDelegate.h" +#import "NSString+stdstring.h" + +// These define are used for converting the color of the NSPopUpButton +#define BLUE @"Blue" +#define GREEN @"Green" +#define RED @"Red" + +// Our PIMPL +struct SFMLmainWindow +{ + SFMLmainWindow(sf::WindowHandle win) + : renderWindow(win) + , background(sf::Color::Blue) + { + std::string resPath = [[[NSBundle mainBundle] resourcePath] tostdstring]; + if (!logo.loadFromFile(resPath + "/logo.png")) { + NSLog(@"Couldn't load the logo image"); + } + + logo.setSmooth(true); + + sprite.setTexture(logo, true); + sf::FloatRect rect = sprite.getLocalBounds(); + sf::Vector2f size(rect.width, rect.height); + sprite.setOrigin(size / 2.f); + sprite.scale(0.3, 0.3); + + unsigned int ww = renderWindow.getSize().x; + unsigned int wh = renderWindow.getSize().y; + sprite.setPosition(sf::Vector2f(ww, wh) / 2.f); + + if (!font.loadFromFile(resPath + "/sansation.ttf")) { + NSLog(@"Couldn't load the font"); + } + + text.setColor(sf::Color::White); + text.setFont(font); + } + + sf::RenderWindow renderWindow; + sf::Font font; + sf::Text text; + sf::Texture logo; + sf::Sprite sprite; + sf::Color background; +}; + +// Private stuff +@interface CocoaAppDelegate () + +@property (assign) SFMLmainWindow *mainWindow; +@property (retain) NSTimer *renderTimer; +@property (assign) BOOL visible; + +@property (assign) BOOL initialized; + +-(void)renderMainWindow:(NSTimer *)aTimer; + +@end + + +// Finally, the implementation +@implementation CocoaAppDelegate + +@synthesize window = m_window; +@synthesize sfmlView = m_sfmlView; +@synthesize textField = m_textField; + +@synthesize mainWindow = m_mainWindow; +@synthesize renderTimer = m_renderTimer; +@synthesize visible = m_visible; + +@synthesize initialized = m_initialized; + +- (id)init { + self = [super init]; + if (self) { + self.initialized = NO; + } + return self; +} + +-(void)applicationDidFinishLaunching:(NSNotification *)aNotification +{ + if (!self.initialized) + { + // Init the SFML render area. + self.mainWindow = new SFMLmainWindow(self.sfmlView); + self.mainWindow->text.setString([self.textField.stringValue tostdwstring]); + self.visible = YES; + + // Launch the timer to periodically display our stuff into the Cocoa view. + self.renderTimer = [NSTimer timerWithTimeInterval:1.f/60.f + target:self + selector:@selector(renderMainWindow:) + userInfo:nil + repeats:YES]; + [[NSRunLoop mainRunLoop] addTimer:self.renderTimer + forMode:NSDefaultRunLoopMode]; + [[NSRunLoop mainRunLoop] addTimer:self.renderTimer + forMode:NSEventTrackingRunLoopMode]; + /* + * This is really some ugly code but in order to have the timer fired + * periodically we need to add it to the two above runloop mode. + * + * The default mode allows timer firing while the user doesn't do anything + * while the second mode allows timer firing while he is using a slider + * or a menu. + */ + + self.initialized = YES; + } +} + +-(void)dealloc +{ + [self.renderTimer invalidate]; + self.mainWindow->renderWindow.close(); + + self.window = nil; + self.sfmlView = nil; + self.textField = nil; + + delete (SFMLmainWindow *) self.mainWindow; + self.mainWindow = 0; + self.renderTimer = nil; + + [super dealloc]; +} + +-(void)renderMainWindow:(NSTimer *)aTimer +{ + // Scaling + /* /!\ we do this at 60fps so choose low scaling factor! /!\ */ + if (sf::Keyboard::isKeyPressed(sf::Keyboard::Up)) + { + self.mainWindow->sprite.scale(1.01f, 1.01f); + } + if (sf::Keyboard::isKeyPressed(sf::Keyboard::Down)) + { + self.mainWindow->sprite.scale(0.99f, 0.99f); + } + + // Clear the window, display some stuff and display it into our view. + + self.mainWindow->renderWindow.clear(self.mainWindow->background); + + if (self.visible) + { + self.mainWindow->renderWindow.draw(self.mainWindow->sprite); + } + + self.mainWindow->renderWindow.draw(self.mainWindow->text); + + self.mainWindow->renderWindow.display(); +} + +-(IBAction)colorChanged:(NSPopUpButton *)sender +{ + if (self.initialized) + { + // Convert title to color + NSString *color = [[sender selectedItem] title]; + if ([color isEqualToString:BLUE]) + { + self.mainWindow->background = sf::Color::Blue; + } + else if ([color isEqualToString:GREEN]) + { + self.mainWindow->background = sf::Color::Green; + } + else + { + self.mainWindow->background = sf::Color::Red; + } + } +} + +-(IBAction)rotationChanged:(NSSlider *)sender +{ + if (self.initialized) + { + float angle = [sender floatValue]; + self.mainWindow->sprite.setRotation(angle); + } +} + +-(IBAction)visibleChanged:(NSButton *)sender +{ + if (self.initialized) + self.visible = [sender state] == NSOnState; +} + +-(IBAction)textChanged:(NSTextField *)sender +{ + if (self.initialized) + self.mainWindow->text.setString([[sender stringValue] tostdwstring]); +} + +- (IBAction)updateText:(NSButton *)sender +{ + // Simply simulate textChanged : + [self textChanged:self.textField]; +} + +@end + +@implementation SilentWindow + +-(void)keyDown:(NSEvent *)theEvent +{ + // Do nothing except preventing this alert. +} + +@end diff --git a/examples/cocoa/MainMenu.xib b/examples/cocoa/MainMenu.xib new file mode 100644 index 0000000..2001ff5 --- /dev/null +++ b/examples/cocoa/MainMenu.xib @@ -0,0 +1,4180 @@ +<?xml version="1.0" encoding="UTF-8"?> +<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.10"> + <data> + <int key="IBDocument.SystemTarget">1070</int> + <string key="IBDocument.SystemVersion">11C74</string> + <string key="IBDocument.InterfaceBuilderVersion">1938</string> + <string key="IBDocument.AppKitVersion">1138.23</string> + <string key="IBDocument.HIToolboxVersion">567.00</string> + <object class="NSMutableDictionary" key="IBDocument.PluginVersions"> + <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="NS.object.0">1938</string> + </object> + <object class="NSArray" key="IBDocument.IntegratedClassDependencies"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>NSPopUpButton</string> + <string>NSMenuItem</string> + <string>NSMenu</string> + <string>NSTextFieldCell</string> + <string>NSButtonCell</string> + <string>NSButton</string> + <string>NSSlider</string> + <string>NSSliderCell</string> + <string>NSCustomObject</string> + <string>NSCustomView</string> + <string>NSView</string> + <string>NSWindowTemplate</string> + <string>NSTextField</string> + <string>NSPopUpButtonCell</string> + </object> + <object class="NSArray" key="IBDocument.PluginDependencies"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + </object> + <object class="NSMutableDictionary" key="IBDocument.Metadata"> + <string key="NS.key.0">PluginDependencyRecalculationVersion</string> + <integer value="1" key="NS.object.0"/> + </object> + <object class="NSMutableArray" key="IBDocument.RootObjects" id="1048"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSCustomObject" id="1021"> + <string key="NSClassName">NSApplication</string> + </object> + <object class="NSCustomObject" id="1014"> + <string key="NSClassName">FirstResponder</string> + </object> + <object class="NSCustomObject" id="1050"> + <string key="NSClassName">NSApplication</string> + </object> + <object class="NSMenu" id="649796088"> + <string key="NSTitle">AMainMenu</string> + <object class="NSMutableArray" key="NSMenuItems"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSMenuItem" id="694149608"> + <reference key="NSMenu" ref="649796088"/> + <string key="NSTitle">Cocoa</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <object class="NSCustomResource" key="NSOnImage" id="35465992"> + <string key="NSClassName">NSImage</string> + <string key="NSResourceName">NSMenuCheckmark</string> + </object> + <object class="NSCustomResource" key="NSMixedImage" id="502551668"> + <string key="NSClassName">NSImage</string> + <string key="NSResourceName">NSMenuMixedState</string> + </object> + <string key="NSAction">submenuAction:</string> + <object class="NSMenu" key="NSSubmenu" id="110575045"> + <string key="NSTitle">Cocoa</string> + <object class="NSMutableArray" key="NSMenuItems"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSMenuItem" id="238522557"> + <reference key="NSMenu" ref="110575045"/> + <string key="NSTitle">About Cocoa</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="304266470"> + <reference key="NSMenu" ref="110575045"/> + <bool key="NSIsDisabled">YES</bool> + <bool key="NSIsSeparator">YES</bool> + <string key="NSTitle"/> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="609285721"> + <reference key="NSMenu" ref="110575045"/> + <string key="NSTitle">Preferences…</string> + <string key="NSKeyEquiv">,</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="481834944"> + <reference key="NSMenu" ref="110575045"/> + <bool key="NSIsDisabled">YES</bool> + <bool key="NSIsSeparator">YES</bool> + <string key="NSTitle"/> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="1046388886"> + <reference key="NSMenu" ref="110575045"/> + <string key="NSTitle">Services</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <string key="NSAction">submenuAction:</string> + <object class="NSMenu" key="NSSubmenu" id="752062318"> + <string key="NSTitle">Services</string> + <object class="NSMutableArray" key="NSMenuItems"> + <bool key="EncodedWithXMLCoder">YES</bool> + </object> + <string key="NSName">_NSServicesMenu</string> + </object> + </object> + <object class="NSMenuItem" id="646227648"> + <reference key="NSMenu" ref="110575045"/> + <bool key="NSIsDisabled">YES</bool> + <bool key="NSIsSeparator">YES</bool> + <string key="NSTitle"/> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="755159360"> + <reference key="NSMenu" ref="110575045"/> + <string key="NSTitle">Hide Cocoa</string> + <string key="NSKeyEquiv">h</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="342932134"> + <reference key="NSMenu" ref="110575045"/> + <string key="NSTitle">Hide Others</string> + <string key="NSKeyEquiv">h</string> + <int key="NSKeyEquivModMask">1572864</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="908899353"> + <reference key="NSMenu" ref="110575045"/> + <string key="NSTitle">Show All</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="1056857174"> + <reference key="NSMenu" ref="110575045"/> + <bool key="NSIsDisabled">YES</bool> + <bool key="NSIsSeparator">YES</bool> + <string key="NSTitle"/> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="632727374"> + <reference key="NSMenu" ref="110575045"/> + <string key="NSTitle">Quit Cocoa</string> + <string key="NSKeyEquiv">q</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + </object> + <string key="NSName">_NSAppleMenu</string> + </object> + </object> + <object class="NSMenuItem" id="379814623"> + <reference key="NSMenu" ref="649796088"/> + <string key="NSTitle">File</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <string key="NSAction">submenuAction:</string> + <object class="NSMenu" key="NSSubmenu" id="720053764"> + <string key="NSTitle">File</string> + <object class="NSMutableArray" key="NSMenuItems"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSMenuItem" id="705341025"> + <reference key="NSMenu" ref="720053764"/> + <string key="NSTitle">New</string> + <string key="NSKeyEquiv">n</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="722745758"> + <reference key="NSMenu" ref="720053764"/> + <string key="NSTitle">Open…</string> + <string key="NSKeyEquiv">o</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="1025936716"> + <reference key="NSMenu" ref="720053764"/> + <string key="NSTitle">Open Recent</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <string key="NSAction">submenuAction:</string> + <object class="NSMenu" key="NSSubmenu" id="1065607017"> + <string key="NSTitle">Open Recent</string> + <object class="NSMutableArray" key="NSMenuItems"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSMenuItem" id="759406840"> + <reference key="NSMenu" ref="1065607017"/> + <string key="NSTitle">Clear Menu</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + </object> + <string key="NSName">_NSRecentDocumentsMenu</string> + </object> + </object> + <object class="NSMenuItem" id="425164168"> + <reference key="NSMenu" ref="720053764"/> + <bool key="NSIsDisabled">YES</bool> + <bool key="NSIsSeparator">YES</bool> + <string key="NSTitle"/> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="776162233"> + <reference key="NSMenu" ref="720053764"/> + <string key="NSTitle">Close</string> + <string key="NSKeyEquiv">w</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="1023925487"> + <reference key="NSMenu" ref="720053764"/> + <string key="NSTitle">Save</string> + <string key="NSKeyEquiv">s</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="117038363"> + <reference key="NSMenu" ref="720053764"/> + <string key="NSTitle">Save As…</string> + <string key="NSKeyEquiv">S</string> + <int key="NSKeyEquivModMask">1179648</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="579971712"> + <reference key="NSMenu" ref="720053764"/> + <string key="NSTitle">Revert to Saved</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="1010469920"> + <reference key="NSMenu" ref="720053764"/> + <bool key="NSIsDisabled">YES</bool> + <bool key="NSIsSeparator">YES</bool> + <string key="NSTitle"/> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="294629803"> + <reference key="NSMenu" ref="720053764"/> + <string key="NSTitle">Page Setup...</string> + <string key="NSKeyEquiv">P</string> + <int key="NSKeyEquivModMask">1179648</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <string key="NSToolTip"/> + </object> + <object class="NSMenuItem" id="49223823"> + <reference key="NSMenu" ref="720053764"/> + <string key="NSTitle">Print…</string> + <string key="NSKeyEquiv">p</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + </object> + </object> + </object> + <object class="NSMenuItem" id="952259628"> + <reference key="NSMenu" ref="649796088"/> + <string key="NSTitle">Edit</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <string key="NSAction">submenuAction:</string> + <object class="NSMenu" key="NSSubmenu" id="789758025"> + <string key="NSTitle">Edit</string> + <object class="NSMutableArray" key="NSMenuItems"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSMenuItem" id="1058277027"> + <reference key="NSMenu" ref="789758025"/> + <string key="NSTitle">Undo</string> + <string key="NSKeyEquiv">z</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="790794224"> + <reference key="NSMenu" ref="789758025"/> + <string key="NSTitle">Redo</string> + <string key="NSKeyEquiv">Z</string> + <int key="NSKeyEquivModMask">1179648</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="1040322652"> + <reference key="NSMenu" ref="789758025"/> + <bool key="NSIsDisabled">YES</bool> + <bool key="NSIsSeparator">YES</bool> + <string key="NSTitle"/> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="296257095"> + <reference key="NSMenu" ref="789758025"/> + <string key="NSTitle">Cut</string> + <string key="NSKeyEquiv">x</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="860595796"> + <reference key="NSMenu" ref="789758025"/> + <string key="NSTitle">Copy</string> + <string key="NSKeyEquiv">c</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="29853731"> + <reference key="NSMenu" ref="789758025"/> + <string key="NSTitle">Paste</string> + <string key="NSKeyEquiv">v</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="82994268"> + <reference key="NSMenu" ref="789758025"/> + <string key="NSTitle">Paste and Match Style</string> + <string key="NSKeyEquiv">V</string> + <int key="NSKeyEquivModMask">1572864</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="437104165"> + <reference key="NSMenu" ref="789758025"/> + <string key="NSTitle">Delete</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="583158037"> + <reference key="NSMenu" ref="789758025"/> + <string key="NSTitle">Select All</string> + <string key="NSKeyEquiv">a</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="212016141"> + <reference key="NSMenu" ref="789758025"/> + <bool key="NSIsDisabled">YES</bool> + <bool key="NSIsSeparator">YES</bool> + <string key="NSTitle"/> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="892235320"> + <reference key="NSMenu" ref="789758025"/> + <string key="NSTitle">Find</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <string key="NSAction">submenuAction:</string> + <object class="NSMenu" key="NSSubmenu" id="963351320"> + <string key="NSTitle">Find</string> + <object class="NSMutableArray" key="NSMenuItems"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSMenuItem" id="447796847"> + <reference key="NSMenu" ref="963351320"/> + <string key="NSTitle">Find…</string> + <string key="NSKeyEquiv">f</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <int key="NSTag">1</int> + </object> + <object class="NSMenuItem" id="326711663"> + <reference key="NSMenu" ref="963351320"/> + <string key="NSTitle">Find Next</string> + <string key="NSKeyEquiv">g</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <int key="NSTag">2</int> + </object> + <object class="NSMenuItem" id="270902937"> + <reference key="NSMenu" ref="963351320"/> + <string key="NSTitle">Find Previous</string> + <string key="NSKeyEquiv">G</string> + <int key="NSKeyEquivModMask">1179648</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <int key="NSTag">3</int> + </object> + <object class="NSMenuItem" id="159080638"> + <reference key="NSMenu" ref="963351320"/> + <string key="NSTitle">Use Selection for Find</string> + <string key="NSKeyEquiv">e</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <int key="NSTag">7</int> + </object> + <object class="NSMenuItem" id="88285865"> + <reference key="NSMenu" ref="963351320"/> + <string key="NSTitle">Jump to Selection</string> + <string key="NSKeyEquiv">j</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + </object> + </object> + </object> + <object class="NSMenuItem" id="972420730"> + <reference key="NSMenu" ref="789758025"/> + <string key="NSTitle">Spelling and Grammar</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <string key="NSAction">submenuAction:</string> + <object class="NSMenu" key="NSSubmenu" id="769623530"> + <string key="NSTitle">Spelling and Grammar</string> + <object class="NSMutableArray" key="NSMenuItems"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSMenuItem" id="679648819"> + <reference key="NSMenu" ref="769623530"/> + <string key="NSTitle">Show Spelling and Grammar</string> + <string key="NSKeyEquiv">:</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="96193923"> + <reference key="NSMenu" ref="769623530"/> + <string key="NSTitle">Check Document Now</string> + <string key="NSKeyEquiv">;</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="859480356"> + <reference key="NSMenu" ref="769623530"/> + <bool key="NSIsDisabled">YES</bool> + <bool key="NSIsSeparator">YES</bool> + <string key="NSTitle"/> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="948374510"> + <reference key="NSMenu" ref="769623530"/> + <string key="NSTitle">Check Spelling While Typing</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="967646866"> + <reference key="NSMenu" ref="769623530"/> + <string key="NSTitle">Check Grammar With Spelling</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="795346622"> + <reference key="NSMenu" ref="769623530"/> + <string key="NSTitle">Correct Spelling Automatically</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + </object> + </object> + </object> + <object class="NSMenuItem" id="507821607"> + <reference key="NSMenu" ref="789758025"/> + <string key="NSTitle">Substitutions</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <string key="NSAction">submenuAction:</string> + <object class="NSMenu" key="NSSubmenu" id="698887838"> + <string key="NSTitle">Substitutions</string> + <object class="NSMutableArray" key="NSMenuItems"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSMenuItem" id="65139061"> + <reference key="NSMenu" ref="698887838"/> + <string key="NSTitle">Show Substitutions</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="19036812"> + <reference key="NSMenu" ref="698887838"/> + <bool key="NSIsDisabled">YES</bool> + <bool key="NSIsSeparator">YES</bool> + <string key="NSTitle"/> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="605118523"> + <reference key="NSMenu" ref="698887838"/> + <string key="NSTitle">Smart Copy/Paste</string> + <string key="NSKeyEquiv">f</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <int key="NSTag">1</int> + </object> + <object class="NSMenuItem" id="197661976"> + <reference key="NSMenu" ref="698887838"/> + <string key="NSTitle">Smart Quotes</string> + <string key="NSKeyEquiv">g</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <int key="NSTag">2</int> + </object> + <object class="NSMenuItem" id="672708820"> + <reference key="NSMenu" ref="698887838"/> + <string key="NSTitle">Smart Dashes</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="708854459"> + <reference key="NSMenu" ref="698887838"/> + <string key="NSTitle">Smart Links</string> + <string key="NSKeyEquiv">G</string> + <int key="NSKeyEquivModMask">1179648</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <int key="NSTag">3</int> + </object> + <object class="NSMenuItem" id="537092702"> + <reference key="NSMenu" ref="698887838"/> + <string key="NSTitle">Text Replacement</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + </object> + </object> + </object> + <object class="NSMenuItem" id="288088188"> + <reference key="NSMenu" ref="789758025"/> + <string key="NSTitle">Transformations</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <string key="NSAction">submenuAction:</string> + <object class="NSMenu" key="NSSubmenu" id="579392910"> + <string key="NSTitle">Transformations</string> + <object class="NSMutableArray" key="NSMenuItems"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSMenuItem" id="1060694897"> + <reference key="NSMenu" ref="579392910"/> + <string key="NSTitle">Make Upper Case</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="879586729"> + <reference key="NSMenu" ref="579392910"/> + <string key="NSTitle">Make Lower Case</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="56570060"> + <reference key="NSMenu" ref="579392910"/> + <string key="NSTitle">Capitalize</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + </object> + </object> + </object> + <object class="NSMenuItem" id="676164635"> + <reference key="NSMenu" ref="789758025"/> + <string key="NSTitle">Speech</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <string key="NSAction">submenuAction:</string> + <object class="NSMenu" key="NSSubmenu" id="785027613"> + <string key="NSTitle">Speech</string> + <object class="NSMutableArray" key="NSMenuItems"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSMenuItem" id="731782645"> + <reference key="NSMenu" ref="785027613"/> + <string key="NSTitle">Start Speaking</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="680220178"> + <reference key="NSMenu" ref="785027613"/> + <string key="NSTitle">Stop Speaking</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + </object> + </object> + </object> + </object> + </object> + </object> + <object class="NSMenuItem" id="302598603"> + <reference key="NSMenu" ref="649796088"/> + <string key="NSTitle">Format</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <string key="NSAction">submenuAction:</string> + <object class="NSMenu" key="NSSubmenu" id="941447902"> + <string key="NSTitle">Format</string> + <object class="NSMutableArray" key="NSMenuItems"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSMenuItem" id="792887677"> + <reference key="NSMenu" ref="941447902"/> + <string key="NSTitle">Font</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <string key="NSAction">submenuAction:</string> + <object class="NSMenu" key="NSSubmenu" id="786677654"> + <string key="NSTitle">Font</string> + <object class="NSMutableArray" key="NSMenuItems"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSMenuItem" id="159677712"> + <reference key="NSMenu" ref="786677654"/> + <string key="NSTitle">Show Fonts</string> + <string key="NSKeyEquiv">t</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="305399458"> + <reference key="NSMenu" ref="786677654"/> + <string key="NSTitle">Bold</string> + <string key="NSKeyEquiv">b</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <int key="NSTag">2</int> + </object> + <object class="NSMenuItem" id="814362025"> + <reference key="NSMenu" ref="786677654"/> + <string key="NSTitle">Italic</string> + <string key="NSKeyEquiv">i</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <int key="NSTag">1</int> + </object> + <object class="NSMenuItem" id="330926929"> + <reference key="NSMenu" ref="786677654"/> + <string key="NSTitle">Underline</string> + <string key="NSKeyEquiv">u</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="533507878"> + <reference key="NSMenu" ref="786677654"/> + <bool key="NSIsDisabled">YES</bool> + <bool key="NSIsSeparator">YES</bool> + <string key="NSTitle"/> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="158063935"> + <reference key="NSMenu" ref="786677654"/> + <string key="NSTitle">Bigger</string> + <string key="NSKeyEquiv">+</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <int key="NSTag">3</int> + </object> + <object class="NSMenuItem" id="885547335"> + <reference key="NSMenu" ref="786677654"/> + <string key="NSTitle">Smaller</string> + <string key="NSKeyEquiv">-</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <int key="NSTag">4</int> + </object> + <object class="NSMenuItem" id="901062459"> + <reference key="NSMenu" ref="786677654"/> + <bool key="NSIsDisabled">YES</bool> + <bool key="NSIsSeparator">YES</bool> + <string key="NSTitle"/> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="767671776"> + <reference key="NSMenu" ref="786677654"/> + <string key="NSTitle">Kern</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <string key="NSAction">submenuAction:</string> + <object class="NSMenu" key="NSSubmenu" id="175441468"> + <string key="NSTitle">Kern</string> + <object class="NSMutableArray" key="NSMenuItems"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSMenuItem" id="252969304"> + <reference key="NSMenu" ref="175441468"/> + <string key="NSTitle">Use Default</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="766922938"> + <reference key="NSMenu" ref="175441468"/> + <string key="NSTitle">Use None</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="677519740"> + <reference key="NSMenu" ref="175441468"/> + <string key="NSTitle">Tighten</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="238351151"> + <reference key="NSMenu" ref="175441468"/> + <string key="NSTitle">Loosen</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + </object> + </object> + </object> + <object class="NSMenuItem" id="691570813"> + <reference key="NSMenu" ref="786677654"/> + <string key="NSTitle">Ligature</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <string key="NSAction">submenuAction:</string> + <object class="NSMenu" key="NSSubmenu" id="1058217995"> + <string key="NSTitle">Ligature</string> + <object class="NSMutableArray" key="NSMenuItems"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSMenuItem" id="706297211"> + <reference key="NSMenu" ref="1058217995"/> + <string key="NSTitle">Use Default</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="568384683"> + <reference key="NSMenu" ref="1058217995"/> + <string key="NSTitle">Use None</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="663508465"> + <reference key="NSMenu" ref="1058217995"/> + <string key="NSTitle">Use All</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + </object> + </object> + </object> + <object class="NSMenuItem" id="769124883"> + <reference key="NSMenu" ref="786677654"/> + <string key="NSTitle">Baseline</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <string key="NSAction">submenuAction:</string> + <object class="NSMenu" key="NSSubmenu" id="18263474"> + <string key="NSTitle">Baseline</string> + <object class="NSMutableArray" key="NSMenuItems"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSMenuItem" id="257962622"> + <reference key="NSMenu" ref="18263474"/> + <string key="NSTitle">Use Default</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="644725453"> + <reference key="NSMenu" ref="18263474"/> + <string key="NSTitle">Superscript</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="1037576581"> + <reference key="NSMenu" ref="18263474"/> + <string key="NSTitle">Subscript</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="941806246"> + <reference key="NSMenu" ref="18263474"/> + <string key="NSTitle">Raise</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="1045724900"> + <reference key="NSMenu" ref="18263474"/> + <string key="NSTitle">Lower</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + </object> + </object> + </object> + <object class="NSMenuItem" id="739652853"> + <reference key="NSMenu" ref="786677654"/> + <bool key="NSIsDisabled">YES</bool> + <bool key="NSIsSeparator">YES</bool> + <string key="NSTitle"/> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="1012600125"> + <reference key="NSMenu" ref="786677654"/> + <string key="NSTitle">Show Colors</string> + <string key="NSKeyEquiv">C</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="214559597"> + <reference key="NSMenu" ref="786677654"/> + <bool key="NSIsDisabled">YES</bool> + <bool key="NSIsSeparator">YES</bool> + <string key="NSTitle"/> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="596732606"> + <reference key="NSMenu" ref="786677654"/> + <string key="NSTitle">Copy Style</string> + <string key="NSKeyEquiv">c</string> + <int key="NSKeyEquivModMask">1572864</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="393423671"> + <reference key="NSMenu" ref="786677654"/> + <string key="NSTitle">Paste Style</string> + <string key="NSKeyEquiv">v</string> + <int key="NSKeyEquivModMask">1572864</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + </object> + <string key="NSName">_NSFontMenu</string> + </object> + </object> + <object class="NSMenuItem" id="215659978"> + <reference key="NSMenu" ref="941447902"/> + <string key="NSTitle">Text</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <string key="NSAction">submenuAction:</string> + <object class="NSMenu" key="NSSubmenu" id="446991534"> + <string key="NSTitle">Text</string> + <object class="NSMutableArray" key="NSMenuItems"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSMenuItem" id="875092757"> + <reference key="NSMenu" ref="446991534"/> + <string key="NSTitle">Align Left</string> + <string key="NSKeyEquiv">{</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="630155264"> + <reference key="NSMenu" ref="446991534"/> + <string key="NSTitle">Center</string> + <string key="NSKeyEquiv">|</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="945678886"> + <reference key="NSMenu" ref="446991534"/> + <string key="NSTitle">Justify</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="512868991"> + <reference key="NSMenu" ref="446991534"/> + <string key="NSTitle">Align Right</string> + <string key="NSKeyEquiv">}</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="163117631"> + <reference key="NSMenu" ref="446991534"/> + <bool key="NSIsDisabled">YES</bool> + <bool key="NSIsSeparator">YES</bool> + <string key="NSTitle"/> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="31516759"> + <reference key="NSMenu" ref="446991534"/> + <string key="NSTitle">Writing Direction</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <string key="NSAction">submenuAction:</string> + <object class="NSMenu" key="NSSubmenu" id="956096989"> + <string key="NSTitle">Writing Direction</string> + <object class="NSMutableArray" key="NSMenuItems"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSMenuItem" id="257099033"> + <reference key="NSMenu" ref="956096989"/> + <bool key="NSIsDisabled">YES</bool> + <string key="NSTitle">Paragraph</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="551969625"> + <reference key="NSMenu" ref="956096989"/> + <string type="base64-UTF8" key="NSTitle">CURlZmF1bHQ</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="249532473"> + <reference key="NSMenu" ref="956096989"/> + <string type="base64-UTF8" key="NSTitle">CUxlZnQgdG8gUmlnaHQ</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="607364498"> + <reference key="NSMenu" ref="956096989"/> + <string type="base64-UTF8" key="NSTitle">CVJpZ2h0IHRvIExlZnQ</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="508151438"> + <reference key="NSMenu" ref="956096989"/> + <bool key="NSIsDisabled">YES</bool> + <bool key="NSIsSeparator">YES</bool> + <string key="NSTitle"/> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="981751889"> + <reference key="NSMenu" ref="956096989"/> + <bool key="NSIsDisabled">YES</bool> + <string key="NSTitle">Selection</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="380031999"> + <reference key="NSMenu" ref="956096989"/> + <string type="base64-UTF8" key="NSTitle">CURlZmF1bHQ</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="825984362"> + <reference key="NSMenu" ref="956096989"/> + <string type="base64-UTF8" key="NSTitle">CUxlZnQgdG8gUmlnaHQ</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="560145579"> + <reference key="NSMenu" ref="956096989"/> + <string type="base64-UTF8" key="NSTitle">CVJpZ2h0IHRvIExlZnQ</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + </object> + </object> + </object> + <object class="NSMenuItem" id="908105787"> + <reference key="NSMenu" ref="446991534"/> + <bool key="NSIsDisabled">YES</bool> + <bool key="NSIsSeparator">YES</bool> + <string key="NSTitle"/> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="644046920"> + <reference key="NSMenu" ref="446991534"/> + <string key="NSTitle">Show Ruler</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="231811626"> + <reference key="NSMenu" ref="446991534"/> + <string key="NSTitle">Copy Ruler</string> + <string key="NSKeyEquiv">c</string> + <int key="NSKeyEquivModMask">1310720</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="883618387"> + <reference key="NSMenu" ref="446991534"/> + <string key="NSTitle">Paste Ruler</string> + <string key="NSKeyEquiv">v</string> + <int key="NSKeyEquivModMask">1310720</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + </object> + </object> + </object> + </object> + </object> + </object> + <object class="NSMenuItem" id="586577488"> + <reference key="NSMenu" ref="649796088"/> + <string key="NSTitle">View</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <string key="NSAction">submenuAction:</string> + <object class="NSMenu" key="NSSubmenu" id="466310130"> + <string key="NSTitle">View</string> + <object class="NSMutableArray" key="NSMenuItems"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSMenuItem" id="102151532"> + <reference key="NSMenu" ref="466310130"/> + <string key="NSTitle">Show Toolbar</string> + <string key="NSKeyEquiv">t</string> + <int key="NSKeyEquivModMask">1572864</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="237841660"> + <reference key="NSMenu" ref="466310130"/> + <string key="NSTitle">Customize Toolbar…</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + </object> + </object> + </object> + <object class="NSMenuItem" id="713487014"> + <reference key="NSMenu" ref="649796088"/> + <string key="NSTitle">Window</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <string key="NSAction">submenuAction:</string> + <object class="NSMenu" key="NSSubmenu" id="835318025"> + <string key="NSTitle">Window</string> + <object class="NSMutableArray" key="NSMenuItems"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSMenuItem" id="1011231497"> + <reference key="NSMenu" ref="835318025"/> + <string key="NSTitle">Minimize</string> + <string key="NSKeyEquiv">m</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="575023229"> + <reference key="NSMenu" ref="835318025"/> + <string key="NSTitle">Zoom</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="299356726"> + <reference key="NSMenu" ref="835318025"/> + <bool key="NSIsDisabled">YES</bool> + <bool key="NSIsSeparator">YES</bool> + <string key="NSTitle"/> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="625202149"> + <reference key="NSMenu" ref="835318025"/> + <string key="NSTitle">Bring All to Front</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + </object> + <string key="NSName">_NSWindowsMenu</string> + </object> + </object> + <object class="NSMenuItem" id="448692316"> + <reference key="NSMenu" ref="649796088"/> + <string key="NSTitle">Help</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <string key="NSAction">submenuAction:</string> + <object class="NSMenu" key="NSSubmenu" id="992780483"> + <string key="NSTitle">Help</string> + <object class="NSMutableArray" key="NSMenuItems"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSMenuItem" id="105068016"> + <reference key="NSMenu" ref="992780483"/> + <string key="NSTitle">Cocoa Help</string> + <string key="NSKeyEquiv">?</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + </object> + <string key="NSName">_NSHelpMenu</string> + </object> + </object> + </object> + <string key="NSName">_NSMainMenu</string> + </object> + <object class="NSWindowTemplate" id="972006081"> + <int key="NSWindowStyleMask">7</int> + <int key="NSWindowBacking">2</int> + <string key="NSWindowRect">{{232, 390}, {485, 379}}</string> + <int key="NSWTFlags">1417150464</int> + <string key="NSWindowTitle">Cocoa</string> + <string key="NSWindowClass">SilentWindow</string> + <nil key="NSViewClass"/> + <nil key="NSUserInterfaceItemIdentifier"/> + <object class="NSView" key="NSWindowView" id="439893737"> + <reference key="NSNextResponder"/> + <int key="NSvFlags">256</int> + <object class="NSMutableArray" key="NSSubviews"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSPopUpButton" id="895645105"> + <reference key="NSNextResponder" ref="439893737"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{366, 35}, {97, 26}}</string> + <reference key="NSSuperview" ref="439893737"/> + <reference key="NSWindow"/> + <reference key="NSNextKeyView" ref="422780221"/> + <bool key="NSEnabled">YES</bool> + <object class="NSPopUpButtonCell" key="NSCell" id="939854878"> + <int key="NSCellFlags">-2076049856</int> + <int key="NSCellFlags2">134219776</int> + <object class="NSFont" key="NSSupport" id="507345084"> + <string key="NSName">LucidaGrande</string> + <double key="NSSize">13</double> + <int key="NSfFlags">1044</int> + </object> + <reference key="NSControlView" ref="895645105"/> + <int key="NSButtonFlags">-2035138305</int> + <int key="NSButtonFlags2">129</int> + <reference key="NSAlternateImage" ref="507345084"/> + <string key="NSAlternateContents"/> + <string key="NSKeyEquivalent"/> + <int key="NSPeriodicDelay">400</int> + <int key="NSPeriodicInterval">75</int> + <object class="NSMenuItem" key="NSMenuItem" id="468569656"> + <reference key="NSMenu" ref="526523505"/> + <string key="NSTitle">Blue</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <int key="NSState">1</int> + <object class="NSCustomResource" key="NSImage"> + <string key="NSClassName">NSImage</string> + <string key="NSResourceName">blue</string> + </object> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <string key="NSAction">_popUpItemAction:</string> + <reference key="NSTarget" ref="939854878"/> + </object> + <bool key="NSMenuItemRespectAlignment">YES</bool> + <object class="NSMenu" key="NSMenu" id="526523505"> + <string key="NSTitle">Color</string> + <object class="NSMutableArray" key="NSMenuItems"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="468569656"/> + <object class="NSMenuItem" id="461530193"> + <reference key="NSMenu" ref="526523505"/> + <string key="NSTitle">Green</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <object class="NSCustomResource" key="NSImage"> + <string key="NSClassName">NSImage</string> + <string key="NSResourceName">green</string> + </object> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <string key="NSAction">_popUpItemAction:</string> + <reference key="NSTarget" ref="939854878"/> + </object> + <object class="NSMenuItem" id="969578911"> + <reference key="NSMenu" ref="526523505"/> + <string key="NSTitle">Red</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <object class="NSCustomResource" key="NSImage"> + <string key="NSClassName">NSImage</string> + <string key="NSResourceName">red</string> + </object> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + <string key="NSAction">_popUpItemAction:</string> + <reference key="NSTarget" ref="939854878"/> + </object> + </object> + <reference key="NSMenuFont" ref="507345084"/> + </object> + <int key="NSSelectedIndex">-1</int> + <int key="NSPreferredEdge">1</int> + <bool key="NSUsesItemFromMenu">YES</bool> + <bool key="NSAltersState">YES</bool> + <int key="NSArrowPosition">2</int> + </object> + </object> + <object class="NSSlider" id="186246764"> + <reference key="NSNextResponder" ref="439893737"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{234, 34}, {28, 30}}</string> + <reference key="NSSuperview" ref="439893737"/> + <reference key="NSWindow"/> + <reference key="NSNextKeyView" ref="886444468"/> + <bool key="NSEnabled">YES</bool> + <object class="NSSliderCell" key="NSCell" id="171036244"> + <int key="NSCellFlags">67501824</int> + <int key="NSCellFlags2">0</int> + <string key="NSContents"/> + <reference key="NSControlView" ref="186246764"/> + <double key="NSMaxValue">359</double> + <double key="NSMinValue">0.0</double> + <double key="NSValue">0.0</double> + <double key="NSAltIncValue">0.0</double> + <int key="NSNumberOfTickMarks">0</int> + <int key="NSTickMarkPosition">1</int> + <bool key="NSAllowsTickMarkValuesOnly">NO</bool> + <bool key="NSVertical">NO</bool> + <int key="NSSliderType">1</int> + </object> + </object> + <object class="NSButton" id="336088134"> + <reference key="NSNextResponder" ref="439893737"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{18, 40}, {64, 18}}</string> + <reference key="NSSuperview" ref="439893737"/> + <reference key="NSWindow"/> + <reference key="NSNextKeyView" ref="482000415"/> + <bool key="NSEnabled">YES</bool> + <object class="NSButtonCell" key="NSCell" id="934915496"> + <int key="NSCellFlags">-2080244224</int> + <int key="NSCellFlags2">0</int> + <string key="NSContents">Visible</string> + <reference key="NSSupport" ref="507345084"/> + <reference key="NSControlView" ref="336088134"/> + <int key="NSButtonFlags">1211912703</int> + <int key="NSButtonFlags2">2</int> + <object class="NSCustomResource" key="NSNormalImage"> + <string key="NSClassName">NSImage</string> + <string key="NSResourceName">NSSwitch</string> + </object> + <object class="NSButtonImageSource" key="NSAlternateImage"> + <string key="NSImageName">NSSwitch</string> + </object> + <string key="NSAlternateContents"/> + <string key="NSKeyEquivalent"/> + <int key="NSPeriodicDelay">200</int> + <int key="NSPeriodicInterval">25</int> + </object> + </object> + <object class="NSTextField" id="482000415"> + <reference key="NSNextResponder" ref="439893737"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{172, 41}, {57, 17}}</string> + <reference key="NSSuperview" ref="439893737"/> + <reference key="NSWindow"/> + <reference key="NSNextKeyView" ref="186246764"/> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="575979405"> + <int key="NSCellFlags">68288064</int> + <int key="NSCellFlags2">272630784</int> + <string key="NSContents">Rotation</string> + <reference key="NSSupport" ref="507345084"/> + <reference key="NSControlView" ref="482000415"/> + <object class="NSColor" key="NSBackgroundColor" id="86428082"> + <int key="NSColorSpace">6</int> + <string key="NSCatalogName">System</string> + <string key="NSColorName">controlColor</string> + <object class="NSColor" key="NSColor"> + <int key="NSColorSpace">3</int> + <bytes key="NSWhite">MC42NjY2NjY2NjY3AA</bytes> + </object> + </object> + <object class="NSColor" key="NSTextColor" id="429197527"> + <int key="NSColorSpace">6</int> + <string key="NSCatalogName">System</string> + <string key="NSColorName">controlTextColor</string> + <object class="NSColor" key="NSColor" id="1073457999"> + <int key="NSColorSpace">3</int> + <bytes key="NSWhite">MAA</bytes> + </object> + </object> + </object> + </object> + <object class="NSTextField" id="886444468"> + <reference key="NSNextResponder" ref="439893737"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{325, 39}, {39, 17}}</string> + <reference key="NSSuperview" ref="439893737"/> + <reference key="NSWindow"/> + <reference key="NSNextKeyView" ref="895645105"/> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="67668546"> + <int key="NSCellFlags">68288064</int> + <int key="NSCellFlags2">272630784</int> + <string key="NSContents">Color</string> + <reference key="NSSupport" ref="507345084"/> + <reference key="NSControlView" ref="886444468"/> + <reference key="NSBackgroundColor" ref="86428082"/> + <reference key="NSTextColor" ref="429197527"/> + </object> + </object> + <object class="NSTextField" id="969295846"> + <reference key="NSNextResponder" ref="439893737"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{20, 337}, {359, 22}}</string> + <reference key="NSSuperview" ref="439893737"/> + <reference key="NSWindow"/> + <reference key="NSNextKeyView" ref="301002623"/> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="1043401668"> + <int key="NSCellFlags">-1803944383</int> + <int key="NSCellFlags2">272630848</int> + <string key="NSContents">Hello SFML!</string> + <reference key="NSSupport" ref="507345084"/> + <string key="NSPlaceholderString">Enter some text here</string> + <reference key="NSControlView" ref="969295846"/> + <bool key="NSDrawsBackground">YES</bool> + <object class="NSColor" key="NSBackgroundColor"> + <int key="NSColorSpace">6</int> + <string key="NSCatalogName">System</string> + <string key="NSColorName">textBackgroundColor</string> + <object class="NSColor" key="NSColor"> + <int key="NSColorSpace">3</int> + <bytes key="NSWhite">MQA</bytes> + </object> + </object> + <object class="NSColor" key="NSTextColor"> + <int key="NSColorSpace">6</int> + <string key="NSCatalogName">System</string> + <string key="NSColorName">textColor</string> + <reference key="NSColor" ref="1073457999"/> + </object> + <object class="NSArray" key="NSAllowedInputLocales"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>NSAllRomanInputSourcesLocaleIdentifier</string> + </object> + </object> + </object> + <object class="NSCustomView" id="301002623"> + <reference key="NSNextResponder" ref="439893737"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{20, 72}, {440, 260}}</string> + <reference key="NSSuperview" ref="439893737"/> + <reference key="NSWindow"/> + <reference key="NSNextKeyView" ref="531630843"/> + <string key="NSClassName">NSView</string> + </object> + <object class="NSButton" id="531630843"> + <reference key="NSNextResponder" ref="439893737"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{381, 331}, {85, 32}}</string> + <reference key="NSSuperview" ref="439893737"/> + <reference key="NSWindow"/> + <reference key="NSNextKeyView" ref="336088134"/> + <bool key="NSEnabled">YES</bool> + <object class="NSButtonCell" key="NSCell" id="1053978795"> + <int key="NSCellFlags">-2080244224</int> + <int key="NSCellFlags2">134217728</int> + <string key="NSContents">Update</string> + <reference key="NSSupport" ref="507345084"/> + <reference key="NSControlView" ref="531630843"/> + <int key="NSButtonFlags">-2038021889</int> + <int key="NSButtonFlags2">129</int> + <reference key="NSAlternateImage" ref="507345084"/> + <string key="NSAlternateContents"/> + <string type="base64-UTF8" key="NSKeyEquivalent">DQ</string> + <int key="NSPeriodicDelay">400</int> + <int key="NSPeriodicInterval">75</int> + </object> + </object> + <object class="NSTextField" id="422780221"> + <reference key="NSNextResponder" ref="439893737"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{17, 2}, {451, 17}}</string> + <reference key="NSSuperview" ref="439893737"/> + <reference key="NSWindow"/> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="702743979"> + <int key="NSCellFlags">68288064</int> + <int key="NSCellFlags2">272630784</int> + <string key="NSContents">Tips : you can use up and down arrows to scale the logo.</string> + <object class="NSFont" key="NSSupport"> + <string key="NSName">LucidaGrande</string> + <double key="NSSize">11</double> + <int key="NSfFlags">16</int> + </object> + <reference key="NSControlView" ref="422780221"/> + <reference key="NSBackgroundColor" ref="86428082"/> + <reference key="NSTextColor" ref="429197527"/> + </object> + </object> + </object> + <string key="NSFrameSize">{485, 379}</string> + <reference key="NSSuperview"/> + <reference key="NSWindow"/> + <reference key="NSNextKeyView" ref="969295846"/> + </object> + <string key="NSScreenRect">{{0, 0}, {1920, 1058}}</string> + <string key="NSMaxSize">{10000000000000, 10000000000000}</string> + <bool key="NSAutorecalculatesContentBorderThicknessMinY">NO</bool> + <double key="NSContentBorderThicknessMinY">22</double> + <bool key="NSWindowIsRestorable">YES</bool> + </object> + <object class="NSCustomObject" id="976324537"> + <string key="NSClassName">CocoaAppDelegate</string> + </object> + <object class="NSCustomObject" id="755631768"> + <string key="NSClassName">NSFontManager</string> + </object> + </object> + <object class="IBObjectContainer" key="IBDocument.Objects"> + <object class="NSMutableArray" key="connectionRecords"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">terminate:</string> + <reference key="source" ref="1050"/> + <reference key="destination" ref="632727374"/> + </object> + <int key="connectionID">449</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">orderFrontStandardAboutPanel:</string> + <reference key="source" ref="1021"/> + <reference key="destination" ref="238522557"/> + </object> + <int key="connectionID">142</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">delegate</string> + <reference key="source" ref="1021"/> + <reference key="destination" ref="976324537"/> + </object> + <int key="connectionID">495</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">performMiniaturize:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="1011231497"/> + </object> + <int key="connectionID">37</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">arrangeInFront:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="625202149"/> + </object> + <int key="connectionID">39</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">print:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="49223823"/> + </object> + <int key="connectionID">86</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">runPageLayout:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="294629803"/> + </object> + <int key="connectionID">87</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">clearRecentDocuments:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="759406840"/> + </object> + <int key="connectionID">127</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">performClose:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="776162233"/> + </object> + <int key="connectionID">193</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">toggleContinuousSpellChecking:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="948374510"/> + </object> + <int key="connectionID">222</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">undo:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="1058277027"/> + </object> + <int key="connectionID">223</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">copy:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="860595796"/> + </object> + <int key="connectionID">224</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">checkSpelling:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="96193923"/> + </object> + <int key="connectionID">225</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">paste:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="29853731"/> + </object> + <int key="connectionID">226</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">stopSpeaking:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="680220178"/> + </object> + <int key="connectionID">227</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">cut:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="296257095"/> + </object> + <int key="connectionID">228</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">showGuessPanel:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="679648819"/> + </object> + <int key="connectionID">230</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">redo:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="790794224"/> + </object> + <int key="connectionID">231</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">selectAll:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="583158037"/> + </object> + <int key="connectionID">232</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">startSpeaking:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="731782645"/> + </object> + <int key="connectionID">233</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">delete:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="437104165"/> + </object> + <int key="connectionID">235</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">performZoom:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="575023229"/> + </object> + <int key="connectionID">240</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">performFindPanelAction:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="447796847"/> + </object> + <int key="connectionID">241</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">centerSelectionInVisibleArea:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="88285865"/> + </object> + <int key="connectionID">245</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">toggleGrammarChecking:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="967646866"/> + </object> + <int key="connectionID">347</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">toggleSmartInsertDelete:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="605118523"/> + </object> + <int key="connectionID">355</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">toggleAutomaticQuoteSubstitution:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="197661976"/> + </object> + <int key="connectionID">356</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">toggleAutomaticLinkDetection:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="708854459"/> + </object> + <int key="connectionID">357</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">saveDocument:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="1023925487"/> + </object> + <int key="connectionID">362</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">saveDocumentAs:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="117038363"/> + </object> + <int key="connectionID">363</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">revertDocumentToSaved:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="579971712"/> + </object> + <int key="connectionID">364</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">runToolbarCustomizationPalette:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="237841660"/> + </object> + <int key="connectionID">365</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">toggleToolbarShown:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="102151532"/> + </object> + <int key="connectionID">366</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">hide:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="755159360"/> + </object> + <int key="connectionID">367</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">hideOtherApplications:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="342932134"/> + </object> + <int key="connectionID">368</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">unhideAllApplications:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="908899353"/> + </object> + <int key="connectionID">370</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">newDocument:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="705341025"/> + </object> + <int key="connectionID">373</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">openDocument:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="722745758"/> + </object> + <int key="connectionID">374</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">raiseBaseline:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="941806246"/> + </object> + <int key="connectionID">426</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">lowerBaseline:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="1045724900"/> + </object> + <int key="connectionID">427</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">copyFont:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="596732606"/> + </object> + <int key="connectionID">428</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">subscript:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="1037576581"/> + </object> + <int key="connectionID">429</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">superscript:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="644725453"/> + </object> + <int key="connectionID">430</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">tightenKerning:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="677519740"/> + </object> + <int key="connectionID">431</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">underline:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="330926929"/> + </object> + <int key="connectionID">432</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">orderFrontColorPanel:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="1012600125"/> + </object> + <int key="connectionID">433</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">useAllLigatures:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="663508465"/> + </object> + <int key="connectionID">434</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">loosenKerning:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="238351151"/> + </object> + <int key="connectionID">435</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">pasteFont:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="393423671"/> + </object> + <int key="connectionID">436</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">unscript:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="257962622"/> + </object> + <int key="connectionID">437</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">useStandardKerning:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="252969304"/> + </object> + <int key="connectionID">438</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">useStandardLigatures:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="706297211"/> + </object> + <int key="connectionID">439</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">turnOffLigatures:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="568384683"/> + </object> + <int key="connectionID">440</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">turnOffKerning:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="766922938"/> + </object> + <int key="connectionID">441</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">toggleAutomaticSpellingCorrection:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="795346622"/> + </object> + <int key="connectionID">456</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">orderFrontSubstitutionsPanel:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="65139061"/> + </object> + <int key="connectionID">458</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">toggleAutomaticDashSubstitution:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="672708820"/> + </object> + <int key="connectionID">461</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">toggleAutomaticTextReplacement:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="537092702"/> + </object> + <int key="connectionID">463</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">uppercaseWord:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="1060694897"/> + </object> + <int key="connectionID">464</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">capitalizeWord:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="56570060"/> + </object> + <int key="connectionID">467</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">lowercaseWord:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="879586729"/> + </object> + <int key="connectionID">468</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">pasteAsPlainText:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="82994268"/> + </object> + <int key="connectionID">486</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">performFindPanelAction:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="326711663"/> + </object> + <int key="connectionID">487</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">performFindPanelAction:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="270902937"/> + </object> + <int key="connectionID">488</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">performFindPanelAction:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="159080638"/> + </object> + <int key="connectionID">489</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">showHelp:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="105068016"/> + </object> + <int key="connectionID">493</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">alignCenter:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="630155264"/> + </object> + <int key="connectionID">518</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">pasteRuler:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="883618387"/> + </object> + <int key="connectionID">519</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">toggleRuler:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="644046920"/> + </object> + <int key="connectionID">520</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">alignRight:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="512868991"/> + </object> + <int key="connectionID">521</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">copyRuler:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="231811626"/> + </object> + <int key="connectionID">522</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">alignJustified:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="945678886"/> + </object> + <int key="connectionID">523</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">alignLeft:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="875092757"/> + </object> + <int key="connectionID">524</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">makeBaseWritingDirectionNatural:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="551969625"/> + </object> + <int key="connectionID">525</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">makeBaseWritingDirectionLeftToRight:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="249532473"/> + </object> + <int key="connectionID">526</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">makeBaseWritingDirectionRightToLeft:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="607364498"/> + </object> + <int key="connectionID">527</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">makeTextWritingDirectionNatural:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="380031999"/> + </object> + <int key="connectionID">528</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">makeTextWritingDirectionLeftToRight:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="825984362"/> + </object> + <int key="connectionID">529</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">makeTextWritingDirectionRightToLeft:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="560145579"/> + </object> + <int key="connectionID">530</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">initialFirstResponder</string> + <reference key="source" ref="972006081"/> + <reference key="destination" ref="969295846"/> + </object> + <int key="connectionID">559</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">addFontTrait:</string> + <reference key="source" ref="755631768"/> + <reference key="destination" ref="305399458"/> + </object> + <int key="connectionID">421</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">addFontTrait:</string> + <reference key="source" ref="755631768"/> + <reference key="destination" ref="814362025"/> + </object> + <int key="connectionID">422</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">modifyFont:</string> + <reference key="source" ref="755631768"/> + <reference key="destination" ref="885547335"/> + </object> + <int key="connectionID">423</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">orderFrontFontPanel:</string> + <reference key="source" ref="755631768"/> + <reference key="destination" ref="159677712"/> + </object> + <int key="connectionID">424</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">modifyFont:</string> + <reference key="source" ref="755631768"/> + <reference key="destination" ref="158063935"/> + </object> + <int key="connectionID">425</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">window</string> + <reference key="source" ref="976324537"/> + <reference key="destination" ref="972006081"/> + </object> + <int key="connectionID">532</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">colorChanged:</string> + <reference key="source" ref="976324537"/> + <reference key="destination" ref="895645105"/> + </object> + <int key="connectionID">557</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">sfmlView</string> + <reference key="source" ref="976324537"/> + <reference key="destination" ref="301002623"/> + </object> + <int key="connectionID">558</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">rotationChanged:</string> + <reference key="source" ref="976324537"/> + <reference key="destination" ref="186246764"/> + </object> + <int key="connectionID">560</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">visibleChanged:</string> + <reference key="source" ref="976324537"/> + <reference key="destination" ref="336088134"/> + </object> + <int key="connectionID">561</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">textChanged:</string> + <reference key="source" ref="976324537"/> + <reference key="destination" ref="969295846"/> + </object> + <int key="connectionID">562</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">textField</string> + <reference key="source" ref="976324537"/> + <reference key="destination" ref="969295846"/> + </object> + <int key="connectionID">566</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">updateText:</string> + <reference key="source" ref="976324537"/> + <reference key="destination" ref="531630843"/> + </object> + <int key="connectionID">567</int> + </object> + </object> + <object class="IBMutableOrderedSet" key="objectRecords"> + <object class="NSArray" key="orderedObjects"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="IBObjectRecord"> + <int key="objectID">0</int> + <object class="NSArray" key="object" id="0"> + <bool key="EncodedWithXMLCoder">YES</bool> + </object> + <reference key="children" ref="1048"/> + <nil key="parent"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">-2</int> + <reference key="object" ref="1021"/> + <reference key="parent" ref="0"/> + <string key="objectName">File's Owner</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">-1</int> + <reference key="object" ref="1014"/> + <reference key="parent" ref="0"/> + <string key="objectName">First Responder</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">-3</int> + <reference key="object" ref="1050"/> + <reference key="parent" ref="0"/> + <string key="objectName">Application</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">29</int> + <reference key="object" ref="649796088"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="713487014"/> + <reference ref="694149608"/> + <reference ref="952259628"/> + <reference ref="379814623"/> + <reference ref="586577488"/> + <reference ref="302598603"/> + <reference ref="448692316"/> + </object> + <reference key="parent" ref="0"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">19</int> + <reference key="object" ref="713487014"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="835318025"/> + </object> + <reference key="parent" ref="649796088"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">56</int> + <reference key="object" ref="694149608"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="110575045"/> + </object> + <reference key="parent" ref="649796088"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">217</int> + <reference key="object" ref="952259628"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="789758025"/> + </object> + <reference key="parent" ref="649796088"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">83</int> + <reference key="object" ref="379814623"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="720053764"/> + </object> + <reference key="parent" ref="649796088"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">81</int> + <reference key="object" ref="720053764"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="1023925487"/> + <reference ref="117038363"/> + <reference ref="49223823"/> + <reference ref="722745758"/> + <reference ref="705341025"/> + <reference ref="1025936716"/> + <reference ref="294629803"/> + <reference ref="776162233"/> + <reference ref="425164168"/> + <reference ref="579971712"/> + <reference ref="1010469920"/> + </object> + <reference key="parent" ref="379814623"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">75</int> + <reference key="object" ref="1023925487"/> + <reference key="parent" ref="720053764"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">80</int> + <reference key="object" ref="117038363"/> + <reference key="parent" ref="720053764"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">78</int> + <reference key="object" ref="49223823"/> + <reference key="parent" ref="720053764"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">72</int> + <reference key="object" ref="722745758"/> + <reference key="parent" ref="720053764"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">82</int> + <reference key="object" ref="705341025"/> + <reference key="parent" ref="720053764"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">124</int> + <reference key="object" ref="1025936716"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="1065607017"/> + </object> + <reference key="parent" ref="720053764"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">77</int> + <reference key="object" ref="294629803"/> + <reference key="parent" ref="720053764"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">73</int> + <reference key="object" ref="776162233"/> + <reference key="parent" ref="720053764"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">79</int> + <reference key="object" ref="425164168"/> + <reference key="parent" ref="720053764"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">112</int> + <reference key="object" ref="579971712"/> + <reference key="parent" ref="720053764"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">74</int> + <reference key="object" ref="1010469920"/> + <reference key="parent" ref="720053764"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">125</int> + <reference key="object" ref="1065607017"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="759406840"/> + </object> + <reference key="parent" ref="1025936716"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">126</int> + <reference key="object" ref="759406840"/> + <reference key="parent" ref="1065607017"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">205</int> + <reference key="object" ref="789758025"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="437104165"/> + <reference ref="583158037"/> + <reference ref="1058277027"/> + <reference ref="212016141"/> + <reference ref="296257095"/> + <reference ref="29853731"/> + <reference ref="860595796"/> + <reference ref="1040322652"/> + <reference ref="790794224"/> + <reference ref="892235320"/> + <reference ref="972420730"/> + <reference ref="676164635"/> + <reference ref="507821607"/> + <reference ref="288088188"/> + <reference ref="82994268"/> + </object> + <reference key="parent" ref="952259628"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">202</int> + <reference key="object" ref="437104165"/> + <reference key="parent" ref="789758025"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">198</int> + <reference key="object" ref="583158037"/> + <reference key="parent" ref="789758025"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">207</int> + <reference key="object" ref="1058277027"/> + <reference key="parent" ref="789758025"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">214</int> + <reference key="object" ref="212016141"/> + <reference key="parent" ref="789758025"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">199</int> + <reference key="object" ref="296257095"/> + <reference key="parent" ref="789758025"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">203</int> + <reference key="object" ref="29853731"/> + <reference key="parent" ref="789758025"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">197</int> + <reference key="object" ref="860595796"/> + <reference key="parent" ref="789758025"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">206</int> + <reference key="object" ref="1040322652"/> + <reference key="parent" ref="789758025"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">215</int> + <reference key="object" ref="790794224"/> + <reference key="parent" ref="789758025"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">218</int> + <reference key="object" ref="892235320"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="963351320"/> + </object> + <reference key="parent" ref="789758025"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">216</int> + <reference key="object" ref="972420730"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="769623530"/> + </object> + <reference key="parent" ref="789758025"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">200</int> + <reference key="object" ref="769623530"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="948374510"/> + <reference ref="96193923"/> + <reference ref="679648819"/> + <reference ref="967646866"/> + <reference ref="859480356"/> + <reference ref="795346622"/> + </object> + <reference key="parent" ref="972420730"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">219</int> + <reference key="object" ref="948374510"/> + <reference key="parent" ref="769623530"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">201</int> + <reference key="object" ref="96193923"/> + <reference key="parent" ref="769623530"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">204</int> + <reference key="object" ref="679648819"/> + <reference key="parent" ref="769623530"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">220</int> + <reference key="object" ref="963351320"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="270902937"/> + <reference ref="88285865"/> + <reference ref="159080638"/> + <reference ref="326711663"/> + <reference ref="447796847"/> + </object> + <reference key="parent" ref="892235320"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">213</int> + <reference key="object" ref="270902937"/> + <reference key="parent" ref="963351320"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">210</int> + <reference key="object" ref="88285865"/> + <reference key="parent" ref="963351320"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">221</int> + <reference key="object" ref="159080638"/> + <reference key="parent" ref="963351320"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">208</int> + <reference key="object" ref="326711663"/> + <reference key="parent" ref="963351320"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">209</int> + <reference key="object" ref="447796847"/> + <reference key="parent" ref="963351320"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">57</int> + <reference key="object" ref="110575045"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="238522557"/> + <reference ref="755159360"/> + <reference ref="908899353"/> + <reference ref="632727374"/> + <reference ref="646227648"/> + <reference ref="609285721"/> + <reference ref="481834944"/> + <reference ref="304266470"/> + <reference ref="1046388886"/> + <reference ref="1056857174"/> + <reference ref="342932134"/> + </object> + <reference key="parent" ref="694149608"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">58</int> + <reference key="object" ref="238522557"/> + <reference key="parent" ref="110575045"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">134</int> + <reference key="object" ref="755159360"/> + <reference key="parent" ref="110575045"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">150</int> + <reference key="object" ref="908899353"/> + <reference key="parent" ref="110575045"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">136</int> + <reference key="object" ref="632727374"/> + <reference key="parent" ref="110575045"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">144</int> + <reference key="object" ref="646227648"/> + <reference key="parent" ref="110575045"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">129</int> + <reference key="object" ref="609285721"/> + <reference key="parent" ref="110575045"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">143</int> + <reference key="object" ref="481834944"/> + <reference key="parent" ref="110575045"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">236</int> + <reference key="object" ref="304266470"/> + <reference key="parent" ref="110575045"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">131</int> + <reference key="object" ref="1046388886"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="752062318"/> + </object> + <reference key="parent" ref="110575045"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">149</int> + <reference key="object" ref="1056857174"/> + <reference key="parent" ref="110575045"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">145</int> + <reference key="object" ref="342932134"/> + <reference key="parent" ref="110575045"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">130</int> + <reference key="object" ref="752062318"/> + <reference key="parent" ref="1046388886"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">24</int> + <reference key="object" ref="835318025"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="299356726"/> + <reference ref="625202149"/> + <reference ref="575023229"/> + <reference ref="1011231497"/> + </object> + <reference key="parent" ref="713487014"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">92</int> + <reference key="object" ref="299356726"/> + <reference key="parent" ref="835318025"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5</int> + <reference key="object" ref="625202149"/> + <reference key="parent" ref="835318025"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">239</int> + <reference key="object" ref="575023229"/> + <reference key="parent" ref="835318025"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">23</int> + <reference key="object" ref="1011231497"/> + <reference key="parent" ref="835318025"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">295</int> + <reference key="object" ref="586577488"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="466310130"/> + </object> + <reference key="parent" ref="649796088"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">296</int> + <reference key="object" ref="466310130"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="102151532"/> + <reference ref="237841660"/> + </object> + <reference key="parent" ref="586577488"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">297</int> + <reference key="object" ref="102151532"/> + <reference key="parent" ref="466310130"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">298</int> + <reference key="object" ref="237841660"/> + <reference key="parent" ref="466310130"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">211</int> + <reference key="object" ref="676164635"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="785027613"/> + </object> + <reference key="parent" ref="789758025"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">212</int> + <reference key="object" ref="785027613"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="680220178"/> + <reference ref="731782645"/> + </object> + <reference key="parent" ref="676164635"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">195</int> + <reference key="object" ref="680220178"/> + <reference key="parent" ref="785027613"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">196</int> + <reference key="object" ref="731782645"/> + <reference key="parent" ref="785027613"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">346</int> + <reference key="object" ref="967646866"/> + <reference key="parent" ref="769623530"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">348</int> + <reference key="object" ref="507821607"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="698887838"/> + </object> + <reference key="parent" ref="789758025"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">349</int> + <reference key="object" ref="698887838"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="605118523"/> + <reference ref="197661976"/> + <reference ref="708854459"/> + <reference ref="65139061"/> + <reference ref="19036812"/> + <reference ref="672708820"/> + <reference ref="537092702"/> + </object> + <reference key="parent" ref="507821607"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">350</int> + <reference key="object" ref="605118523"/> + <reference key="parent" ref="698887838"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">351</int> + <reference key="object" ref="197661976"/> + <reference key="parent" ref="698887838"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">354</int> + <reference key="object" ref="708854459"/> + <reference key="parent" ref="698887838"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">371</int> + <reference key="object" ref="972006081"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="439893737"/> + </object> + <reference key="parent" ref="0"/> + <string key="objectName">Main Window</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">372</int> + <reference key="object" ref="439893737"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="895645105"/> + <reference ref="886444468"/> + <reference ref="336088134"/> + <reference ref="186246764"/> + <reference ref="482000415"/> + <reference ref="969295846"/> + <reference ref="301002623"/> + <reference ref="531630843"/> + <reference ref="422780221"/> + </object> + <reference key="parent" ref="972006081"/> + <string key="objectName">Content View</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">375</int> + <reference key="object" ref="302598603"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="941447902"/> + </object> + <reference key="parent" ref="649796088"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">376</int> + <reference key="object" ref="941447902"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="792887677"/> + <reference ref="215659978"/> + </object> + <reference key="parent" ref="302598603"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">377</int> + <reference key="object" ref="792887677"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="786677654"/> + </object> + <reference key="parent" ref="941447902"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">388</int> + <reference key="object" ref="786677654"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="159677712"/> + <reference ref="305399458"/> + <reference ref="814362025"/> + <reference ref="330926929"/> + <reference ref="533507878"/> + <reference ref="158063935"/> + <reference ref="885547335"/> + <reference ref="901062459"/> + <reference ref="767671776"/> + <reference ref="691570813"/> + <reference ref="769124883"/> + <reference ref="739652853"/> + <reference ref="1012600125"/> + <reference ref="214559597"/> + <reference ref="596732606"/> + <reference ref="393423671"/> + </object> + <reference key="parent" ref="792887677"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">389</int> + <reference key="object" ref="159677712"/> + <reference key="parent" ref="786677654"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">390</int> + <reference key="object" ref="305399458"/> + <reference key="parent" ref="786677654"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">391</int> + <reference key="object" ref="814362025"/> + <reference key="parent" ref="786677654"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">392</int> + <reference key="object" ref="330926929"/> + <reference key="parent" ref="786677654"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">393</int> + <reference key="object" ref="533507878"/> + <reference key="parent" ref="786677654"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">394</int> + <reference key="object" ref="158063935"/> + <reference key="parent" ref="786677654"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">395</int> + <reference key="object" ref="885547335"/> + <reference key="parent" ref="786677654"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">396</int> + <reference key="object" ref="901062459"/> + <reference key="parent" ref="786677654"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">397</int> + <reference key="object" ref="767671776"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="175441468"/> + </object> + <reference key="parent" ref="786677654"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">398</int> + <reference key="object" ref="691570813"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="1058217995"/> + </object> + <reference key="parent" ref="786677654"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">399</int> + <reference key="object" ref="769124883"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="18263474"/> + </object> + <reference key="parent" ref="786677654"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">400</int> + <reference key="object" ref="739652853"/> + <reference key="parent" ref="786677654"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">401</int> + <reference key="object" ref="1012600125"/> + <reference key="parent" ref="786677654"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">402</int> + <reference key="object" ref="214559597"/> + <reference key="parent" ref="786677654"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">403</int> + <reference key="object" ref="596732606"/> + <reference key="parent" ref="786677654"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">404</int> + <reference key="object" ref="393423671"/> + <reference key="parent" ref="786677654"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">405</int> + <reference key="object" ref="18263474"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="257962622"/> + <reference ref="644725453"/> + <reference ref="1037576581"/> + <reference ref="941806246"/> + <reference ref="1045724900"/> + </object> + <reference key="parent" ref="769124883"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">406</int> + <reference key="object" ref="257962622"/> + <reference key="parent" ref="18263474"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">407</int> + <reference key="object" ref="644725453"/> + <reference key="parent" ref="18263474"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">408</int> + <reference key="object" ref="1037576581"/> + <reference key="parent" ref="18263474"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">409</int> + <reference key="object" ref="941806246"/> + <reference key="parent" ref="18263474"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">410</int> + <reference key="object" ref="1045724900"/> + <reference key="parent" ref="18263474"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">411</int> + <reference key="object" ref="1058217995"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="706297211"/> + <reference ref="568384683"/> + <reference ref="663508465"/> + </object> + <reference key="parent" ref="691570813"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">412</int> + <reference key="object" ref="706297211"/> + <reference key="parent" ref="1058217995"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">413</int> + <reference key="object" ref="568384683"/> + <reference key="parent" ref="1058217995"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">414</int> + <reference key="object" ref="663508465"/> + <reference key="parent" ref="1058217995"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">415</int> + <reference key="object" ref="175441468"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="252969304"/> + <reference ref="766922938"/> + <reference ref="677519740"/> + <reference ref="238351151"/> + </object> + <reference key="parent" ref="767671776"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">416</int> + <reference key="object" ref="252969304"/> + <reference key="parent" ref="175441468"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">417</int> + <reference key="object" ref="766922938"/> + <reference key="parent" ref="175441468"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">418</int> + <reference key="object" ref="677519740"/> + <reference key="parent" ref="175441468"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">419</int> + <reference key="object" ref="238351151"/> + <reference key="parent" ref="175441468"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">420</int> + <reference key="object" ref="755631768"/> + <reference key="parent" ref="0"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">450</int> + <reference key="object" ref="288088188"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="579392910"/> + </object> + <reference key="parent" ref="789758025"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">451</int> + <reference key="object" ref="579392910"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="1060694897"/> + <reference ref="879586729"/> + <reference ref="56570060"/> + </object> + <reference key="parent" ref="288088188"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">452</int> + <reference key="object" ref="1060694897"/> + <reference key="parent" ref="579392910"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">453</int> + <reference key="object" ref="859480356"/> + <reference key="parent" ref="769623530"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">454</int> + <reference key="object" ref="795346622"/> + <reference key="parent" ref="769623530"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">457</int> + <reference key="object" ref="65139061"/> + <reference key="parent" ref="698887838"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">459</int> + <reference key="object" ref="19036812"/> + <reference key="parent" ref="698887838"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">460</int> + <reference key="object" ref="672708820"/> + <reference key="parent" ref="698887838"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">462</int> + <reference key="object" ref="537092702"/> + <reference key="parent" ref="698887838"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">465</int> + <reference key="object" ref="879586729"/> + <reference key="parent" ref="579392910"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">466</int> + <reference key="object" ref="56570060"/> + <reference key="parent" ref="579392910"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">485</int> + <reference key="object" ref="82994268"/> + <reference key="parent" ref="789758025"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">490</int> + <reference key="object" ref="448692316"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="992780483"/> + </object> + <reference key="parent" ref="649796088"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">491</int> + <reference key="object" ref="992780483"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="105068016"/> + </object> + <reference key="parent" ref="448692316"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">492</int> + <reference key="object" ref="105068016"/> + <reference key="parent" ref="992780483"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">494</int> + <reference key="object" ref="976324537"/> + <reference key="parent" ref="0"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">496</int> + <reference key="object" ref="215659978"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="446991534"/> + </object> + <reference key="parent" ref="941447902"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">497</int> + <reference key="object" ref="446991534"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="875092757"/> + <reference ref="630155264"/> + <reference ref="945678886"/> + <reference ref="512868991"/> + <reference ref="163117631"/> + <reference ref="31516759"/> + <reference ref="908105787"/> + <reference ref="644046920"/> + <reference ref="231811626"/> + <reference ref="883618387"/> + </object> + <reference key="parent" ref="215659978"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">498</int> + <reference key="object" ref="875092757"/> + <reference key="parent" ref="446991534"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">499</int> + <reference key="object" ref="630155264"/> + <reference key="parent" ref="446991534"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">500</int> + <reference key="object" ref="945678886"/> + <reference key="parent" ref="446991534"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">501</int> + <reference key="object" ref="512868991"/> + <reference key="parent" ref="446991534"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">502</int> + <reference key="object" ref="163117631"/> + <reference key="parent" ref="446991534"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">503</int> + <reference key="object" ref="31516759"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="956096989"/> + </object> + <reference key="parent" ref="446991534"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">504</int> + <reference key="object" ref="908105787"/> + <reference key="parent" ref="446991534"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">505</int> + <reference key="object" ref="644046920"/> + <reference key="parent" ref="446991534"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">506</int> + <reference key="object" ref="231811626"/> + <reference key="parent" ref="446991534"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">507</int> + <reference key="object" ref="883618387"/> + <reference key="parent" ref="446991534"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">508</int> + <reference key="object" ref="956096989"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="257099033"/> + <reference ref="551969625"/> + <reference ref="249532473"/> + <reference ref="607364498"/> + <reference ref="508151438"/> + <reference ref="981751889"/> + <reference ref="380031999"/> + <reference ref="825984362"/> + <reference ref="560145579"/> + </object> + <reference key="parent" ref="31516759"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">509</int> + <reference key="object" ref="257099033"/> + <reference key="parent" ref="956096989"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">510</int> + <reference key="object" ref="551969625"/> + <reference key="parent" ref="956096989"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">511</int> + <reference key="object" ref="249532473"/> + <reference key="parent" ref="956096989"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">512</int> + <reference key="object" ref="607364498"/> + <reference key="parent" ref="956096989"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">513</int> + <reference key="object" ref="508151438"/> + <reference key="parent" ref="956096989"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">514</int> + <reference key="object" ref="981751889"/> + <reference key="parent" ref="956096989"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">515</int> + <reference key="object" ref="380031999"/> + <reference key="parent" ref="956096989"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">516</int> + <reference key="object" ref="825984362"/> + <reference key="parent" ref="956096989"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">517</int> + <reference key="object" ref="560145579"/> + <reference key="parent" ref="956096989"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">533</int> + <reference key="object" ref="895645105"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="939854878"/> + </object> + <reference key="parent" ref="439893737"/> + <string key="objectName">Color</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">534</int> + <reference key="object" ref="939854878"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="526523505"/> + </object> + <reference key="parent" ref="895645105"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">535</int> + <reference key="object" ref="526523505"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="969578911"/> + <reference ref="468569656"/> + <reference ref="461530193"/> + </object> + <reference key="parent" ref="939854878"/> + <string key="objectName">Menu - Color</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">536</int> + <reference key="object" ref="969578911"/> + <reference key="parent" ref="526523505"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">537</int> + <reference key="object" ref="468569656"/> + <reference key="parent" ref="526523505"/> + <string key="objectName">Menu Item - Red</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">538</int> + <reference key="object" ref="461530193"/> + <reference key="parent" ref="526523505"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">541</int> + <reference key="object" ref="336088134"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="934915496"/> + </object> + <reference key="parent" ref="439893737"/> + <string key="objectName">Visible</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">542</int> + <reference key="object" ref="934915496"/> + <reference key="parent" ref="336088134"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">545</int> + <reference key="object" ref="886444468"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="67668546"/> + </object> + <reference key="parent" ref="439893737"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">546</int> + <reference key="object" ref="67668546"/> + <reference key="parent" ref="886444468"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">539</int> + <reference key="object" ref="186246764"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="171036244"/> + </object> + <reference key="parent" ref="439893737"/> + <string key="objectName">Rotation</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">540</int> + <reference key="object" ref="171036244"/> + <reference key="parent" ref="186246764"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">543</int> + <reference key="object" ref="482000415"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="575979405"/> + </object> + <reference key="parent" ref="439893737"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">544</int> + <reference key="object" ref="575979405"/> + <reference key="parent" ref="482000415"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">552</int> + <reference key="object" ref="969295846"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="1043401668"/> + </object> + <reference key="parent" ref="439893737"/> + <string key="objectName">Text</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">553</int> + <reference key="object" ref="1043401668"/> + <reference key="parent" ref="969295846"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">554</int> + <reference key="object" ref="301002623"/> + <reference key="parent" ref="439893737"/> + <string key="objectName">SFML view</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">564</int> + <reference key="object" ref="531630843"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="1053978795"/> + </object> + <reference key="parent" ref="439893737"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">565</int> + <reference key="object" ref="1053978795"/> + <reference key="parent" ref="531630843"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">568</int> + <reference key="object" ref="422780221"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="702743979"/> + </object> + <reference key="parent" ref="439893737"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">569</int> + <reference key="object" ref="702743979"/> + <reference key="parent" ref="422780221"/> + </object> + </object> + </object> + <object class="NSMutableDictionary" key="flattenedProperties"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSArray" key="dict.sortedKeys"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>-1.IBPluginDependency</string> + <string>-2.IBPluginDependency</string> + <string>-3.IBPluginDependency</string> + <string>112.IBPluginDependency</string> + <string>124.IBPluginDependency</string> + <string>125.IBPluginDependency</string> + <string>126.IBPluginDependency</string> + <string>129.IBPluginDependency</string> + <string>130.IBPluginDependency</string> + <string>131.IBPluginDependency</string> + <string>134.IBPluginDependency</string> + <string>136.IBPluginDependency</string> + <string>143.IBPluginDependency</string> + <string>144.IBPluginDependency</string> + <string>145.IBPluginDependency</string> + <string>149.IBPluginDependency</string> + <string>150.IBPluginDependency</string> + <string>19.IBPluginDependency</string> + <string>195.IBPluginDependency</string> + <string>196.IBPluginDependency</string> + <string>197.IBPluginDependency</string> + <string>198.IBPluginDependency</string> + <string>199.IBPluginDependency</string> + <string>200.IBPluginDependency</string> + <string>201.IBPluginDependency</string> + <string>202.IBPluginDependency</string> + <string>203.IBPluginDependency</string> + <string>204.IBPluginDependency</string> + <string>205.IBPluginDependency</string> + <string>206.IBPluginDependency</string> + <string>207.IBPluginDependency</string> + <string>208.IBPluginDependency</string> + <string>209.IBPluginDependency</string> + <string>210.IBPluginDependency</string> + <string>211.IBPluginDependency</string> + <string>212.IBPluginDependency</string> + <string>213.IBPluginDependency</string> + <string>214.IBPluginDependency</string> + <string>215.IBPluginDependency</string> + <string>216.IBPluginDependency</string> + <string>217.IBPluginDependency</string> + <string>218.IBPluginDependency</string> + <string>219.IBPluginDependency</string> + <string>220.IBPluginDependency</string> + <string>221.IBPluginDependency</string> + <string>23.IBPluginDependency</string> + <string>236.IBPluginDependency</string> + <string>239.IBPluginDependency</string> + <string>24.IBPluginDependency</string> + <string>29.IBPluginDependency</string> + <string>295.IBPluginDependency</string> + <string>296.IBPluginDependency</string> + <string>297.IBPluginDependency</string> + <string>298.IBPluginDependency</string> + <string>346.IBPluginDependency</string> + <string>348.IBPluginDependency</string> + <string>349.IBPluginDependency</string> + <string>350.IBPluginDependency</string> + <string>351.IBPluginDependency</string> + <string>354.IBPluginDependency</string> + <string>371.IBNSWindowAutoPositionCentersHorizontal</string> + <string>371.IBNSWindowAutoPositionCentersVertical</string> + <string>371.IBPluginDependency</string> + <string>371.IBWindowTemplateEditedContentRect</string> + <string>371.NSWindowTemplate.visibleAtLaunch</string> + <string>372.IBPluginDependency</string> + <string>375.IBPluginDependency</string> + <string>376.IBPluginDependency</string> + <string>377.IBPluginDependency</string> + <string>388.IBPluginDependency</string> + <string>389.IBPluginDependency</string> + <string>390.IBPluginDependency</string> + <string>391.IBPluginDependency</string> + <string>392.IBPluginDependency</string> + <string>393.IBPluginDependency</string> + <string>394.IBPluginDependency</string> + <string>395.IBPluginDependency</string> + <string>396.IBPluginDependency</string> + <string>397.IBPluginDependency</string> + <string>398.IBPluginDependency</string> + <string>399.IBPluginDependency</string> + <string>400.IBPluginDependency</string> + <string>401.IBPluginDependency</string> + <string>402.IBPluginDependency</string> + <string>403.IBPluginDependency</string> + <string>404.IBPluginDependency</string> + <string>405.IBPluginDependency</string> + <string>406.IBPluginDependency</string> + <string>407.IBPluginDependency</string> + <string>408.IBPluginDependency</string> + <string>409.IBPluginDependency</string> + <string>410.IBPluginDependency</string> + <string>411.IBPluginDependency</string> + <string>412.IBPluginDependency</string> + <string>413.IBPluginDependency</string> + <string>414.IBPluginDependency</string> + <string>415.IBPluginDependency</string> + <string>416.IBPluginDependency</string> + <string>417.IBPluginDependency</string> + <string>418.IBPluginDependency</string> + <string>419.IBPluginDependency</string> + <string>420.IBPluginDependency</string> + <string>450.IBPluginDependency</string> + <string>451.IBPluginDependency</string> + <string>452.IBPluginDependency</string> + <string>453.IBPluginDependency</string> + <string>454.IBPluginDependency</string> + <string>457.IBPluginDependency</string> + <string>459.IBPluginDependency</string> + <string>460.IBPluginDependency</string> + <string>462.IBPluginDependency</string> + <string>465.IBPluginDependency</string> + <string>466.IBPluginDependency</string> + <string>485.IBPluginDependency</string> + <string>490.IBPluginDependency</string> + <string>491.IBPluginDependency</string> + <string>492.IBPluginDependency</string> + <string>494.IBPluginDependency</string> + <string>496.IBPluginDependency</string> + <string>497.IBPluginDependency</string> + <string>498.IBPluginDependency</string> + <string>499.IBPluginDependency</string> + <string>5.IBPluginDependency</string> + <string>500.IBPluginDependency</string> + <string>501.IBPluginDependency</string> + <string>502.IBPluginDependency</string> + <string>503.IBPluginDependency</string> + <string>504.IBPluginDependency</string> + <string>505.IBPluginDependency</string> + <string>506.IBPluginDependency</string> + <string>507.IBPluginDependency</string> + <string>508.IBPluginDependency</string> + <string>509.IBPluginDependency</string> + <string>510.IBPluginDependency</string> + <string>511.IBPluginDependency</string> + <string>512.IBPluginDependency</string> + <string>513.IBPluginDependency</string> + <string>514.IBPluginDependency</string> + <string>515.IBPluginDependency</string> + <string>516.IBPluginDependency</string> + <string>517.IBPluginDependency</string> + <string>533.IBPluginDependency</string> + <string>534.IBPluginDependency</string> + <string>535.IBPluginDependency</string> + <string>536.IBPluginDependency</string> + <string>537.IBPluginDependency</string> + <string>537.object.labelIdentifier</string> + <string>538.IBPluginDependency</string> + <string>539.IBPluginDependency</string> + <string>540.IBPluginDependency</string> + <string>541.IBPluginDependency</string> + <string>542.IBPluginDependency</string> + <string>543.IBPluginDependency</string> + <string>544.IBPluginDependency</string> + <string>545.IBPluginDependency</string> + <string>546.IBPluginDependency</string> + <string>552.IBPluginDependency</string> + <string>553.IBPluginDependency</string> + <string>554.IBPluginDependency</string> + <string>56.IBPluginDependency</string> + <string>564.IBPluginDependency</string> + <string>565.IBPluginDependency</string> + <string>568.IBPluginDependency</string> + <string>569.IBPluginDependency</string> + <string>57.IBPluginDependency</string> + <string>58.IBPluginDependency</string> + <string>72.IBPluginDependency</string> + <string>73.IBPluginDependency</string> + <string>74.IBPluginDependency</string> + <string>75.IBPluginDependency</string> + <string>77.IBPluginDependency</string> + <string>78.IBPluginDependency</string> + <string>79.IBPluginDependency</string> + <string>80.IBPluginDependency</string> + <string>81.IBPluginDependency</string> + <string>82.IBPluginDependency</string> + <string>83.IBPluginDependency</string> + <string>92.IBPluginDependency</string> + </object> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <boolean value="NO"/> + <boolean value="NO"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>{{380, 496}, {480, 360}}</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>IBBuiltInLabel-Red</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + </object> + </object> + <object class="NSMutableDictionary" key="unlocalizedProperties"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference key="dict.sortedKeys" ref="0"/> + <reference key="dict.values" ref="0"/> + </object> + <nil key="activeLocalization"/> + <object class="NSMutableDictionary" key="localizations"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference key="dict.sortedKeys" ref="0"/> + <reference key="dict.values" ref="0"/> + </object> + <nil key="sourceID"/> + <int key="maxID">570</int> + </object> + <object class="IBClassDescriber" key="IBDocument.Classes"> + <object class="NSMutableArray" key="referencedPartialClassDescriptions"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="IBPartialClassDescription"> + <string key="className">CocoaAppDelegate</string> + <string key="superclassName">NSObject</string> + <object class="NSMutableDictionary" key="actions"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSArray" key="dict.sortedKeys"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>colorChanged:</string> + <string>rotationChanged:</string> + <string>textChanged:</string> + <string>updateText:</string> + <string>visibleChanged:</string> + </object> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>NSPopUpButton</string> + <string>NSSlider</string> + <string>NSTextField</string> + <string>NSButton</string> + <string>NSButton</string> + </object> + </object> + <object class="NSMutableDictionary" key="actionInfosByName"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSArray" key="dict.sortedKeys"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>colorChanged:</string> + <string>rotationChanged:</string> + <string>textChanged:</string> + <string>updateText:</string> + <string>visibleChanged:</string> + </object> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="IBActionInfo"> + <string key="name">colorChanged:</string> + <string key="candidateClassName">NSPopUpButton</string> + </object> + <object class="IBActionInfo"> + <string key="name">rotationChanged:</string> + <string key="candidateClassName">NSSlider</string> + </object> + <object class="IBActionInfo"> + <string key="name">textChanged:</string> + <string key="candidateClassName">NSTextField</string> + </object> + <object class="IBActionInfo"> + <string key="name">updateText:</string> + <string key="candidateClassName">NSButton</string> + </object> + <object class="IBActionInfo"> + <string key="name">visibleChanged:</string> + <string key="candidateClassName">NSButton</string> + </object> + </object> + </object> + <object class="NSMutableDictionary" key="outlets"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSArray" key="dict.sortedKeys"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>sfmlView</string> + <string>textField</string> + <string>window</string> + </object> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>NSView</string> + <string>NSTextField</string> + <string>NSWindow</string> + </object> + </object> + <object class="NSMutableDictionary" key="toOneOutletInfosByName"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSArray" key="dict.sortedKeys"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>sfmlView</string> + <string>textField</string> + <string>window</string> + </object> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="IBToOneOutletInfo"> + <string key="name">sfmlView</string> + <string key="candidateClassName">NSView</string> + </object> + <object class="IBToOneOutletInfo"> + <string key="name">textField</string> + <string key="candidateClassName">NSTextField</string> + </object> + <object class="IBToOneOutletInfo"> + <string key="name">window</string> + <string key="candidateClassName">NSWindow</string> + </object> + </object> + </object> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBProjectSource</string> + <string key="minorKey">./Classes/CocoaAppDelegate.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSDocument</string> + <object class="NSMutableDictionary" key="actions"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSArray" key="dict.sortedKeys"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>printDocument:</string> + <string>revertDocumentToSaved:</string> + <string>runPageLayout:</string> + <string>saveDocument:</string> + <string>saveDocumentAs:</string> + <string>saveDocumentTo:</string> + </object> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>id</string> + <string>id</string> + <string>id</string> + <string>id</string> + <string>id</string> + <string>id</string> + </object> + </object> + <object class="NSMutableDictionary" key="actionInfosByName"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSArray" key="dict.sortedKeys"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>printDocument:</string> + <string>revertDocumentToSaved:</string> + <string>runPageLayout:</string> + <string>saveDocument:</string> + <string>saveDocumentAs:</string> + <string>saveDocumentTo:</string> + </object> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="IBActionInfo"> + <string key="name">printDocument:</string> + <string key="candidateClassName">id</string> + </object> + <object class="IBActionInfo"> + <string key="name">revertDocumentToSaved:</string> + <string key="candidateClassName">id</string> + </object> + <object class="IBActionInfo"> + <string key="name">runPageLayout:</string> + <string key="candidateClassName">id</string> + </object> + <object class="IBActionInfo"> + <string key="name">saveDocument:</string> + <string key="candidateClassName">id</string> + </object> + <object class="IBActionInfo"> + <string key="name">saveDocumentAs:</string> + <string key="candidateClassName">id</string> + </object> + <object class="IBActionInfo"> + <string key="name">saveDocumentTo:</string> + <string key="candidateClassName">id</string> + </object> + </object> + </object> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBProjectSource</string> + <string key="minorKey">./Classes/NSDocument.h</string> + </object> + </object> + </object> + </object> + <int key="IBDocument.localizationMode">0</int> + <string key="IBDocument.TargetRuntimeIdentifier">IBCocoaFramework</string> + <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDevelopmentDependencies"> + <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3</string> + <integer value="3000" key="NS.object.0"/> + </object> + <bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool> + <int key="IBDocument.defaultPropertyAccessControl">3</int> + <object class="NSMutableDictionary" key="IBDocument.LastKnownImageSizes"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSArray" key="dict.sortedKeys"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>NSMenuCheckmark</string> + <string>NSMenuMixedState</string> + <string>NSSwitch</string> + <string>blue</string> + <string>green</string> + <string>red</string> + </object> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>{9, 8}</string> + <string>{7, 2}</string> + <string>{15, 15}</string> + <string>{16, 16}</string> + <string>{16, 16}</string> + <string>{16, 16}</string> + </object> + </object> + </data> +</archive> diff --git a/examples/cocoa/NSString+stdstring.h b/examples/cocoa/NSString+stdstring.h new file mode 100644 index 0000000..0be2536 --- /dev/null +++ b/examples/cocoa/NSString+stdstring.h @@ -0,0 +1,39 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2012 Marco Antognini (antognini.marco@gmail.com), +// Laurent Gomila (laurent.gom@gmail.com), +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#import <string> +#import <Foundation/Foundation.h> + +@interface NSString (NSString_stdstring) + ++(id)stringWithstdstring:(std::string const &)string; + ++(id)stringWithstdwstring:(std::wstring const &)string; + +-(std::string)tostdstring; + +-(std::wstring)tostdwstring; + +@end diff --git a/examples/cocoa/NSString+stdstring.mm b/examples/cocoa/NSString+stdstring.mm new file mode 100644 index 0000000..367b21a --- /dev/null +++ b/examples/cocoa/NSString+stdstring.mm @@ -0,0 +1,78 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2012 Marco Antognini (antognini.marco@gmail.com), +// Laurent Gomila (laurent.gom@gmail.com), +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#import "NSString+stdstring.h" +#include <SFML/System/Utf.hpp> + +@implementation NSString (NSString_stdstring) + ++(id)stringWithstdstring:(std::string const &)string +{ + std::string utf8; + utf8.reserve(string.size() + 1); + + sf::Utf8::fromAnsi(string.begin(), string.end(), std::back_inserter(utf8)); + + NSString *str = [NSString stringWithCString:utf8.c_str() + encoding:NSUTF8StringEncoding]; + return str; +} + +-(std::string)tostdstring +{ + // Not sure about the encoding to use. Using [self UTF8String] doesn't + // work for characters like é or à . + const char *cstr = [self cStringUsingEncoding:NSISOLatin1StringEncoding]; + + if (cstr != NULL) + { + std::string str(cstr); + return str; + } + else + { + return ""; + } +} + ++(id)stringWithstdwstring:(std::wstring const &)string +{ + char* data = (char *)string.data(); + unsigned size = string.size() * sizeof(wchar_t); + + NSString *str = [[[NSString alloc] initWithBytes:data length:size + encoding:NSUTF32LittleEndianStringEncoding] autorelease]; + return str; +} + +-(std::wstring)tostdwstring +{ + // According to wikipedia, Mac OS X is Little Endian on x86 and x86-64 + // http://en.wikipedia.org/wiki/Endianness + NSData* asData = [self dataUsingEncoding:NSUTF32LittleEndianStringEncoding]; + return std::wstring((wchar_t *)[asData bytes], [asData length] / sizeof(wchar_t)); +} + +@end
\ No newline at end of file diff --git a/examples/cocoa/main.m b/examples/cocoa/main.m new file mode 100644 index 0000000..324e284 --- /dev/null +++ b/examples/cocoa/main.m @@ -0,0 +1,31 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2012 Marco Antognini (antognini.marco@gmail.com), +// Laurent Gomila (laurent.gom@gmail.com), +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#import <Cocoa/Cocoa.h> + +int main(int argc, char *argv[]) +{ + return NSApplicationMain(argc, (const char **)argv); +} diff --git a/examples/cocoa/readme.txt b/examples/cocoa/readme.txt new file mode 100644 index 0000000..95c3d90 --- /dev/null +++ b/examples/cocoa/readme.txt @@ -0,0 +1,28 @@ +SFML IN COCOA APPLICATION +========================= + +This is a small example of the integration of SFML in a Cocoa application. + +Features +-------- + + * This example shows how basic UI elements can interact with SFML + render areas such as sf::RenderWindow (you can use sf::Window and + OpenGL code too, of course). + * It also provides tools for converting NSString to and from + std::[w]string in an Objective-C Category of NSString. + * Moreover, it shows how you can prevent annoying the system alerts + produced when the SFML view has focus and the user press a key + (see SilentWindow interface in CocoaAppDelegate.[h|mm]). + +Special Considerations +---------------------- + +While mixing SFML into a Cocoa application you have to deal with mixing +C++ and Objective-C. In order to proceed you should use .mm extension for +Objective-C++ files. + +Be aware of the limitations of Objective-C++. Please refer to the official +documentation provided by Apple for more information. + +You can also work around these limitations by using CSFML. diff --git a/examples/ftp/CMakeLists.txt b/examples/ftp/CMakeLists.txt new file mode 100644 index 0000000..7ef9684 --- /dev/null +++ b/examples/ftp/CMakeLists.txt @@ -0,0 +1,10 @@ +
+set(SRCROOT ${PROJECT_SOURCE_DIR}/examples/ftp)
+
+# all source files
+set(SRC ${SRCROOT}/Ftp.cpp)
+
+# define the ftp target
+sfml_add_example(ftp
+ SOURCES ${SRC}
+ DEPENDS sfml-network sfml-system)
diff --git a/examples/ftp/Ftp.cpp b/examples/ftp/Ftp.cpp new file mode 100644 index 0000000..7b97860 --- /dev/null +++ b/examples/ftp/Ftp.cpp @@ -0,0 +1,206 @@ +
+////////////////////////////////////////////////////////////
+// Headers
+////////////////////////////////////////////////////////////
+#include <SFML/Network.hpp>
+#include <fstream>
+#include <iostream>
+
+
+////////////////////////////////////////////////////////////
+/// Print a FTP response into a standard output stream
+///
+////////////////////////////////////////////////////////////
+std::ostream& operator <<(std::ostream& stream, const sf::Ftp::Response& response)
+{
+ return stream << response.getStatus() << response.getMessage();
+}
+
+
+////////////////////////////////////////////////////////////
+/// Entry point of application
+///
+/// \return Application exit code
+///
+////////////////////////////////////////////////////////////
+int main()
+{
+ // Choose the server address
+ sf::IpAddress address;
+ do
+ {
+ std::cout << "Enter the FTP server address : ";
+ std::cin >> address;
+ }
+ while (address == sf::IpAddress::None);
+
+ // Connect to the server
+ sf::Ftp server;
+ sf::Ftp::Response connectResponse = server.connect(address);
+ std::cout << connectResponse << std::endl;
+ if (!connectResponse.isOk())
+ return EXIT_FAILURE;
+
+ // Ask for user name and password
+ std::string user, password;
+ std::cout << "User name : ";
+ std::cin >> user;
+ std::cout << "Password : ";
+ std::cin >> password;
+
+ // Login to the server
+ sf::Ftp::Response loginResponse = server.login(user, password);
+ std::cout << loginResponse << std::endl;
+ if (!loginResponse.isOk())
+ return EXIT_FAILURE;
+
+ // Main menu
+ int choice = 0;
+ do
+ {
+ // Main FTP menu
+ std::cout << std::endl;
+ std::cout << "Choose an action:" << std::endl;
+ std::cout << "1. Print working directory" << std::endl;
+ std::cout << "2. Print contents of working directory" << std::endl;
+ std::cout << "3. Change directory" << std::endl;
+ std::cout << "4. Create directory" << std::endl;
+ std::cout << "5. Delete directory" << std::endl;
+ std::cout << "6. Rename file" << std::endl;
+ std::cout << "7. Remove file" << std::endl;
+ std::cout << "8. Download file" << std::endl;
+ std::cout << "9. Upload file" << std::endl;
+ std::cout << "0. Disconnect" << std::endl;
+ std::cout << std::endl;
+
+ std::cout << "Your choice: ";
+ std::cin >> choice;
+ std::cout << std::endl;
+
+ switch (choice)
+ {
+ default :
+ {
+ // Wrong choice
+ std::cout << "Invalid choice!" << std::endl;
+ std::cin.clear();
+ std::cin.ignore(10000, '\n');
+ break;
+ }
+
+ case 1 :
+ {
+ // Print the current server directory
+ sf::Ftp::DirectoryResponse response = server.getWorkingDirectory();
+ std::cout << response << std::endl;
+ std::cout << "Current directory is " << response.getDirectory() << std::endl;
+ break;
+ }
+
+ case 2 :
+ {
+ // Print the contents of the current server directory
+ sf::Ftp::ListingResponse response = server.getDirectoryListing();
+ std::cout << response << std::endl;
+ const std::vector<std::string>& names = response.getListing();
+ for (std::vector<std::string>::const_iterator it = names.begin(); it != names.end(); ++it)
+ std::cout << *it << std::endl;
+ break;
+ }
+
+ case 3 :
+ {
+ // Change the current directory
+ std::string directory;
+ std::cout << "Choose a directory: ";
+ std::cin >> directory;
+ std::cout << server.changeDirectory(directory) << std::endl;
+ break;
+ }
+
+ case 4 :
+ {
+ // Create a new directory
+ std::string directory;
+ std::cout << "Name of the directory to create: ";
+ std::cin >> directory;
+ std::cout << server.createDirectory(directory) << std::endl;
+ break;
+ }
+
+ case 5 :
+ {
+ // Remove an existing directory
+ std::string directory;
+ std::cout << "Name of the directory to remove: ";
+ std::cin >> directory;
+ std::cout << server.deleteDirectory(directory) << std::endl;
+ break;
+ }
+
+ case 6 :
+ {
+ // Rename a file
+ std::string source, destination;
+ std::cout << "Name of the file to rename: ";
+ std::cin >> source;
+ std::cout << "New name: ";
+ std::cin >> destination;
+ std::cout << server.renameFile(source, destination) << std::endl;
+ break;
+ }
+
+ case 7 :
+ {
+ // Remove an existing directory
+ std::string filename;
+ std::cout << "Name of the file to remove: ";
+ std::cin >> filename;
+ std::cout << server.deleteFile(filename) << std::endl;
+ break;
+ }
+
+ case 8 :
+ {
+ // Download a file from server
+ std::string filename, directory;
+ std::cout << "Filename of the file to download (relative to current directory): ";
+ std::cin >> filename;
+ std::cout << "Directory to download the file to: ";
+ std::cin >> directory;
+ std::cout << server.download(filename, directory) << std::endl;
+ break;
+ }
+
+ case 9 :
+ {
+ // Upload a file to server
+ std::string filename, directory;
+ std::cout << "Path of the file to upload (absolute or relative to working directory): ";
+ std::cin >> filename;
+ std::cout << "Directory to upload the file to (relative to current directory): ";
+ std::cin >> directory;
+ std::cout << server.upload(filename, directory) << std::endl;
+ break;
+ }
+
+ case 0 :
+ {
+ // Disconnect
+ break;
+ }
+ }
+
+ } while (choice != 0);
+
+ // Disconnect from the server
+ std::cout << "Disconnecting from server..." << std::endl;
+ std::cout << server.disconnect() << std::endl;
+
+ // Wait until the user presses 'enter' key
+ std::cout << "Press enter to exit..." << std::endl;
+ std::cin.ignore(10000, '\n');
+ std::cin.ignore(10000, '\n');
+
+ return EXIT_SUCCESS;
+}
diff --git a/examples/opengl/CMakeLists.txt b/examples/opengl/CMakeLists.txt new file mode 100644 index 0000000..5a699b6 --- /dev/null +++ b/examples/opengl/CMakeLists.txt @@ -0,0 +1,14 @@ +
+set(SRCROOT ${PROJECT_SOURCE_DIR}/examples/opengl)
+
+# all source files
+set(SRC ${SRCROOT}/OpenGL.cpp)
+
+# find OpenGL and GLU
+find_package(OpenGL REQUIRED)
+include_directories(${OPENGL_INCLUDE_DIR})
+
+# define the opengl target
+sfml_add_example(opengl GUI_APP
+ SOURCES ${SRC}
+ DEPENDS sfml-graphics sfml-window sfml-system ${OPENGL_LIBRARIES})
diff --git a/examples/opengl/OpenGL.cpp b/examples/opengl/OpenGL.cpp new file mode 100644 index 0000000..639254b --- /dev/null +++ b/examples/opengl/OpenGL.cpp @@ -0,0 +1,194 @@ +
+////////////////////////////////////////////////////////////
+// Headers
+////////////////////////////////////////////////////////////
+#include <SFML/Graphics.hpp>
+#include <SFML/OpenGL.hpp>
+
+
+////////////////////////////////////////////////////////////
+/// Entry point of application
+///
+/// \return Application exit code
+///
+////////////////////////////////////////////////////////////
+int main()
+{
+ // Request a 32-bits depth buffer when creating the window
+ sf::ContextSettings contextSettings;
+ contextSettings.depthBits = 32;
+
+ // Create the main window
+ sf::RenderWindow window(sf::VideoMode(800, 600), "SFML graphics with OpenGL", sf::Style::Default, contextSettings);
+ window.setVerticalSyncEnabled(true);
+
+ // Make it the active window for OpenGL calls
+ window.setActive();
+
+ // Create a sprite for the background
+ sf::Texture backgroundTexture;
+ if (!backgroundTexture.loadFromFile("resources/background.jpg"))
+ return EXIT_FAILURE;
+ sf::Sprite background(backgroundTexture);
+
+ // Create some text to draw on top of our OpenGL object
+ sf::Font font;
+ if (!font.loadFromFile("resources/sansation.ttf"))
+ return EXIT_FAILURE;
+ sf::Text text("SFML / OpenGL demo", font);
+ text.setColor(sf::Color(255, 255, 255, 170));
+ text.setPosition(250.f, 450.f);
+
+ // Load an OpenGL texture.
+ // We could directly use a sf::Texture as an OpenGL texture (with its Bind() member function),
+ // but here we want more control on it (generate mipmaps, ...) so we create a new one from an image
+ GLuint texture = 0;
+ {
+ sf::Image image;
+ if (!image.loadFromFile("resources/texture.jpg"))
+ return EXIT_FAILURE;
+ glGenTextures(1, &texture);
+ glBindTexture(GL_TEXTURE_2D, texture);
+ gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, image.getSize().x, image.getSize().y, GL_RGBA, GL_UNSIGNED_BYTE, image.getPixelsPtr());
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
+ }
+
+ // Enable Z-buffer read and write
+ glEnable(GL_DEPTH_TEST);
+ glDepthMask(GL_TRUE);
+ glClearDepth(1.f);
+
+ // Disable lighting
+ glDisable(GL_LIGHTING);
+
+ // Configure the viewport (the same size as the window)
+ glViewport(0, 0, window.getSize().x, window.getSize().y);
+
+ // Setup a perspective projection
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ GLfloat ratio = static_cast<float>(window.getSize().x) / window.getSize().y;
+ glFrustum(-ratio, ratio, -1.f, 1.f, 1.f, 500.f);
+
+ // Bind the texture
+ glEnable(GL_TEXTURE_2D);
+ glBindTexture(GL_TEXTURE_2D, texture);
+
+ // Define a 3D cube (6 faces made of 2 triangles composed by 3 vertices)
+ GLfloat cube[] =
+ {
+ // positions // texture coordinates
+ -20, -20, -20, 0, 0,
+ -20, 20, -20, 1, 0,
+ -20, -20, 20, 0, 1,
+ -20, -20, 20, 0, 1,
+ -20, 20, -20, 1, 0,
+ -20, 20, 20, 1, 1,
+
+ 20, -20, -20, 0, 0,
+ 20, 20, -20, 1, 0,
+ 20, -20, 20, 0, 1,
+ 20, -20, 20, 0, 1,
+ 20, 20, -20, 1, 0,
+ 20, 20, 20, 1, 1,
+
+ -20, -20, -20, 0, 0,
+ 20, -20, -20, 1, 0,
+ -20, -20, 20, 0, 1,
+ -20, -20, 20, 0, 1,
+ 20, -20, -20, 1, 0,
+ 20, -20, 20, 1, 1,
+
+ -20, 20, -20, 0, 0,
+ 20, 20, -20, 1, 0,
+ -20, 20, 20, 0, 1,
+ -20, 20, 20, 0, 1,
+ 20, 20, -20, 1, 0,
+ 20, 20, 20, 1, 1,
+
+ -20, -20, -20, 0, 0,
+ 20, -20, -20, 1, 0,
+ -20, 20, -20, 0, 1,
+ -20, 20, -20, 0, 1,
+ 20, -20, -20, 1, 0,
+ 20, 20, -20, 1, 1,
+
+ -20, -20, 20, 0, 0,
+ 20, -20, 20, 1, 0,
+ -20, 20, 20, 0, 1,
+ -20, 20, 20, 0, 1,
+ 20, -20, 20, 1, 0,
+ 20, 20, 20, 1, 1
+ };
+
+ // Enable position and texture coordinates vertex components
+ glEnableClientState(GL_VERTEX_ARRAY);
+ glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+ glVertexPointer(3, GL_FLOAT, 5 * sizeof(GLfloat), cube);
+ glTexCoordPointer(2, GL_FLOAT, 5 * sizeof(GLfloat), cube + 3);
+
+ // Disable normal and color vertex components
+ glDisableClientState(GL_NORMAL_ARRAY);
+ glDisableClientState(GL_COLOR_ARRAY);
+
+ // Create a clock for measuring the time elapsed
+ sf::Clock clock;
+
+ // Start game loop
+ while (window.isOpen())
+ {
+ // Process events
+ sf::Event event;
+ while (window.pollEvent(event))
+ {
+ // Close window : exit
+ if (event.type == sf::Event::Closed)
+ window.close();
+
+ // Escape key : exit
+ if ((event.type == sf::Event::KeyPressed) && (event.key.code == sf::Keyboard::Escape))
+ window.close();
+
+ // Adjust the viewport when the window is resized
+ if (event.type == sf::Event::Resized)
+ glViewport(0, 0, event.size.width, event.size.height);
+ }
+
+ // Draw the background
+ window.pushGLStates();
+ window.draw(background);
+ window.popGLStates();
+
+ // Clear the depth buffer
+ glClear(GL_DEPTH_BUFFER_BIT);
+
+ // We get the position of the mouse cursor, so that we can move the box accordingly
+ float x = sf::Mouse::getPosition(window).x * 200.f / window.getSize().x - 100.f;
+ float y = -sf::Mouse::getPosition(window).y * 200.f / window.getSize().y + 100.f;
+
+ // Apply some transformations
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ glTranslatef(x, y, -100.f);
+ glRotatef(clock.getElapsedTime().asSeconds() * 50.f, 1.f, 0.f, 0.f);
+ glRotatef(clock.getElapsedTime().asSeconds() * 30.f, 0.f, 1.f, 0.f);
+ glRotatef(clock.getElapsedTime().asSeconds() * 90.f, 0.f, 0.f, 1.f);
+
+ // Draw the cube
+ glDrawArrays(GL_TRIANGLES, 0, 36);
+
+ // Draw some text on top of our OpenGL object
+ window.pushGLStates();
+ window.draw(text);
+ window.popGLStates();
+
+ // Finally, display the rendered frame on screen
+ window.display();
+ }
+
+ // Don't forget to destroy our texture
+ glDeleteTextures(1, &texture);
+
+ return EXIT_SUCCESS;
+}
diff --git a/examples/pong/CMakeLists.txt b/examples/pong/CMakeLists.txt new file mode 100644 index 0000000..2a76ecc --- /dev/null +++ b/examples/pong/CMakeLists.txt @@ -0,0 +1,10 @@ +
+set(SRCROOT ${PROJECT_SOURCE_DIR}/examples/pong)
+
+# all source files
+set(SRC ${SRCROOT}/Pong.cpp)
+
+# define the pong target
+sfml_add_example(pong GUI_APP
+ SOURCES ${SRC}
+ DEPENDS sfml-audio sfml-graphics sfml-window sfml-system)
diff --git a/examples/pong/Pong.cpp b/examples/pong/Pong.cpp new file mode 100644 index 0000000..1b9a74f --- /dev/null +++ b/examples/pong/Pong.cpp @@ -0,0 +1,241 @@ +
+////////////////////////////////////////////////////////////
+// Headers
+////////////////////////////////////////////////////////////
+#include <SFML/Graphics.hpp>
+#include <SFML/Audio.hpp>
+#include <cmath>
+#include <ctime>
+#include <cstdlib>
+
+
+////////////////////////////////////////////////////////////
+/// Entry point of application
+///
+/// \return Application exit code
+///
+////////////////////////////////////////////////////////////
+int main()
+{
+ std::srand(static_cast<unsigned int>(std::time(NULL)));
+
+ // Define some constants
+ const float pi = 3.14159f;
+ const int gameWidth = 800;
+ const int gameHeight = 600;
+ sf::Vector2f paddleSize(25, 100);
+ float ballRadius = 10.f;
+
+ // Create the window of the application
+ sf::RenderWindow window(sf::VideoMode(gameWidth, gameHeight, 32), "SFML Pong");
+ window.setVerticalSyncEnabled(true);
+
+ // Load the sounds used in the game
+ sf::SoundBuffer ballSoundBuffer;
+ if (!ballSoundBuffer.loadFromFile("resources/ball.wav"))
+ return EXIT_FAILURE;
+ sf::Sound ballSound(ballSoundBuffer);
+
+ // Create the left paddle
+ sf::RectangleShape leftPaddle;
+ leftPaddle.setSize(paddleSize - sf::Vector2f(3, 3));
+ leftPaddle.setOutlineThickness(3);
+ leftPaddle.setOutlineColor(sf::Color::Black);
+ leftPaddle.setFillColor(sf::Color(100, 100, 200));
+ leftPaddle.setOrigin(paddleSize / 2.f);
+
+ // Create the right paddle
+ sf::RectangleShape rightPaddle;
+ rightPaddle.setSize(paddleSize - sf::Vector2f(3, 3));
+ rightPaddle.setOutlineThickness(3);
+ rightPaddle.setOutlineColor(sf::Color::Black);
+ rightPaddle.setFillColor(sf::Color(200, 100, 100));
+ rightPaddle.setOrigin(paddleSize / 2.f);
+
+ // Create the ball
+ sf::CircleShape ball;
+ ball.setRadius(ballRadius - 3);
+ ball.setOutlineThickness(3);
+ ball.setOutlineColor(sf::Color::Black);
+ ball.setFillColor(sf::Color::White);
+ ball.setOrigin(ballRadius / 2, ballRadius / 2);
+
+ // Load the text font
+ sf::Font font;
+ if (!font.loadFromFile("resources/sansation.ttf"))
+ return EXIT_FAILURE;
+
+ // Initialize the pause message
+ sf::Text pauseMessage;
+ pauseMessage.setFont(font);
+ pauseMessage.setCharacterSize(40);
+ pauseMessage.setPosition(170.f, 150.f);
+ pauseMessage.setColor(sf::Color::White);
+ pauseMessage.setString("Welcome to SFML pong!\nPress space to start the game");
+
+ // Define the paddles properties
+ sf::Clock AITimer;
+ const sf::Time AITime = sf::seconds(0.1f);
+ const float paddleSpeed = 400.f;
+ float rightPaddleSpeed = 0.f;
+ const float ballSpeed = 400.f;
+ float ballAngle = 0.f; // to be changed later
+
+ sf::Clock clock;
+ bool isPlaying = false;
+ while (window.isOpen())
+ {
+ // Handle events
+ sf::Event event;
+ while (window.pollEvent(event))
+ {
+ // Window closed or escape key pressed: exit
+ if ((event.type == sf::Event::Closed) ||
+ ((event.type == sf::Event::KeyPressed) && (event.key.code == sf::Keyboard::Escape)))
+ {
+ window.close();
+ break;
+ }
+
+ // Space key pressed: play
+ if ((event.type == sf::Event::KeyPressed) && (event.key.code == sf::Keyboard::Space))
+ {
+ if (!isPlaying)
+ {
+ // (re)start the game
+ isPlaying = true;
+ clock.restart();
+
+ // Reset the position of the paddles and ball
+ leftPaddle.setPosition(10 + paddleSize.x / 2, gameHeight / 2);
+ rightPaddle.setPosition(gameWidth - 10 - paddleSize.x / 2, gameHeight / 2);
+ ball.setPosition(gameWidth / 2, gameHeight / 2);
+
+ // Reset the ball angle
+ do
+ {
+ // Make sure the ball initial angle is not too much vertical
+ ballAngle = (std::rand() % 360) * 2 * pi / 360;
+ }
+ while (std::abs(std::cos(ballAngle)) < 0.7f);
+ }
+ }
+ }
+
+ if (isPlaying)
+ {
+ float deltaTime = clock.restart().asSeconds();
+
+ // Move the player's paddle
+ if (sf::Keyboard::isKeyPressed(sf::Keyboard::Up) &&
+ (leftPaddle.getPosition().y - paddleSize.y / 2 > 5.f))
+ {
+ leftPaddle.move(0.f, -paddleSpeed * deltaTime);
+ }
+ if (sf::Keyboard::isKeyPressed(sf::Keyboard::Down) &&
+ (leftPaddle.getPosition().y + paddleSize.y / 2 < gameHeight - 5.f))
+ {
+ leftPaddle.move(0.f, paddleSpeed * deltaTime);
+ }
+
+ // Move the computer's paddle
+ if (((rightPaddleSpeed < 0.f) && (rightPaddle.getPosition().y - paddleSize.y / 2 > 5.f)) ||
+ ((rightPaddleSpeed > 0.f) && (rightPaddle.getPosition().y + paddleSize.y / 2 < gameHeight - 5.f)))
+ {
+ rightPaddle.move(0.f, rightPaddleSpeed * deltaTime);
+ }
+
+ // Update the computer's paddle direction according to the ball position
+ if (AITimer.getElapsedTime() > AITime)
+ {
+ AITimer.restart();
+ if (ball.getPosition().y + ballRadius > rightPaddle.getPosition().y + paddleSize.y / 2)
+ rightPaddleSpeed = paddleSpeed;
+ else if (ball.getPosition().y - ballRadius < rightPaddle.getPosition().y - paddleSize.y / 2)
+ rightPaddleSpeed = -paddleSpeed;
+ else
+ rightPaddleSpeed = 0.f;
+ }
+
+ // Move the ball
+ float factor = ballSpeed * deltaTime;
+ ball.move(std::cos(ballAngle) * factor, std::sin(ballAngle) * factor);
+
+ // Check collisions between the ball and the screen
+ if (ball.getPosition().x - ballRadius < 0.f)
+ {
+ isPlaying = false;
+ pauseMessage.setString("You lost !\nPress space to restart or\nescape to exit");
+ }
+ if (ball.getPosition().x + ballRadius > gameWidth)
+ {
+ isPlaying = false;
+ pauseMessage.setString("You won !\nPress space to restart or\nescape to exit");
+ }
+ if (ball.getPosition().y - ballRadius < 0.f)
+ {
+ ballSound.play();
+ ballAngle = -ballAngle;
+ ball.setPosition(ball.getPosition().x, ballRadius + 0.1f);
+ }
+ if (ball.getPosition().y + ballRadius > gameHeight)
+ {
+ ballSound.play();
+ ballAngle = -ballAngle;
+ ball.setPosition(ball.getPosition().x, gameHeight - ballRadius - 0.1f);
+ }
+
+ // Check the collisions between the ball and the paddles
+ // Left Paddle
+ if (ball.getPosition().x - ballRadius < leftPaddle.getPosition().x + paddleSize.x / 2 &&
+ ball.getPosition().x - ballRadius > leftPaddle.getPosition().x &&
+ ball.getPosition().y + ballRadius >= leftPaddle.getPosition().y - paddleSize.y / 2 &&
+ ball.getPosition().y - ballRadius <= leftPaddle.getPosition().y + paddleSize.y / 2)
+ {
+ if (ball.getPosition().y > leftPaddle.getPosition().y)
+ ballAngle = pi - ballAngle + (std::rand() % 20) * pi / 180;
+ else
+ ballAngle = pi - ballAngle - (std::rand() % 20) * pi / 180;
+
+ ballSound.play();
+ ball.setPosition(leftPaddle.getPosition().x + ballRadius + paddleSize.x / 2 + 0.1f, ball.getPosition().y);
+ }
+
+ // Right Paddle
+ if (ball.getPosition().x + ballRadius > rightPaddle.getPosition().x - paddleSize.x / 2 &&
+ ball.getPosition().x + ballRadius < rightPaddle.getPosition().x &&
+ ball.getPosition().y + ballRadius >= rightPaddle.getPosition().y - paddleSize.y / 2 &&
+ ball.getPosition().y - ballRadius <= rightPaddle.getPosition().y + paddleSize.y / 2)
+ {
+ if (ball.getPosition().y > rightPaddle.getPosition().y)
+ ballAngle = pi - ballAngle + (std::rand() % 20) * pi / 180;
+ else
+ ballAngle = pi - ballAngle - (std::rand() % 20) * pi / 180;
+
+ ballSound.play();
+ ball.setPosition(rightPaddle.getPosition().x - ballRadius - paddleSize.x / 2 - 0.1f, ball.getPosition().y);
+ }
+ }
+
+ // Clear the window
+ window.clear(sf::Color(50, 200, 50));
+
+ if (isPlaying)
+ {
+ // Draw the paddles and the ball
+ window.draw(leftPaddle);
+ window.draw(rightPaddle);
+ window.draw(ball);
+ }
+ else
+ {
+ // Draw the pause message
+ window.draw(pauseMessage);
+ }
+
+ // Display things on screen
+ window.display();
+ }
+
+ return EXIT_SUCCESS;
+}
diff --git a/examples/shader/CMakeLists.txt b/examples/shader/CMakeLists.txt new file mode 100644 index 0000000..acb1bac --- /dev/null +++ b/examples/shader/CMakeLists.txt @@ -0,0 +1,12 @@ +
+set(SRCROOT ${PROJECT_SOURCE_DIR}/examples/shader)
+
+# all source files
+set(SRC
+ ${SRCROOT}/Effect.hpp
+ ${SRCROOT}/Shader.cpp)
+
+# define the shader target
+sfml_add_example(shader GUI_APP
+ SOURCES ${SRC}
+ DEPENDS sfml-graphics sfml-window sfml-system)
diff --git a/examples/shader/Effect.hpp b/examples/shader/Effect.hpp new file mode 100644 index 0000000..ce29c47 --- /dev/null +++ b/examples/shader/Effect.hpp @@ -0,0 +1,88 @@ +#ifndef EFFECT_HPP +#define EFFECT_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include <SFML/Graphics.hpp> +#include <cassert> +#include <string> + + +//////////////////////////////////////////////////////////// +// Base class for effects +//////////////////////////////////////////////////////////// +class Effect : public sf::Drawable +{ +public : + + virtual ~Effect() + { + } + + static void setFont(const sf::Font& font) + { + s_font = &font; + } + + const std::string& getName() const + { + return m_name; + } + + void load() + { + m_isLoaded = sf::Shader::isAvailable() && onLoad(); + } + + void update(float time, float x, float y) + { + if (m_isLoaded) + onUpdate(time, x, y); + } + + void draw(sf::RenderTarget& target, sf::RenderStates states) const + { + if (m_isLoaded) + { + onDraw(target, states); + } + else + { + sf::Text error("Shader not\nsupported", getFont()); + error.setPosition(320.f, 200.f); + error.setCharacterSize(36); + target.draw(error, states); + } + } + +protected : + + Effect(const std::string& name) : + m_name(name), + m_isLoaded(false) + { + } + + static const sf::Font& getFont() + { + assert(s_font != NULL); + return *s_font; + } + +private : + + // Virtual functions to be implemented in derived effects + virtual bool onLoad() = 0; + virtual void onUpdate(float time, float x, float y) = 0; + virtual void onDraw(sf::RenderTarget& target, sf::RenderStates states) const = 0; + +private : + + std::string m_name; + bool m_isLoaded; + + static const sf::Font* s_font; +}; + +#endif // EFFECT_HPP diff --git a/examples/shader/Shader.cpp b/examples/shader/Shader.cpp new file mode 100644 index 0000000..2b0d8a5 --- /dev/null +++ b/examples/shader/Shader.cpp @@ -0,0 +1,380 @@ +
+////////////////////////////////////////////////////////////
+// Headers
+////////////////////////////////////////////////////////////
+#include "Effect.hpp"
+#include <SFML/Graphics.hpp>
+#include <vector>
+#include <cmath>
+
+
+const sf::Font* Effect::s_font = NULL;
+
+////////////////////////////////////////////////////////////
+// "Pixelate" fragment shader
+////////////////////////////////////////////////////////////
+class Pixelate : public Effect
+{
+public :
+
+ Pixelate() :
+ Effect("pixelate")
+ {
+ }
+
+ bool onLoad()
+ {
+ // Load the texture and initialize the sprite
+ if (!m_texture.loadFromFile("resources/background.jpg"))
+ return false;
+ m_sprite.setTexture(m_texture);
+
+ // Load the shader
+ if (!m_shader.loadFromFile("resources/pixelate.frag", sf::Shader::Fragment))
+ return false;
+ m_shader.setParameter("texture", sf::Shader::CurrentTexture);
+
+ return true;
+ }
+
+ void onUpdate(float, float x, float y)
+ {
+ m_shader.setParameter("pixel_threshold", (x + y) / 30);
+ }
+
+ void onDraw(sf::RenderTarget& target, sf::RenderStates states) const
+ {
+ states.shader = &m_shader;
+ target.draw(m_sprite, states);
+ }
+
+private:
+
+ sf::Texture m_texture;
+ sf::Sprite m_sprite;
+ sf::Shader m_shader;
+};
+
+
+////////////////////////////////////////////////////////////
+// "Wave" vertex shader + "blur" fragment shader
+////////////////////////////////////////////////////////////
+class WaveBlur : public Effect
+{
+public :
+
+ WaveBlur() :
+ Effect("wave + blur")
+ {
+ }
+
+ bool onLoad()
+ {
+ // Create the text
+ m_text.setString("Praesent suscipit augue in velit pulvinar hendrerit varius purus aliquam.\n"
+ "Mauris mi odio, bibendum quis fringilla a, laoreet vel orci. Proin vitae vulputate tortor.\n"
+ "Praesent cursus ultrices justo, ut feugiat ante vehicula quis.\n"
+ "Donec fringilla scelerisque mauris et viverra.\n"
+ "Maecenas adipiscing ornare scelerisque. Nullam at libero elit.\n"
+ "Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.\n"
+ "Nullam leo urna, tincidunt id semper eget, ultricies sed mi.\n"
+ "Morbi mauris massa, commodo id dignissim vel, lobortis et elit.\n"
+ "Fusce vel libero sed neque scelerisque venenatis.\n"
+ "Integer mattis tincidunt quam vitae iaculis.\n"
+ "Vivamus fringilla sem non velit venenatis fermentum.\n"
+ "Vivamus varius tincidunt nisi id vehicula.\n"
+ "Integer ullamcorper, enim vitae euismod rutrum, massa nisl semper ipsum,\n"
+ "vestibulum sodales sem ante in massa.\n"
+ "Vestibulum in augue non felis convallis viverra.\n"
+ "Mauris ultricies dolor sed massa convallis sed aliquet augue fringilla.\n"
+ "Duis erat eros, porta in accumsan in, blandit quis sem.\n"
+ "In hac habitasse platea dictumst. Etiam fringilla est id odio dapibus sit amet semper dui laoreet.\n");
+ m_text.setFont(getFont());
+ m_text.setCharacterSize(22);
+ m_text.setPosition(30, 20);
+
+ // Load the shader
+ if (!m_shader.loadFromFile("resources/wave.vert", "resources/blur.frag"))
+ return false;
+
+ return true;
+ }
+
+ void onUpdate(float time, float x, float y)
+ {
+ m_shader.setParameter("wave_phase", time);
+ m_shader.setParameter("wave_amplitude", x * 40, y * 40);
+ m_shader.setParameter("blur_radius", (x + y) * 0.008f);
+ }
+
+ void onDraw(sf::RenderTarget& target, sf::RenderStates states) const
+ {
+ states.shader = &m_shader;
+ target.draw(m_text, states);
+ }
+
+private:
+
+ sf::Text m_text;
+ sf::Shader m_shader;
+};
+
+
+////////////////////////////////////////////////////////////
+// "Storm" vertex shader + "blink" fragment shader
+////////////////////////////////////////////////////////////
+class StormBlink : public Effect
+{
+public :
+
+ StormBlink() :
+ Effect("storm + blink")
+ {
+ }
+
+ bool onLoad()
+ {
+ // Create the points
+ m_points.setPrimitiveType(sf::Points);
+ for (int i = 0; i < 40000; ++i)
+ {
+ float x = static_cast<float>(std::rand() % 800);
+ float y = static_cast<float>(std::rand() % 600);
+ sf::Uint8 r = std::rand() % 255;
+ sf::Uint8 g = std::rand() % 255;
+ sf::Uint8 b = std::rand() % 255;
+ m_points.append(sf::Vertex(sf::Vector2f(x, y), sf::Color(r, g, b)));
+ }
+
+ // Load the shader
+ if (!m_shader.loadFromFile("resources/storm.vert", "resources/blink.frag"))
+ return false;
+
+ return true;
+ }
+
+ void onUpdate(float time, float x, float y)
+ {
+ float radius = 200 + std::cos(time) * 150;
+ m_shader.setParameter("storm_position", x * 800, y * 600);
+ m_shader.setParameter("storm_inner_radius", radius / 3);
+ m_shader.setParameter("storm_total_radius", radius);
+ m_shader.setParameter("blink_alpha", 0.5f + std::cos(time * 3) * 0.25f);
+ }
+
+ void onDraw(sf::RenderTarget& target, sf::RenderStates states) const
+ {
+ states.shader = &m_shader;
+ target.draw(m_points, states);
+ }
+
+private:
+
+ sf::VertexArray m_points;
+ sf::Shader m_shader;
+};
+
+
+////////////////////////////////////////////////////////////
+// "Edge" post-effect fragment shader
+////////////////////////////////////////////////////////////
+class Edge : public Effect
+{
+public :
+
+ Edge() :
+ Effect("edge post-effect")
+ {
+ }
+
+ bool onLoad()
+ {
+ // Create the off-screen surface
+ if (!m_surface.create(800, 600))
+ return false;
+ m_surface.setSmooth(true);
+
+ // Load the textures
+ if (!m_backgroundTexture.loadFromFile("resources/sfml.png"))
+ return false;
+ m_backgroundTexture.setSmooth(true);
+ if (!m_entityTexture.loadFromFile("resources/devices.png"))
+ return false;
+ m_entityTexture.setSmooth(true);
+
+ // Initialize the background sprite
+ m_backgroundSprite.setTexture(m_backgroundTexture);
+ m_backgroundSprite.setPosition(135, 100);
+
+ // Load the moving entities
+ for (int i = 0; i < 6; ++i)
+ {
+ sf::Sprite entity(m_entityTexture, sf::IntRect(96 * i, 0, 96, 96));
+ m_entities.push_back(entity);
+ }
+
+ // Load the shader
+ if (!m_shader.loadFromFile("resources/edge.frag", sf::Shader::Fragment))
+ return false;
+ m_shader.setParameter("texture", sf::Shader::CurrentTexture);
+
+ return true;
+ }
+
+ void onUpdate(float time, float x, float y)
+ {
+ m_shader.setParameter("edge_threshold", 1 - (x + y) / 2);
+
+ // Update the position of the moving entities
+ for (std::size_t i = 0; i < m_entities.size(); ++i)
+ {
+ sf::Vector2f position;
+ position.x = std::cos(0.25f * (time * i + (m_entities.size() - i))) * 300 + 350;
+ position.y = std::sin(0.25f * (time * (m_entities.size() - i) + i)) * 200 + 250;
+ m_entities[i].setPosition(position);
+ }
+
+ // Render the updated scene to the off-screen surface
+ m_surface.clear(sf::Color::White);
+ m_surface.draw(m_backgroundSprite);
+ for (std::size_t i = 0; i < m_entities.size(); ++i)
+ m_surface.draw(m_entities[i]);
+ m_surface.display();
+ }
+
+ void onDraw(sf::RenderTarget& target, sf::RenderStates states) const
+ {
+ states.shader = &m_shader;
+ target.draw(sf::Sprite(m_surface.getTexture()), states);
+ }
+
+private:
+
+ sf::RenderTexture m_surface;
+ sf::Texture m_backgroundTexture;
+ sf::Texture m_entityTexture;
+ sf::Sprite m_backgroundSprite;
+ std::vector<sf::Sprite> m_entities;
+ sf::Shader m_shader;
+};
+
+
+////////////////////////////////////////////////////////////
+/// Entry point of application
+///
+/// \return Application exit code
+///
+////////////////////////////////////////////////////////////
+int main()
+{
+ // Create the main window
+ sf::RenderWindow window(sf::VideoMode(800, 600), "SFML Shader");
+ window.setVerticalSyncEnabled(true);
+
+ // Load the application font and pass it to the Effect class
+ sf::Font font;
+ if (!font.loadFromFile("resources/sansation.ttf"))
+ return EXIT_FAILURE;
+ Effect::setFont(font);
+
+ // Create the effects
+ std::vector<Effect*> effects;
+ effects.push_back(new Pixelate);
+ effects.push_back(new WaveBlur);
+ effects.push_back(new StormBlink);
+ effects.push_back(new Edge);
+ std::size_t current = 0;
+
+ // Initialize them
+ for (std::size_t i = 0; i < effects.size(); ++i)
+ effects[i]->load();
+
+ // Create the messages background
+ sf::Texture textBackgroundTexture;
+ if (!textBackgroundTexture.loadFromFile("resources/text-background.png"))
+ return EXIT_FAILURE;
+ sf::Sprite textBackground(textBackgroundTexture);
+ textBackground.setPosition(0, 520);
+ textBackground.setColor(sf::Color(255, 255, 255, 200));
+
+ // Create the description text
+ sf::Text description("Current effect: " + effects[current]->getName(), font, 20);
+ description.setPosition(10, 530);
+ description.setColor(sf::Color(80, 80, 80));
+
+ // Create the instructions text
+ sf::Text instructions("Press left and right arrows to change the current shader", font, 20);
+ instructions.setPosition(280, 555);
+ instructions.setColor(sf::Color(80, 80, 80));
+
+ // Start the game loop
+ sf::Clock clock;
+ while (window.isOpen())
+ {
+ // Process events
+ sf::Event event;
+ while (window.pollEvent(event))
+ {
+ // Close window: exit
+ if (event.type == sf::Event::Closed)
+ window.close();
+
+ if (event.type == sf::Event::KeyPressed)
+ {
+ switch (event.key.code)
+ {
+ // Escape key: exit
+ case sf::Keyboard::Escape:
+ window.close();
+ break;
+
+ // Left arrow key: previous shader
+ case sf::Keyboard::Left:
+ if (current == 0)
+ current = effects.size() - 1;
+ else
+ current--;
+ description.setString("Current effect: " + effects[current]->getName());
+ break;
+
+ // Right arrow key: next shader
+ case sf::Keyboard::Right:
+ if (current == effects.size() - 1)
+ current = 0;
+ else
+ current++;
+ description.setString("Current effect: " + effects[current]->getName());
+ break;
+
+ default:
+ break;
+ }
+ }
+ }
+
+ // Update the current example
+ float x = static_cast<float>(sf::Mouse::getPosition(window).x) / window.getSize().x;
+ float y = static_cast<float>(sf::Mouse::getPosition(window).y) / window.getSize().y;
+ effects[current]->update(clock.getElapsedTime().asSeconds(), x, y);
+
+ // Clear the window
+ window.clear(sf::Color(255, 128, 0));
+
+ // Draw the current example
+ window.draw(*effects[current]);
+
+ // Draw the text
+ window.draw(textBackground);
+ window.draw(instructions);
+ window.draw(description);
+
+ // Finally, display the rendered frame on screen
+ window.display();
+ }
+
+ // delete the effects
+ for (std::size_t i = 0; i < effects.size(); ++i)
+ delete effects[i];
+
+ return EXIT_SUCCESS;
+}
diff --git a/examples/sockets/CMakeLists.txt b/examples/sockets/CMakeLists.txt new file mode 100644 index 0000000..04b3583 --- /dev/null +++ b/examples/sockets/CMakeLists.txt @@ -0,0 +1,12 @@ +
+set(SRCROOT ${PROJECT_SOURCE_DIR}/examples/sockets)
+
+# all source files
+set(SRC ${SRCROOT}/Sockets.cpp
+ ${SRCROOT}/TCP.cpp
+ ${SRCROOT}/UDP.cpp)
+
+# define the sockets target
+sfml_add_example(sockets
+ SOURCES ${SRC}
+ DEPENDS sfml-network sfml-system)
diff --git a/examples/sockets/Sockets.cpp b/examples/sockets/Sockets.cpp new file mode 100644 index 0000000..a73609c --- /dev/null +++ b/examples/sockets/Sockets.cpp @@ -0,0 +1,59 @@ +
+////////////////////////////////////////////////////////////
+// Headers
+////////////////////////////////////////////////////////////
+#include <iostream>
+#include <cstdlib>
+
+
+void runTcpServer(unsigned short port);
+void runTcpClient(unsigned short port);
+void runUdpServer(unsigned short port);
+void runUdpClient(unsigned short port);
+
+
+////////////////////////////////////////////////////////////
+/// Entry point of application
+///
+/// \return Application exit code
+///
+////////////////////////////////////////////////////////////
+int main()
+{
+ // Choose an arbitrary port for opening sockets
+ const unsigned short port = 50001;
+
+ // TCP, UDP or connected UDP ?
+ char protocol;
+ std::cout << "Do you want to use TCP (t) or UDP (u) ? ";
+ std::cin >> protocol;
+
+ // Client or server ?
+ char who;
+ std::cout << "Do you want to be a server (s) or a client (c) ? ";
+ std::cin >> who;
+
+ if (protocol == 't')
+ {
+ // Test the TCP protocol
+ if (who == 's')
+ runTcpServer(port);
+ else
+ runTcpClient(port);
+ }
+ else
+ {
+ // Test the unconnected UDP protocol
+ if (who == 's')
+ runUdpServer(port);
+ else
+ runUdpClient(port);
+ }
+
+ // Wait until the user presses 'enter' key
+ std::cout << "Press enter to exit..." << std::endl;
+ std::cin.ignore(10000, '\n');
+ std::cin.ignore(10000, '\n');
+
+ return EXIT_SUCCESS;
+}
diff --git a/examples/sockets/TCP.cpp b/examples/sockets/TCP.cpp new file mode 100644 index 0000000..ff1e1f6 --- /dev/null +++ b/examples/sockets/TCP.cpp @@ -0,0 +1,81 @@ +
+////////////////////////////////////////////////////////////
+// Headers
+////////////////////////////////////////////////////////////
+#include <SFML/Network.hpp>
+#include <iostream>
+
+
+////////////////////////////////////////////////////////////
+/// Launch a server, wait for an incoming connection,
+/// send a message and wait for the answer.
+///
+////////////////////////////////////////////////////////////
+void runTcpServer(unsigned short port)
+{
+ // Create a server socket to accept new connections
+ sf::TcpListener listener;
+
+ // Listen to the given port for incoming connections
+ if (listener.listen(port) != sf::Socket::Done)
+ return;
+ std::cout << "Server is listening to port " << port << ", waiting for connections... " << std::endl;
+
+ // Wait for a connection
+ sf::TcpSocket socket;
+ if (listener.accept(socket) != sf::Socket::Done)
+ return;
+ std::cout << "Client connected: " << socket.getRemoteAddress() << std::endl;
+
+ // Send a message to the connected client
+ const char out[] = "Hi, I'm the server";
+ if (socket.send(out, sizeof(out)) != sf::Socket::Done)
+ return;
+ std::cout << "Message sent to the client: \"" << out << "\"" << std::endl;
+
+ // Receive a message back from the client
+ char in[128];
+ std::size_t received;
+ if (socket.receive(in, sizeof(in), received) != sf::Socket::Done)
+ return;
+ std::cout << "Answer received from the client: \"" << in << "\"" << std::endl;
+}
+
+
+////////////////////////////////////////////////////////////
+/// Create a client, connect it to a server, display the
+/// welcome message and send an answer.
+///
+////////////////////////////////////////////////////////////
+void runTcpClient(unsigned short port)
+{
+ // Ask for the server address
+ sf::IpAddress server;
+ do
+ {
+ std::cout << "Type the address or name of the server to connect to: ";
+ std::cin >> server;
+ }
+ while (server == sf::IpAddress::None);
+
+ // Create a socket for communicating with the server
+ sf::TcpSocket socket;
+
+ // Connect to the server
+ if (socket.connect(server, port) != sf::Socket::Done)
+ return;
+ std::cout << "Connected to server " << server << std::endl;
+
+ // Receive a message from the server
+ char in[128];
+ std::size_t received;
+ if (socket.receive(in, sizeof(in), received) != sf::Socket::Done)
+ return;
+ std::cout << "Message received from the server: \"" << in << "\"" << std::endl;
+
+ // Send an answer to the server
+ const char out[] = "Hi, I'm a client";
+ if (socket.send(out, sizeof(out)) != sf::Socket::Done)
+ return;
+ std::cout << "Message sent to the server: \"" << out << "\"" << std::endl;
+}
diff --git a/examples/sockets/UDP.cpp b/examples/sockets/UDP.cpp new file mode 100644 index 0000000..abc7b4b --- /dev/null +++ b/examples/sockets/UDP.cpp @@ -0,0 +1,72 @@ +
+////////////////////////////////////////////////////////////
+// Headers
+////////////////////////////////////////////////////////////
+#include <SFML/Network.hpp>
+#include <iostream>
+
+
+////////////////////////////////////////////////////////////
+/// Launch a server, wait for a message, send an answer.
+///
+////////////////////////////////////////////////////////////
+void runUdpServer(unsigned short port)
+{
+ // Create a socket to receive a message from anyone
+ sf::UdpSocket socket;
+
+ // Listen to messages on the specified port
+ if (socket.bind(port) != sf::Socket::Done)
+ return;
+ std::cout << "Server is listening to port " << port << ", waiting for a message... " << std::endl;
+
+ // Wait for a message
+ char in[128];
+ std::size_t received;
+ sf::IpAddress sender;
+ unsigned short senderPort;
+ if (socket.receive(in, sizeof(in), received, sender, senderPort) != sf::Socket::Done)
+ return;
+ std::cout << "Message received from client " << sender << ": \"" << in << "\"" << std::endl;
+
+ // Send an answer to the client
+ const char out[] = "Hi, I'm the server";
+ if (socket.send(out, sizeof(out), sender, senderPort) != sf::Socket::Done)
+ return;
+ std::cout << "Message sent to the client: \"" << out << "\"" << std::endl;
+}
+
+
+////////////////////////////////////////////////////////////
+/// Send a message to the server, wait for the answer
+///
+////////////////////////////////////////////////////////////
+void runUdpClient(unsigned short port)
+{
+ // Ask for the server address
+ sf::IpAddress server;
+ do
+ {
+ std::cout << "Type the address or name of the server to connect to: ";
+ std::cin >> server;
+ }
+ while (server == sf::IpAddress::None);
+
+ // Create a socket for communicating with the server
+ sf::UdpSocket socket;
+
+ // Send a message to the server
+ const char out[] = "Hi, I'm a client";
+ if (socket.send(out, sizeof(out), server, port) != sf::Socket::Done)
+ return;
+ std::cout << "Message sent to the server: \"" << out << "\"" << std::endl;
+
+ // Receive an answer from anyone (but most likely from the server)
+ char in[128];
+ std::size_t received;
+ sf::IpAddress sender;
+ unsigned short senderPort;
+ if (socket.receive(in, sizeof(in), received, sender, senderPort) != sf::Socket::Done)
+ return;
+ std::cout << "Message received from " << sender << ": \"" << in << "\"" << std::endl;
+}
diff --git a/examples/sound/CMakeLists.txt b/examples/sound/CMakeLists.txt new file mode 100644 index 0000000..12f12e1 --- /dev/null +++ b/examples/sound/CMakeLists.txt @@ -0,0 +1,10 @@ +
+set(SRCROOT ${PROJECT_SOURCE_DIR}/examples/sound)
+
+# all source files
+set(SRC ${SRCROOT}/Sound.cpp)
+
+# define the sound target
+sfml_add_example(sound
+ SOURCES ${SRC}
+ DEPENDS sfml-audio sfml-system)
diff --git a/examples/sound/Sound.cpp b/examples/sound/Sound.cpp new file mode 100644 index 0000000..5c75ab8 --- /dev/null +++ b/examples/sound/Sound.cpp @@ -0,0 +1,98 @@ +
+////////////////////////////////////////////////////////////
+// Headers
+////////////////////////////////////////////////////////////
+#include <SFML/Audio.hpp>
+#include <iomanip>
+#include <iostream>
+
+
+////////////////////////////////////////////////////////////
+/// Play a sound
+///
+////////////////////////////////////////////////////////////
+void playSound()
+{
+ // Load a sound buffer from a wav file
+ sf::SoundBuffer buffer;
+ if (!buffer.loadFromFile("resources/canary.wav"))
+ return;
+
+ // Display sound informations
+ std::cout << "canary.wav :" << std::endl;
+ std::cout << " " << buffer.getDuration().asSeconds() << " seconds" << std::endl;
+ std::cout << " " << buffer.getSampleRate() << " samples / sec" << std::endl;
+ std::cout << " " << buffer.getChannelCount() << " channels" << std::endl;
+
+ // Create a sound instance and play it
+ sf::Sound sound(buffer);
+ sound.play();
+
+ // Loop while the sound is playing
+ while (sound.getStatus() == sf::Sound::Playing)
+ {
+ // Leave some CPU time for other processes
+ sf::sleep(sf::milliseconds(100));
+
+ // Display the playing position
+ std::cout << "\rPlaying... " << std::fixed << std::setprecision(2) << sound.getPlayingOffset().asSeconds() << " sec ";
+ std::cout << std::flush;
+ }
+ std::cout << std::endl << std::endl;
+}
+
+
+////////////////////////////////////////////////////////////
+/// Play a music
+///
+////////////////////////////////////////////////////////////
+void playMusic()
+{
+ // Load an ogg music file
+ sf::Music music;
+ if (!music.openFromFile("resources/orchestral.ogg"))
+ return;
+
+ // Display music informations
+ std::cout << "orchestral.ogg :" << std::endl;
+ std::cout << " " << music.getDuration().asSeconds() << " seconds" << std::endl;
+ std::cout << " " << music.getSampleRate() << " samples / sec" << std::endl;
+ std::cout << " " << music.getChannelCount() << " channels" << std::endl;
+
+ // Play it
+ music.play();
+
+ // Loop while the music is playing
+ while (music.getStatus() == sf::Music::Playing)
+ {
+ // Leave some CPU time for other processes
+ sf::sleep(sf::milliseconds(100));
+
+ // Display the playing position
+ std::cout << "\rPlaying... " << std::fixed << std::setprecision(2) << music.getPlayingOffset().asSeconds() << " sec ";
+ std::cout << std::flush;
+ }
+ std::cout << std::endl;
+}
+
+
+////////////////////////////////////////////////////////////
+/// Entry point of application
+///
+/// \return Application exit code
+///
+////////////////////////////////////////////////////////////
+int main()
+{
+ // Play a sound
+ playSound();
+
+ // Play a music
+ playMusic();
+
+ // Wait until the user presses 'enter' key
+ std::cout << "Press enter to exit..." << std::endl;
+ std::cin.ignore(10000, '\n');
+
+ return EXIT_SUCCESS;
+}
diff --git a/examples/sound_capture/CMakeLists.txt b/examples/sound_capture/CMakeLists.txt new file mode 100644 index 0000000..ac75c3c --- /dev/null +++ b/examples/sound_capture/CMakeLists.txt @@ -0,0 +1,10 @@ +
+set(SRCROOT ${PROJECT_SOURCE_DIR}/examples/sound_capture)
+
+# all source files
+set(SRC ${SRCROOT}/SoundCapture.cpp)
+
+# define the sound-capture target
+sfml_add_example(sound-capture
+ SOURCES ${SRC}
+ DEPENDS sfml-audio sfml-system)
diff --git a/examples/sound_capture/SoundCapture.cpp b/examples/sound_capture/SoundCapture.cpp new file mode 100644 index 0000000..a6946ac --- /dev/null +++ b/examples/sound_capture/SoundCapture.cpp @@ -0,0 +1,95 @@ +
+////////////////////////////////////////////////////////////
+// Headers
+////////////////////////////////////////////////////////////
+#include <SFML/Audio.hpp>
+#include <iomanip>
+#include <iostream>
+
+
+////////////////////////////////////////////////////////////
+/// Entry point of application
+///
+/// \return Application exit code
+///
+////////////////////////////////////////////////////////////
+int main()
+{
+ // Check that the device can capture audio
+ if (sf::SoundRecorder::isAvailable() == false)
+ {
+ std::cout << "Sorry, audio capture is not supported by your system" << std::endl;
+ return EXIT_SUCCESS;
+ }
+
+ // Choose the sample rate
+ unsigned int sampleRate;
+ std::cout << "Please choose the sample rate for sound capture (44100 is CD quality) : ";
+ std::cin >> sampleRate;
+ std::cin.ignore(10000, '\n');
+
+ // Wait for user input...
+ std::cout << "Press enter to start recording audio";
+ std::cin.ignore(10000, '\n');
+
+ // Here we'll use an integrated custom recorder, which saves the captured data into a SoundBuffer
+ sf::SoundBufferRecorder recorder;
+
+ // Audio capture is done in a separate thread, so we can block the main thread while it is capturing
+ recorder.start(sampleRate);
+ std::cout << "Recording... press enter to stop";
+ std::cin.ignore(10000, '\n');
+ recorder.stop();
+
+ // Get the buffer containing the captured data
+ const sf::SoundBuffer& buffer = recorder.getBuffer();
+
+ // Display captured sound informations
+ std::cout << "Sound information :" << std::endl;
+ std::cout << " " << buffer.getDuration().asSeconds() << " seconds" << std::endl;
+ std::cout << " " << buffer.getSampleRate() << " samples / seconds" << std::endl;
+ std::cout << " " << buffer.getChannelCount() << " channels" << std::endl;
+
+ // Choose what to do with the recorded sound data
+ char choice;
+ std::cout << "What do you want to do with captured sound (p = play, s = save) ? ";
+ std::cin >> choice;
+ std::cin.ignore(10000, '\n');
+
+ if (choice == 's')
+ {
+ // Choose the filename
+ std::string filename;
+ std::cout << "Choose the file to create : ";
+ std::getline(std::cin, filename);
+
+ // Save the buffer
+ buffer.saveToFile(filename);
+ }
+ else
+ {
+ // Create a sound instance and play it
+ sf::Sound sound(buffer);
+ sound.play();
+
+ // Wait until finished
+ while (sound.getStatus() == sf::Sound::Playing)
+ {
+ // Display the playing position
+ std::cout << "\rPlaying... " << std::fixed << std::setprecision(2) << sound.getPlayingOffset().asSeconds() << " sec";
+ std::cout << std::flush;
+
+ // Leave some CPU time for other threads
+ sf::sleep(sf::milliseconds(100));
+ }
+ }
+
+ // Finished !
+ std::cout << std::endl << "Done !" << std::endl;
+
+ // Wait until the user presses 'enter' key
+ std::cout << "Press enter to exit..." << std::endl;
+ std::cin.ignore(10000, '\n');
+
+ return EXIT_SUCCESS;
+}
diff --git a/examples/voip/CMakeLists.txt b/examples/voip/CMakeLists.txt new file mode 100644 index 0000000..c2e0738 --- /dev/null +++ b/examples/voip/CMakeLists.txt @@ -0,0 +1,12 @@ +
+set(SRCROOT ${PROJECT_SOURCE_DIR}/examples/voip)
+
+# all source files
+set(SRC ${SRCROOT}/VoIP.cpp
+ ${SRCROOT}/Client.cpp
+ ${SRCROOT}/Server.cpp)
+
+# define the voip target
+sfml_add_example(voip
+ SOURCES ${SRC}
+ DEPENDS sfml-audio sfml-network sfml-system)
diff --git a/examples/voip/Client.cpp b/examples/voip/Client.cpp new file mode 100644 index 0000000..ceb2da6 --- /dev/null +++ b/examples/voip/Client.cpp @@ -0,0 +1,129 @@ +
+////////////////////////////////////////////////////////////
+// Headers
+////////////////////////////////////////////////////////////
+#include <SFML/Audio.hpp>
+#include <SFML/Network.hpp>
+#include <iostream>
+
+
+const sf::Uint8 audioData = 1;
+const sf::Uint8 endOfStream = 2;
+
+
+////////////////////////////////////////////////////////////
+/// Specialization of audio recorder for sending recorded audio
+/// data through the network
+////////////////////////////////////////////////////////////
+class NetworkRecorder : public sf::SoundRecorder
+{
+public :
+
+ ////////////////////////////////////////////////////////////
+ /// Constructor
+ ///
+ /// \param host Remote host to which send the recording data
+ /// \param port Port of the remote host
+ ///
+ ////////////////////////////////////////////////////////////
+ NetworkRecorder(const sf::IpAddress& host, unsigned short port) :
+ m_host(host),
+ m_port(port)
+ {
+ }
+
+private :
+
+ ////////////////////////////////////////////////////////////
+ /// /see SoundRecorder::OnStart
+ ///
+ ////////////////////////////////////////////////////////////
+ virtual bool onStart()
+ {
+ if (m_socket.connect(m_host, m_port) == sf::Socket::Done)
+ {
+ std::cout << "Connected to server " << m_host << std::endl;
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ ////////////////////////////////////////////////////////////
+ /// /see SoundRecorder::ProcessSamples
+ ///
+ ////////////////////////////////////////////////////////////
+ virtual bool onProcessSamples(const sf::Int16* samples, std::size_t sampleCount)
+ {
+ // Pack the audio samples into a network packet
+ sf::Packet packet;
+ packet << audioData;
+ packet.append(samples, sampleCount * sizeof(sf::Int16));
+
+ // Send the audio packet to the server
+ return m_socket.send(packet) == sf::Socket::Done;
+ }
+
+ ////////////////////////////////////////////////////////////
+ /// /see SoundRecorder::OnStop
+ ///
+ ////////////////////////////////////////////////////////////
+ virtual void onStop()
+ {
+ // Send a "end-of-stream" packet
+ sf::Packet packet;
+ packet << endOfStream;
+ m_socket.send(packet);
+
+ // Close the socket
+ m_socket.disconnect();
+ }
+
+ ////////////////////////////////////////////////////////////
+ // Member data
+ ////////////////////////////////////////////////////////////
+ sf::IpAddress m_host; ///< Address of the remote host
+ unsigned short m_port; ///< Remote port
+ sf::TcpSocket m_socket; ///< Socket used to communicate with the server
+};
+
+
+////////////////////////////////////////////////////////////
+/// Create a client, connect it to a running server and
+/// start sending him audio data
+///
+////////////////////////////////////////////////////////////
+void doClient(unsigned short port)
+{
+ // Check that the device can capture audio
+ if (sf::SoundRecorder::isAvailable() == false)
+ {
+ std::cout << "Sorry, audio capture is not supported by your system" << std::endl;
+ return;
+ }
+
+ // Ask for server address
+ sf::IpAddress server;
+ do
+ {
+ std::cout << "Type address or name of the server to connect to : ";
+ std::cin >> server;
+ }
+ while (server == sf::IpAddress::None);
+
+ // Create an instance of our custom recorder
+ NetworkRecorder recorder(server, port);
+
+ // Wait for user input...
+ std::cin.ignore(10000, '\n');
+ std::cout << "Press enter to start recording audio";
+ std::cin.ignore(10000, '\n');
+
+ // Start capturing audio data
+ recorder.start(44100);
+ std::cout << "Recording... press enter to stop";
+ std::cin.ignore(10000, '\n');
+ recorder.stop();
+}
diff --git a/examples/voip/Server.cpp b/examples/voip/Server.cpp new file mode 100644 index 0000000..29227fa --- /dev/null +++ b/examples/voip/Server.cpp @@ -0,0 +1,200 @@ +
+////////////////////////////////////////////////////////////
+// Headers
+////////////////////////////////////////////////////////////
+#include <SFML/Audio.hpp>
+#include <SFML/Network.hpp>
+#include <iomanip>
+#include <iostream>
+#include <iterator>
+
+
+const sf::Uint8 audioData = 1;
+const sf::Uint8 endOfStream = 2;
+
+
+////////////////////////////////////////////////////////////
+/// Customized sound stream for acquiring audio data
+/// from the network
+////////////////////////////////////////////////////////////
+class NetworkAudioStream : public sf::SoundStream
+{
+public :
+
+ ////////////////////////////////////////////////////////////
+ /// Default constructor
+ ///
+ ////////////////////////////////////////////////////////////
+ NetworkAudioStream() :
+ m_offset (0),
+ m_hasFinished(false)
+ {
+ // Set the sound parameters
+ initialize(1, 44100);
+ }
+
+ ////////////////////////////////////////////////////////////
+ /// Run the server, stream audio data from the client
+ ///
+ ////////////////////////////////////////////////////////////
+ void start(unsigned short port)
+ {
+ if (!m_hasFinished)
+ {
+ // Listen to the given port for incoming connections
+ if (m_listener.listen(port) != sf::Socket::Done)
+ return;
+ std::cout << "Server is listening to port " << port << ", waiting for connections... " << std::endl;
+
+ // Wait for a connection
+ if (m_listener.accept(m_client) != sf::Socket::Done)
+ return;
+ std::cout << "Client connected: " << m_client.getRemoteAddress() << std::endl;
+
+ // Start playback
+ play();
+
+ // Start receiving audio data
+ receiveLoop();
+ }
+ else
+ {
+ // Start playback
+ play();
+ }
+ }
+
+private :
+
+ ////////////////////////////////////////////////////////////
+ /// /see SoundStream::OnGetData
+ ///
+ ////////////////////////////////////////////////////////////
+ virtual bool onGetData(sf::SoundStream::Chunk& data)
+ {
+ // We have reached the end of the buffer and all audio data have been played : we can stop playback
+ if ((m_offset >= m_samples.size()) && m_hasFinished)
+ return false;
+
+ // No new data has arrived since last update : wait until we get some
+ while ((m_offset >= m_samples.size()) && !m_hasFinished)
+ sf::sleep(sf::milliseconds(10));
+
+ // Copy samples into a local buffer to avoid synchronization problems
+ // (don't forget that we run in two separate threads)
+ {
+ sf::Lock lock(m_mutex);
+ m_tempBuffer.assign(m_samples.begin() + m_offset, m_samples.end());
+ }
+
+ // Fill audio data to pass to the stream
+ data.samples = &m_tempBuffer[0];
+ data.sampleCount = m_tempBuffer.size();
+
+ // Update the playing offset
+ m_offset += m_tempBuffer.size();
+
+ return true;
+ }
+
+ ////////////////////////////////////////////////////////////
+ /// /see SoundStream::OnSeek
+ ///
+ ////////////////////////////////////////////////////////////
+ virtual void onSeek(sf::Time timeOffset)
+ {
+ m_offset = timeOffset.asMilliseconds() * getSampleRate() * getChannelCount() / 1000;
+ }
+
+ ////////////////////////////////////////////////////////////
+ /// Get audio data from the client until playback is stopped
+ ///
+ ////////////////////////////////////////////////////////////
+ void receiveLoop()
+ {
+ while (!m_hasFinished)
+ {
+ // Get waiting audio data from the network
+ sf::Packet packet;
+ if (m_client.receive(packet) != sf::Socket::Done)
+ break;
+
+ // Extract the message ID
+ sf::Uint8 id;
+ packet >> id;
+
+ if (id == audioData)
+ {
+ // Extract audio samples from the packet, and append it to our samples buffer
+ const sf::Int16* samples = reinterpret_cast<const sf::Int16*>(static_cast<const char*>(packet.getData()) + 1);
+ std::size_t sampleCount = (packet.getDataSize() - 1) / sizeof(sf::Int16);
+
+ // Don't forget that the other thread can access the sample array at any time
+ // (so we protect any operation on it with the mutex)
+ {
+ sf::Lock lock(m_mutex);
+ std::copy(samples, samples + sampleCount, std::back_inserter(m_samples));
+ }
+ }
+ else if (id == endOfStream)
+ {
+ // End of stream reached : we stop receiving audio data
+ std::cout << "Audio data has been 100% received!" << std::endl;
+ m_hasFinished = true;
+ }
+ else
+ {
+ // Something's wrong...
+ std::cout << "Invalid packet received..." << std::endl;
+ m_hasFinished = true;
+ }
+ }
+ }
+
+ ////////////////////////////////////////////////////////////
+ // Member data
+ ////////////////////////////////////////////////////////////
+ sf::TcpListener m_listener;
+ sf::TcpSocket m_client;
+ sf::Mutex m_mutex;
+ std::vector<sf::Int16> m_samples;
+ std::vector<sf::Int16> m_tempBuffer;
+ std::size_t m_offset;
+ bool m_hasFinished;
+};
+
+
+////////////////////////////////////////////////////////////
+/// Launch a server and wait for incoming audio data from
+/// a connected client
+///
+////////////////////////////////////////////////////////////
+void doServer(unsigned short port)
+{
+ // Build an audio stream to play sound data as it is received through the network
+ NetworkAudioStream audioStream;
+ audioStream.start(port);
+
+ // Loop until the sound playback is finished
+ while (audioStream.getStatus() != sf::SoundStream::Stopped)
+ {
+ // Leave some CPU time for other threads
+ sf::sleep(sf::milliseconds(100));
+ }
+
+ std::cin.ignore(10000, '\n');
+
+ // Wait until the user presses 'enter' key
+ std::cout << "Press enter to replay the sound..." << std::endl;
+ std::cin.ignore(10000, '\n');
+
+ // Replay the sound (just to make sure replaying the received data is OK)
+ audioStream.play();
+
+ // Loop until the sound playback is finished
+ while (audioStream.getStatus() != sf::SoundStream::Stopped)
+ {
+ // Leave some CPU time for other threads
+ sf::sleep(sf::milliseconds(100));
+ }
+}
diff --git a/examples/voip/VoIP.cpp b/examples/voip/VoIP.cpp new file mode 100644 index 0000000..93f9512 --- /dev/null +++ b/examples/voip/VoIP.cpp @@ -0,0 +1,50 @@ +
+////////////////////////////////////////////////////////////
+// Headers
+////////////////////////////////////////////////////////////
+#include <iomanip>
+#include <iostream>
+#include <cstdlib>
+
+
+////////////////////////////////////////////////////////////
+// Function prototypes
+// (I'm too lazy to put them into separate headers...)
+////////////////////////////////////////////////////////////
+void doClient(unsigned short port);
+void doServer(unsigned short port);
+
+
+////////////////////////////////////////////////////////////
+/// Entry point of application
+///
+/// \return Application exit code
+///
+////////////////////////////////////////////////////////////
+int main()
+{
+ // Choose a random port for opening sockets (ports < 1024 are reserved)
+ const unsigned short port = 2435;
+
+ // Client or server ?
+ char who;
+ std::cout << "Do you want to be a server ('s') or a client ('c') ? ";
+ std::cin >> who;
+
+ if (who == 's')
+ {
+ // Run as a server
+ doServer(port);
+ }
+ else
+ {
+ // Run as a client
+ doClient(port);
+ }
+
+ // Wait until the user presses 'enter' key
+ std::cout << "Press enter to exit..." << std::endl;
+ std::cin.ignore(10000, '\n');
+
+ return EXIT_SUCCESS;
+}
diff --git a/examples/win32/CMakeLists.txt b/examples/win32/CMakeLists.txt new file mode 100644 index 0000000..edd8237 --- /dev/null +++ b/examples/win32/CMakeLists.txt @@ -0,0 +1,10 @@ +
+set(SRCROOT ${PROJECT_SOURCE_DIR}/examples/win32)
+
+# all source files
+set(SRC ${SRCROOT}/Win32.cpp)
+
+# define the win32 target
+sfml_add_example(win32 GUI_APP
+ SOURCES ${SRC}
+ DEPENDS sfml-graphics sfml-window sfml-system)
diff --git a/examples/win32/Win32.cpp b/examples/win32/Win32.cpp new file mode 100644 index 0000000..4d70931 --- /dev/null +++ b/examples/win32/Win32.cpp @@ -0,0 +1,130 @@ +
+////////////////////////////////////////////////////////////
+// Headers
+////////////////////////////////////////////////////////////
+#include <SFML/Graphics.hpp>
+#include <windows.h>
+#include <cmath>
+
+HWND button;
+
+
+////////////////////////////////////////////////////////////
+/// Function called whenever one of our windows receives a message
+///
+////////////////////////////////////////////////////////////
+LRESULT CALLBACK onEvent(HWND handle, UINT message, WPARAM wParam, LPARAM lParam)
+{
+ switch (message)
+ {
+ // Quit when we close the main window
+ case WM_CLOSE :
+ {
+ PostQuitMessage(0);
+ return 0;
+ }
+
+ // Quit when we click the "quit" button
+ case WM_COMMAND :
+ {
+ if (reinterpret_cast<HWND>(lParam) == button)
+ {
+ PostQuitMessage(0);
+ return 0;
+ }
+ }
+ }
+
+ return DefWindowProc(handle, message, wParam, lParam);
+}
+
+
+////////////////////////////////////////////////////////////
+/// Entry point of application
+///
+/// \param Instance : Instance of the application
+///
+/// \return Error code
+///
+////////////////////////////////////////////////////////////
+INT WINAPI WinMain(HINSTANCE instance, HINSTANCE, LPSTR, INT)
+{
+ // Define a class for our main window
+ WNDCLASS windowClass;
+ windowClass.style = 0;
+ windowClass.lpfnWndProc = &onEvent;
+ windowClass.cbClsExtra = 0;
+ windowClass.cbWndExtra = 0;
+ windowClass.hInstance = instance;
+ windowClass.hIcon = NULL;
+ windowClass.hCursor = 0;
+ windowClass.hbrBackground = reinterpret_cast<HBRUSH>(COLOR_BACKGROUND);
+ windowClass.lpszMenuName = NULL;
+ windowClass.lpszClassName = TEXT("SFML App");
+ RegisterClass(&windowClass);
+
+ // Let's create the main window
+ HWND window = CreateWindow(TEXT("SFML App"), TEXT("SFML Win32"), WS_SYSMENU | WS_VISIBLE, 200, 200, 660, 520, NULL, NULL, instance, NULL);
+
+ // Add a button for exiting
+ button = CreateWindow(TEXT("BUTTON"), TEXT("Quit"), WS_CHILD | WS_VISIBLE, 560, 440, 80, 40, window, NULL, instance, NULL);
+
+ // Let's create two SFML views
+ HWND view1 = CreateWindow(TEXT("STATIC"), NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS, 20, 20, 300, 400, window, NULL, instance, NULL);
+ HWND view2 = CreateWindow(TEXT("STATIC"), NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS, 340, 20, 300, 400, window, NULL, instance, NULL);
+ sf::RenderWindow SFMLView1(view1);
+ sf::RenderWindow SFMLView2(view2);
+
+ // Load some textures to display
+ sf::Texture texture1, texture2;
+ if (!texture1.loadFromFile("resources/image1.jpg") || !texture2.loadFromFile("resources/image2.jpg"))
+ return EXIT_FAILURE;
+ sf::Sprite sprite1(texture1);
+ sf::Sprite sprite2(texture2);
+ sprite1.setOrigin(sf::Vector2f(texture1.getSize()) / 2.f);
+ sprite1.setPosition(sprite1.getOrigin());
+
+ // Create a clock for measuring elapsed time
+ sf::Clock clock;
+
+ // Loop until a WM_QUIT message is received
+ MSG message;
+ message.message = static_cast<UINT>(~WM_QUIT);
+ while (message.message != WM_QUIT)
+ {
+ if (PeekMessage(&message, NULL, 0, 0, PM_REMOVE))
+ {
+ // If a message was waiting in the message queue, process it
+ TranslateMessage(&message);
+ DispatchMessage(&message);
+ }
+ else
+ {
+ float time = clock.getElapsedTime().asSeconds();
+
+ // Clear views
+ SFMLView1.clear();
+ SFMLView2.clear();
+
+ // Draw sprite 1 on view 1
+ sprite1.setRotation(time * 100);
+ SFMLView1.draw(sprite1);
+
+ // Draw sprite 2 on view 2
+ sprite2.setPosition(std::cos(time) * 100.f, 0.f);
+ SFMLView2.draw(sprite2);
+
+ // Display each view on screen
+ SFMLView1.display();
+ SFMLView2.display();
+ }
+ }
+
+ // Destroy the main window (all its child controls will be destroyed)
+ DestroyWindow(window);
+
+ // Don't forget to unregister the window class
+ UnregisterClass(TEXT("SFML App"), instance);
+
+ return EXIT_SUCCESS;
+}
diff --git a/examples/window/CMakeLists.txt b/examples/window/CMakeLists.txt new file mode 100644 index 0000000..a9edafa --- /dev/null +++ b/examples/window/CMakeLists.txt @@ -0,0 +1,14 @@ +
+set(SRCROOT ${PROJECT_SOURCE_DIR}/examples/window)
+
+# all source files
+set(SRC ${SRCROOT}/Window.cpp)
+
+# find OpenGL and GLU
+find_package(OpenGL REQUIRED)
+include_directories(${OPENGL_INCLUDE_DIR})
+
+# define the window target
+sfml_add_example(window GUI_APP
+ SOURCES ${SRC}
+ DEPENDS sfml-window sfml-system ${OPENGL_LIBRARIES})
diff --git a/examples/window/Window.cpp b/examples/window/Window.cpp new file mode 100644 index 0000000..360703b --- /dev/null +++ b/examples/window/Window.cpp @@ -0,0 +1,146 @@ +////////////////////////////////////////////////////////////
+// Headers
+////////////////////////////////////////////////////////////
+#include <SFML/Window.hpp>
+#include <SFML/OpenGL.hpp>
+
+
+////////////////////////////////////////////////////////////
+/// Entry point of application
+///
+/// \return Application exit code
+///
+////////////////////////////////////////////////////////////
+int main()
+{
+ // Request a 32-bits depth buffer when creating the window
+ sf::ContextSettings contextSettings;
+ contextSettings.depthBits = 32;
+
+ // Create the main window
+ sf::Window window(sf::VideoMode(640, 480), "SFML window with OpenGL", sf::Style::Default, contextSettings);
+
+ // Make it the active window for OpenGL calls
+ window.setActive();
+
+ // Set the color and depth clear values
+ glClearDepth(1.f);
+ glClearColor(0.f, 0.f, 0.f, 1.f);
+
+ // Enable Z-buffer read and write
+ glEnable(GL_DEPTH_TEST);
+ glDepthMask(GL_TRUE);
+
+ // Disable lighting and texturing
+ glDisable(GL_LIGHTING);
+ glDisable(GL_TEXTURE_2D);
+
+ // Configure the viewport (the same size as the window)
+ glViewport(0, 0, window.getSize().x, window.getSize().y);
+
+ // Setup a perspective projection
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ GLfloat ratio = static_cast<float>(window.getSize().x) / window.getSize().y;
+ glFrustum(-ratio, ratio, -1.f, 1.f, 1.f, 500.f);
+
+ // Define a 3D cube (6 faces made of 2 triangles composed by 3 vertices)
+ GLfloat cube[] =
+ {
+ // positions // colors (r, g, b, a)
+ -50, -50, -50, 0, 0, 1, 1,
+ -50, 50, -50, 0, 0, 1, 1,
+ -50, -50, 50, 0, 0, 1, 1,
+ -50, -50, 50, 0, 0, 1, 1,
+ -50, 50, -50, 0, 0, 1, 1,
+ -50, 50, 50, 0, 0, 1, 1,
+
+ 50, -50, -50, 0, 1, 0, 1,
+ 50, 50, -50, 0, 1, 0, 1,
+ 50, -50, 50, 0, 1, 0, 1,
+ 50, -50, 50, 0, 1, 0, 1,
+ 50, 50, -50, 0, 1, 0, 1,
+ 50, 50, 50, 0, 1, 0, 1,
+
+ -50, -50, -50, 1, 0, 0, 1,
+ 50, -50, -50, 1, 0, 0, 1,
+ -50, -50, 50, 1, 0, 0, 1,
+ -50, -50, 50, 1, 0, 0, 1,
+ 50, -50, -50, 1, 0, 0, 1,
+ 50, -50, 50, 1, 0, 0, 1,
+
+ -50, 50, -50, 0, 1, 1, 1,
+ 50, 50, -50, 0, 1, 1, 1,
+ -50, 50, 50, 0, 1, 1, 1,
+ -50, 50, 50, 0, 1, 1, 1,
+ 50, 50, -50, 0, 1, 1, 1,
+ 50, 50, 50, 0, 1, 1, 1,
+
+ -50, -50, -50, 1, 0, 1, 1,
+ 50, -50, -50, 1, 0, 1, 1,
+ -50, 50, -50, 1, 0, 1, 1,
+ -50, 50, -50, 1, 0, 1, 1,
+ 50, -50, -50, 1, 0, 1, 1,
+ 50, 50, -50, 1, 0, 1, 1,
+
+ -50, -50, 50, 1, 1, 0, 1,
+ 50, -50, 50, 1, 1, 0, 1,
+ -50, 50, 50, 1, 1, 0, 1,
+ -50, 50, 50, 1, 1, 0, 1,
+ 50, -50, 50, 1, 1, 0, 1,
+ 50, 50, 50, 1, 1, 0, 1,
+ };
+
+ // Enable position and color vertex components
+ glEnableClientState(GL_VERTEX_ARRAY);
+ glEnableClientState(GL_COLOR_ARRAY);
+ glVertexPointer(3, GL_FLOAT, 7 * sizeof(GLfloat), cube);
+ glColorPointer(4, GL_FLOAT, 7 * sizeof(GLfloat), cube + 3);
+
+ // Disable normal and texture coordinates vertex components
+ glDisableClientState(GL_NORMAL_ARRAY);
+ glDisableClientState(GL_TEXTURE_COORD_ARRAY);
+
+ // Create a clock for measuring the time elapsed
+ sf::Clock clock;
+
+ // Start the game loop
+ while (window.isOpen())
+ {
+ // Process events
+ sf::Event event;
+ while (window.pollEvent(event))
+ {
+ // Close window: exit
+ if (event.type == sf::Event::Closed)
+ window.close();
+
+ // Escape key: exit
+ if ((event.type == sf::Event::KeyPressed) && (event.key.code == sf::Keyboard::Escape))
+ window.close();
+
+ // Resize event: adjust the viewport
+ if (event.type == sf::Event::Resized)
+ glViewport(0, 0, event.size.width, event.size.height);
+ }
+
+ // Clear the color and depth buffers
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ // Apply some transformations to rotate the cube
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ glTranslatef(0.f, 0.f, -200.f);
+ glRotatef(clock.getElapsedTime().asSeconds() * 50, 1.f, 0.f, 0.f);
+ glRotatef(clock.getElapsedTime().asSeconds() * 30, 0.f, 1.f, 0.f);
+ glRotatef(clock.getElapsedTime().asSeconds() * 90, 0.f, 0.f, 1.f);
+
+ // Draw the cube
+ glDrawArrays(GL_TRIANGLES, 0, 36);
+
+ // Finally, display the rendered frame on screen
+ window.display();
+ }
+
+ return EXIT_SUCCESS;
+}
|