OSDN Git Service

Initial check-in for xhtml parser.
authortkawata <takuji.kawata@gmail.com>
Mon, 9 Jan 2012 23:35:36 +0000 (08:35 +0900)
committertkawata <takuji.kawata@gmail.com>
Mon, 9 Jan 2012 23:35:36 +0000 (08:35 +0900)
Need to work on more.

Samples/HTML/Sample1.html
Source/DNContainerBuilder.cpp
Source/DNContainerBuilder.h
Source/DNXMLElement.cpp
Source/DNXMLElement.h
Source/platform/osx/OSXDNXMLImpl.h
Source/platform/osx/OSXDNXMLImpl.mm
dennco.xcodeproj/project.pbxproj
dennco/AppDelegate.h
dennco/AppDelegate.mm
dennco/en.lproj/MainMenu.xib

index 6eeeae6..d3f50b4 100644 (file)
@@ -16,7 +16,7 @@
             
         }
         
-        pre.dencco-script { 
+        pre.dennco-script { 
                         border:             1px solid gray;
                         background-color:   #f0f0cc;
                         margin-left:        2em;
         </style>
     </head>
 <body>
-    <H1>DENCCO Project. Sample</H1>
+    <H1>dennco Project. Sample</H1>
     
     <h2>Cell Code Class Definitions</h2>
-    <a name="SampleScript1" class="dennco-classdef">
+    <a name='SampleScript1' class='dennco-classdef'>
     <div class="style-classdef">
         <dl>
             <dt>Code class:</dt>
             <dd>SampleScript1</dd>
             <dt>API TYPE:</dt>
-            <dd class="dencco-api">TKJSBasicCell</dd>
+            <dd class="dennco-api">TKJSBasicCell</dd>
         </dl>
         
-        <pre class="dencco-script">
+        <pre class="dennco-script">
         
         function doTick(time)   
         {
         </pre>
     </div>
     </a>
-    <a name="SampleScript2" class="dencco-classdef">
+    <a name="SampleScript2" class="dennco-classdef">
         <div class="style-classdef">
             <dl>
-                <dt>Code class:</dt>
+                <dt>Code class2:</dt>
                 <dd>SampleScript2</dd>
-                <dt>API TYPE:</dt>
-                <dd class="dencco-api">TKJSBasicCell</dd>
+                <dt>API TYPE2:</dt>
+                <dd class="dennco-api">TKJSBasicCell</dd>
             </dl>
             
-        <pre class="dencco-script">
+        <pre class="dennco-script">
                 
         var positiveInputs;
         var negativeInputs;
     
     <h2>Cells (Neurons)</h2>
 
-    <a name="cell1-1" class="dencco-cell">
+    <a name="cell1-1" class="dennco-cell">
     <div class="style-cell">
         <dl>
             <dt>Cell Name:</dt>
             <dd>cell1-1</dd>
             <dt>Code class:</dt>
-            <dd><a href="#SampleScript1" class="dencco-script">SampleScript1</a></dd>
+            <dd><a href="#SampleScript1" class="dennco-script">SampleScript1</a></dd>
             <dt>Init Script:</dt>
             <dd>
-                <pre class="dencco-script">
+                <pre class="dennco-script">
             
     // init code here    
                 </pre>
     </div>
     </a>
 
-    <a name="cell1-2" class="dencco-cell">
+    <a name="cell1-2" class="dennco-cell">
     <div class="style-cell">
         Cell name  : cell1-2 </br>
-        Code class : <a href="#SampleScript1" class="dencco-script">SampleScript1</a>
-        <pre class="dencco-script">
+        Code class : <a href="#SampleScript1" class="dennco-script">SampleScript1</a>
+        <pre class="dennco-script">
             
     // init code here    
         </pre>
     </div>
     </a>
 
-    <a name="cell1-3" class="dencco-cell">
+    <a name="cell1-3" class="dennco-cell">
     <div class="style-cell">
         Cell name  : cell1-3 </br>
-        Code class : <a href="#SampleScript1" class="dencco-script">SampleScript1</a>
-        <pre class="dencco-script">
+        Code class : <a href="#SampleScript1" class="dennco-script">SampleScript1</a>
+        <pre class="dennco-script">
             
     // init code here    
         </pre>
     </div>
     </a>
 
-    <a name="cell2-1" class="dencco-cell">
+    <a name="cell2-1" class="dennco-cell">
         <div class="style-cell">
             Cell name  : cell2-1 </br>
-            Code class : <a href="#SampleScript2" class="dencco-script">SampleScript2</a>
-            <pre class="dencco-script">
+            Code class : <a href="#SampleScript2" class="dennco-script">SampleScript2</a>
+            <pre class="dennco-script">
                 
     positiveInputs = {"cell1-1", "cell1-2"};
     negativeInputs = {"cell1-3"}    
         </div>
     </a>
 
-    <a name="cell2-2" class="dencco-cell">
+    <a name="cell2-2" class="dennco-cell">
         <div class="style-cell">
             Cell name  : cell2-2 </br>
-            Code class : <a href="#SampleScript2" class="dencco-script">SampleScript2</a>
-            <pre class="dencco-script">
+            Code class : <a href="#SampleScript2" class="dennco-script">SampleScript2</a>
+            <pre class="dennco-script">
                 
     positiveInputs = {"cell1-3"};
     negativeInputs = {"cell1-1", "cell1-2"}    
         </div>
     </a>
 
-    <a name="cell3-1" class="dencco-cell">
+    <a name='cell3-1' class='dennco-cell'>
         <div class="style-cell">
             Cell name  : cell3-1 </br>
-            Code class : <a href="#SampleScript1" class="dencco-script">SampleScript2</a>
-            <pre class="dencco-script">
+            Code class : <a href="#SampleScript1" class="dennco-script">SampleScript2</a>
+            <pre class='dennco-script'>
         
     positiveInputs = {"cell2-1"};
     negativeInputs = {"cell2-2"}    
index a44d471..7d3f77b 100644 (file)
 
 #include "DNContainerBuilder.h"
 
+DNContainerBuilder::DNContainerBuilder(TKContainer *container) : mContainer(container) 
+{
+    
+}
+
+DNContainerBuilder::~DNContainerBuilder()
+{
+    
+}
 
-TKContainer* DNContainerBuilder::createContainerFromXHTML(const char* docRoot, TKContainer *targetContainer)
+TKContainer* DNContainerBuilder::buildContainerFromXHTML(const char* docRoot)
 {
 
     mLock.lock();
     
-    mContainer = targetContainer;
-    
     DNDirectory directory(docRoot);
     const DNFileList *flist = directory.getFileList("html|htm|xml");
     while(flist)
@@ -52,7 +59,7 @@ TKContainer* DNContainerBuilder::createContainerFromXHTML(const char* docRoot, T
     
     mLock.unlock();
     
-    return targetContainer;
+    return mContainer;
 }
 
 void DNContainerBuilder::parseXHTML(const char *fpath)
@@ -68,16 +75,17 @@ void DNContainerBuilder::parseXHTML(const char *fpath)
     DNXMLElement *cellAPIElement = NULL;
     DNXMLElement *cellScriptElement = NULL;
     std::string  cellName;
+    std::string  cellCodeClassName;
     
     while(element)
     {
-        std::string eclass = element->attribute("class");
+        std::string eclass = element->getAttributeValue("class");
         if (eclass == "dennco-script")
         {
             DNXMLElement *te = element->outer;
             while(te)
             {
-                std::string teclass = te->attribute("class");
+                std::string teclass = te->getAttributeValue("class");
                 if (teclass == "dennco-classdef")
                 {
                     if (classElement && classElement == te)
@@ -95,7 +103,15 @@ void DNContainerBuilder::parseXHTML(const char *fpath)
                 {
                     if (cellElement && cellElement == te)
                     {
-                        cellScriptElement = element;
+                        std::string s = element->getAttributeValue("href");
+                        if (s.length() > 0)
+                        {
+                            cellCodeClassName = s;
+                        }
+                        else
+                        {
+                            cellScriptElement = element;
+                        }
                     }
                     else
                     {
@@ -114,8 +130,7 @@ void DNContainerBuilder::parseXHTML(const char *fpath)
         }
         else if (eclass == "dennco-classdef")
         {            
-            className = element->attribute("name");
-            trimString(className);
+            className = element->getAttributeValue("name");
             if (className.length() > 0)
             {
                 if (!classElement)
@@ -134,7 +149,7 @@ void DNContainerBuilder::parseXHTML(const char *fpath)
         }
         else if (eclass == "dennco-cell")
         {
-            cellName = element->attribute("name");
+            cellName = element->getAttributeValue("name");
             trimString(cellName);
             if (cellName.length() > 0)
             {
@@ -157,7 +172,7 @@ void DNContainerBuilder::parseXHTML(const char *fpath)
             if (cellElement)
             {
                 //connection
-                std::string target = element->attribute("href");
+                std::string target = element->getAttributeValue("href");
                 trimString(target);
                 if (target.length() > 0)
                 {
@@ -178,7 +193,7 @@ void DNContainerBuilder::parseXHTML(const char *fpath)
             DNXMLElement *te = element->outer;
             while(te)
             {
-                std::string teclass = te->attribute("class");
+                std::string teclass = te->getAttributeValue("class");
                 if (teclass == "dennco-cell")
                 {
                     if (cellElement && cellElement == te)
@@ -199,36 +214,54 @@ void DNContainerBuilder::parseXHTML(const char *fpath)
                 TKLog::printf("A syntax error is found in %s. dennco-api doesn't belong to any of dennco-cell.", fpath);
             }
         }
-            
+        
+        //go to next element
+        //
         if (element->inner)
         {
+            // go inside
             element = element->inner;
         }
         else
         {
-            while(!element->next && element != xml->getRoot())
-            {
-                element = element->outer;
-            }
-            if (element == xml->getRoot())
-            {
-                element = NULL;
-            }
+            // go next 
+            do {
             
-            if (classElement && element->depth == classElement->depth)
-            {
-                //scriptless classdef
-                classElement = NULL;
-                classScriptElement = NULL;
+                // the processed element was cell code class definition.
+                // define it now.
+                if (classElement && element->depth == classElement->depth)
+                {
+                    TKLog::printf("TODO define code class here..class:%s", className.c_str());
+                    //scriptless classdef
+                    classElement = NULL;
+                    classScriptElement = NULL;
+                    className = "";
+                }
+            
+                // the processed element was cell definition.
+                // define it now.
+                if (cellElement && element->depth == cellElement->depth)
+                {
+                    TKLog::printf("TODO define cell here..cellName:%s", cellName.c_str());
+                    //scriptless celldef
+                    cellElement = NULL;
+                    cellAPIElement = NULL;
+                    cellScriptElement = NULL;
+                    cellName = "";
+                    cellCodeClassName = "";
+                }
                 
-            }
-            if (cellElement && element->depth == cellElement->depth)
-            {
-                //scriptless celldef
-                cellElement = NULL;
-                cellAPIElement = NULL;
-                cellScriptElement = NULL;
-            }
+                if (!element->next)
+                {
+                    element = element->outer;
+                }
+                if (!element)
+                    break;
+            } while(!element->next && element != xml->getRoot());
+            
+            if (!element)
+                break;
+            element = element->next;
         }
     }
     
index 352f45c..e54052f 100644 (file)
@@ -29,10 +29,13 @@ class TKContainer;
 class DNContainerBuilder
 {
 public:
-    TKContainer *createContainerFromXHTML(const char* docRoot, TKContainer *container);
-    void        parseXHTML(const char *fpath);
+    DNContainerBuilder(TKContainer *container);
+    ~DNContainerBuilder();
+    
+    TKContainer *buildContainerFromXHTML(const char* docRoot);
 
 private:
+    void        parseXHTML(const char *fpath);
     std::map<std::string, std::string>  mPendingConnection;
     TKLock                              mLock;
     TKContainer                         *mContainer;
index b0f12d7..7e3fe20 100644 (file)
@@ -19,8 +19,8 @@
 
 #include "DNXMLElement.h"
 
-DNXMLElement::DNXMLElement(std::map<std::string, std::string> attributes, std::string body):
-mAttributes(attributes), mBody(body)
+DNXMLElement::DNXMLElement(std::string _name):
+name(_name),outer(NULL),inner(NULL),next(NULL),depth(0),text("")
 {
 }
 
@@ -29,9 +29,17 @@ DNXMLElement::~DNXMLElement()
     mAttributes.clear();
 }
 
-std::string DNXMLElement::attribute(const char *name)
+void DNXMLElement::setAttribute(const char *name, const char *value)
 {
-    std::map<std::string, std::string>::iterator it = mAttributes.find(name);
+    std::string _key = name;
+    std::string _value = value;
+    mAttributes.insert(std::map<std::string, std::string>::value_type( _key, _value));
+}
+
+std::string DNXMLElement::getAttributeValue(const char *name)
+{
+    std::string key = name;
+    std::map<std::string, std::string>::iterator it = mAttributes.find(key);
     if (it != mAttributes.end())
     {
         return it->second;
index d3a8799..289bbc1 100644 (file)
 class DNXMLElement
 {
 public:
-    DNXMLElement(std::map<std::string, std::string> attributes, std::string body);
+    DNXMLElement(std::string _name);
     ~DNXMLElement();
-    std::string attribute(const char *name);
+    void         setAttribute(const char *name, const char *value);
+    std::string  getAttributeValue(const char *name);
     DNXMLElement *outer;
     DNXMLElement *inner;
     DNXMLElement *next;
+    
     int          depth;
+    std::string  name;
+    std::string  text;
 private:
     std::map<std::string, std::string> mAttributes;
-    std::string mBody;
 };
 
 #endif
index b02944b..31b6f12 100644 (file)
 #import <Foundation/Foundation.h>
 
 #include "DNXMLImpl.h"
+#include "DNXMLElement.h"
 
 class OSXDNXMLImpl : public DNXMLImpl
 {
 public:
+    OSXDNXMLImpl(NSXMLDocument *doc);
+    virtual ~OSXDNXMLImpl();
+    
     virtual DNXMLElement*   getRoot();
     
-    OSXDNXMLImpl(NSXMLDocument *doc);
 private:
     NSXMLDocument *mDocument;
+    DNXMLElement  *mRootElement;
 };
 
 #endif
index c5b0f53..cb8fffa 100644 (file)
 
 #include "DNXML.h"
 #include "DNXMLImpl.h"
+#include "DNXMLElement.h"
 #include "OSXDNXMLImpl.h"
 #include "TKLog.h"
+#include "TKDebug.h"
+
+#include <map>
 
 //static 
 DNXMLImpl* DNXMLImpl::createXMLFromFileImpl(const char *fpath)
@@ -46,19 +50,134 @@ DNXMLImpl* DNXMLImpl::createXMLFromFileImpl(const char *fpath)
         TKLog::printf("Can't parse xml file %s.", fpath);
         return 0;
     }
-    
+
     return new OSXDNXMLImpl(xmlDoc);
 }
 
 OSXDNXMLImpl::OSXDNXMLImpl(NSXMLDocument *doc):
-mDocument(doc)
+mDocument(doc),mRootElement(nil)
 {
     
 }
 
+OSXDNXMLImpl::~OSXDNXMLImpl()
+{
+    //TODO 
+    //release memory.
+}
+
+
 DNXMLElement* OSXDNXMLImpl::getRoot()
 {
-    //TODO
-    TKLog::printf("ERROR!! DNXMLImpl::getRoot not implemented!!\n");
-    return 0;    
+    if (mRootElement)
+        return mRootElement;
+    
+    NSXMLNode *rootNode = [mDocument rootElement];
+    NSXMLNode *aNode = rootNode;
+
+    std::map<unsigned long, DNXMLElement*> elementMap;
+    
+    int depth = 0;
+    
+    while(aNode)
+    {
+        if ( [aNode kind] == NSXMLElementKind )
+        {
+            
+            NSString *nname = [aNode name];
+            const char *cname;
+            if (nname)
+            {
+                cname = [nname UTF8String];
+            }
+            else
+            {
+                cname = "";
+            }
+            DNXMLElement *dnelement = new DNXMLElement(cname);
+            NSXMLElement *aElement = (NSXMLElement*) aNode;
+            for( NSXMLNode *attribute in [aElement attributes] ) {
+                const char *name = [[attribute name] UTF8String];
+                const char *value = [[attribute stringValue] UTF8String];
+                dnelement->setAttribute(name, value);
+            }
+                
+            elementMap.insert(std::map<unsigned long, DNXMLElement*>::value_type((unsigned long)aNode,dnelement)); 
+
+            NSXMLNode *parent = [aNode parent];
+            if (parent)
+            {
+
+                DNXMLElement *dnparent = elementMap[(unsigned long)parent];
+                
+                if (dnparent)
+                {
+                    dnelement->outer = dnparent;
+                    if (!dnparent->inner)
+                    {
+                        dnparent->inner = dnelement;
+                    }
+                }
+                else
+                {
+                    mRootElement = dnelement;
+                }
+            }
+            else
+            {
+                //?
+                mRootElement = dnelement;
+            }
+                
+            NSXMLNode *prevSibling = [aNode previousSibling];
+            while (prevSibling)
+            {
+                if ([prevSibling kind] == NSXMLElementKind)
+                {
+                    DNXMLElement *dnprev = elementMap[(unsigned long)prevSibling];
+                        
+                    TKASSERT(dnprev);
+                    dnprev->next = dnelement;
+                    break;
+                }
+                prevSibling = [prevSibling previousSibling];
+            }
+            
+        }
+        else if ( [aNode kind] == NSXMLTextKind )
+        {
+            NSLog(@"body:%@", [aNode stringValue]);
+            NSXMLNode *parent = [aNode parent];
+            if (parent)
+            {
+                DNXMLElement *dnparent = elementMap[(unsigned long)parent];
+                dnparent->text = [[aNode stringValue] UTF8String];
+            }
+        }
+        
+        //go to next
+        if ([aNode childCount]>0)
+        {
+            depth ++;
+            aNode = [aNode childAtIndex:0];
+        }
+        else
+        {
+            while (![aNode nextSibling] && aNode != rootNode)
+            {
+                depth--;
+                aNode = [aNode parent];
+            }
+            
+            if (aNode == rootNode) 
+            {
+                aNode = nil;
+            }
+            else
+            {
+                aNode = [aNode nextSibling];
+            }
+        }
+    }
+    return mRootElement;
 }
index 40b0ebe..7ddd96a 100644 (file)
                7FEF016714A879EA00051DED /* dennco */ = {
                        isa = PBXGroup;
                        children = (
-                               7FEF017314A879EB00051DED /* AppDelegate.h */,
                                7FEF017414A879EB00051DED /* AppDelegate.mm */,
+                               7FEF017314A879EB00051DED /* AppDelegate.h */,
                                7FEF017614A879EB00051DED /* MainMenu.xib */,
                                7FEF016814A879EB00051DED /* Supporting Files */,
                        );
index a23634a..da000da 100644 (file)
@@ -6,10 +6,22 @@
 //  Copyright (c) 2011 __MyCompanyName__. All rights reserved.
 //
 
+#include "TKContainer.h"
+#include "TKConsole.h"
+
 #import <Cocoa/Cocoa.h>
 
 @interface AppDelegate : NSObject <NSApplicationDelegate>
-
+{
+    IBOutlet NSPathControl *uiPathControl;
+    TKContainer *container;
+    TKConsole *console;
+}
 @property (assign) IBOutlet NSWindow *window;
 
+-(IBAction)pathChanged:(id)sender;
+-(IBAction)doInit:(id)sender;
+-(IBAction)doStart:(id)sender;
+-(IBAction)doStop:(id)sender;
+
 @end
index deed614..81fe8f2 100644 (file)
@@ -6,18 +6,60 @@
 //  Copyright (c) 2011 __MyCompanyName__. All rights reserved.
 //
 
+#include "TKJSContainer.h"
+#include "DNContainerBuilder.h"
+#include "DNDirectory.h"
+#include "DNFileList.h"
+#include "TKLog.h"
+
 #import "AppDelegate.h"
 
 @implementation AppDelegate
 
 @synthesize window = _window;
 
-#include "DNDirectory.h"
-#include "DNFileList.h"
 
 - (void)applicationDidFinishLaunching:(NSNotification *)aNotification
 {
+    console = new TKConsole();
+    TKLog::setDestination(console);
+
     // Insert code here to initialize your application
+    NSURL *path = [[NSURL alloc]initWithString:NSHomeDirectory()];
+    [uiPathControl setURL:path];
 }
 
+-(IBAction)pathChanged:(id)sender
+{
+    NSURL *newURL = [uiPathControl URL];
+}
+
+-(IBAction)doInit:(id)sender
+{
+    
+    if (container)
+    {
+        delete container;
+    }
+    container = new TKJSContainer();
+    
+    DNContainerBuilder builder(container);
+  
+    const char *path = [[[uiPathControl URL]path] UTF8String];
+    builder.buildContainerFromXHTML(path);
+    
+    
+}
+
+-(IBAction)doStart:(id)sender
+{
+    
+}
+
+-(IBAction)doStop:(id)sender
+{
+    
+}
+
+
 @end
index c4b6440..bfd186e 100644 (file)
                                                <object class="NSButton" id="660916202">
                                                        <reference key="NSNextResponder" ref="439893737"/>
                                                        <int key="NSvFlags">268</int>
-                                                       <string key="NSFrame">{{14, 216}, {70, 32}}</string>
+                                                       <string key="NSFrame">{{82, 216}, {70, 32}}</string>
                                                        <reference key="NSSuperview" ref="439893737"/>
                                                        <reference key="NSWindow"/>
                                                        <reference key="NSNextKeyView" ref="857388369"/>
                                                <object class="NSButton" id="857388369">
                                                        <reference key="NSNextResponder" ref="439893737"/>
                                                        <int key="NSvFlags">268</int>
-                                                       <string key="NSFrame">{{84, 216}, {68, 32}}</string>
+                                                       <string key="NSFrame">{{148, 216}, {70, 32}}</string>
                                                        <reference key="NSSuperview" ref="439893737"/>
                                                        <reference key="NSWindow"/>
                                                        <reference key="NSNextKeyView" ref="139727149"/>
                                                </object>
                                                <object class="NSScrollView" id="263819838">
                                                        <reference key="NSNextResponder" ref="439893737"/>
-                                                       <int key="NSvFlags">256</int>
+                                                       <int key="NSvFlags">274</int>
                                                        <array class="NSMutableArray" key="NSSubviews">
                                                                <object class="NSClipView" id="930991141">
                                                                        <reference key="NSNextResponder" ref="263819838"/>
@@ -1689,7 +1689,7 @@ AAEAAQAAAT0AAwAAAAEAAgAAAVIAAwAAAAEAAQAAAVMAAwAAAAIAAQABAAAAAA</bytes>
                                                        <string key="NSFrame">{{17, 273}, {115, 17}}</string>
                                                        <reference key="NSSuperview" ref="439893737"/>
                                                        <reference key="NSWindow"/>
-                                                       <reference key="NSNextKeyView" ref="350940437"/>
+                                                       <reference key="NSNextKeyView" ref="176231758"/>
                                                        <string key="NSReuseIdentifierKey">_NS:3944</string>
                                                        <bool key="NSEnabled">YES</bool>
                                                        <object class="NSTextFieldCell" key="NSCell" id="884169963">
@@ -1788,6 +1788,30 @@ AAEAAQAAAT0AAwAAAAEAAgAAAVIAAwAAAAEAAQAAAVMAAwAAAAIAAQABAAAAAA</bytes>
                                                                </object>
                                                        </object>
                                                </object>
+                                               <object class="NSButton" id="176231758">
+                                                       <reference key="NSNextResponder" ref="439893737"/>
+                                                       <int key="NSvFlags">268</int>
+                                                       <string key="NSFrame">{{14, 216}, {70, 32}}</string>
+                                                       <reference key="NSSuperview" ref="439893737"/>
+                                                       <reference key="NSWindow"/>
+                                                       <reference key="NSNextKeyView" ref="350940437"/>
+                                                       <string key="NSReuseIdentifierKey">_NS:687</string>
+                                                       <bool key="NSEnabled">YES</bool>
+                                                       <object class="NSButtonCell" key="NSCell" id="680091126">
+                                                               <int key="NSCellFlags">67239424</int>
+                                                               <int key="NSCellFlags2">134217728</int>
+                                                               <string key="NSContents">Init</string>
+                                                               <reference key="NSSupport" ref="207027162"/>
+                                                               <string key="NSCellIdentifier">_NS:687</string>
+                                                               <reference key="NSControlView" ref="176231758"/>
+                                                               <int key="NSButtonFlags">-2038284033</int>
+                                                               <int key="NSButtonFlags2">129</int>
+                                                               <string key="NSAlternateContents"/>
+                                                               <string key="NSKeyEquivalent"/>
+                                                               <int key="NSPeriodicDelay">200</int>
+                                                               <int key="NSPeriodicInterval">25</int>
+                                                       </object>
+                                               </object>
                                        </array>
                                        <string key="NSFrameSize">{480, 360}</string>
                                        <reference key="NSSuperview"/>
@@ -2487,6 +2511,46 @@ AAEAAQAAAT0AAwAAAAEAAgAAAVIAAwAAAAEAAQAAAVMAAwAAAAIAAQABAAAAAA</bytes>
                                        </object>
                                        <int key="connectionID">532</int>
                                </object>
+                               <object class="IBConnectionRecord">
+                                       <object class="IBOutletConnection" key="connection">
+                                               <string key="label">uiPathControl</string>
+                                               <reference key="source" ref="976324537"/>
+                                               <reference key="destination" ref="732858516"/>
+                                       </object>
+                                       <int key="connectionID">593</int>
+                               </object>
+                               <object class="IBConnectionRecord">
+                                       <object class="IBActionConnection" key="connection">
+                                               <string key="label">pathChanged:</string>
+                                               <reference key="source" ref="976324537"/>
+                                               <reference key="destination" ref="732858516"/>
+                                       </object>
+                                       <int key="connectionID">594</int>
+                               </object>
+                               <object class="IBConnectionRecord">
+                                       <object class="IBActionConnection" key="connection">
+                                               <string key="label">doInit:</string>
+                                               <reference key="source" ref="976324537"/>
+                                               <reference key="destination" ref="176231758"/>
+                                       </object>
+                                       <int key="connectionID">597</int>
+                               </object>
+                               <object class="IBConnectionRecord">
+                                       <object class="IBActionConnection" key="connection">
+                                               <string key="label">doStart:</string>
+                                               <reference key="source" ref="976324537"/>
+                                               <reference key="destination" ref="660916202"/>
+                                       </object>
+                                       <int key="connectionID">598</int>
+                               </object>
+                               <object class="IBConnectionRecord">
+                                       <object class="IBActionConnection" key="connection">
+                                               <string key="label">doStop:</string>
+                                               <reference key="source" ref="976324537"/>
+                                               <reference key="destination" ref="857388369"/>
+                                       </object>
+                                       <int key="connectionID">599</int>
+                               </object>
                        </array>
                        <object class="IBMutableOrderedSet" key="objectRecords">
                                <array key="orderedObjects">
@@ -3018,12 +3082,13 @@ AAEAAQAAAT0AAwAAAAEAAgAAAVIAAwAAAAEAAQAAAVMAAwAAAAIAAQABAAAAAA</bytes>
                                                        <reference ref="122567520"/>
                                                        <reference ref="45658607"/>
                                                        <reference ref="174391018"/>
-                                                       <reference ref="660916202"/>
-                                                       <reference ref="857388369"/>
                                                        <reference ref="139727149"/>
                                                        <reference ref="537744523"/>
                                                        <reference ref="350940437"/>
                                                        <reference ref="801112629"/>
+                                                       <reference ref="857388369"/>
+                                                       <reference ref="660916202"/>
+                                                       <reference ref="176231758"/>
                                                </array>
                                                <reference key="parent" ref="972006081"/>
                                        </object>
@@ -3668,6 +3733,19 @@ AAEAAQAAAT0AAwAAAAEAAgAAAVIAAwAAAAEAAQAAAVMAAwAAAAIAAQABAAAAAA</bytes>
                                                <reference key="object" ref="424617530"/>
                                                <reference key="parent" ref="801112629"/>
                                        </object>
+                                       <object class="IBObjectRecord">
+                                               <int key="objectID">595</int>
+                                               <reference key="object" ref="176231758"/>
+                                               <array class="NSMutableArray" key="children">
+                                                       <reference ref="680091126"/>
+                                               </array>
+                                               <reference key="parent" ref="439893737"/>
+                                       </object>
+                                       <object class="IBObjectRecord">
+                                               <int key="objectID">596</int>
+                                               <reference key="object" ref="680091126"/>
+                                               <reference key="parent" ref="176231758"/>
+                                       </object>
                                </array>
                        </object>
                        <dictionary class="NSMutableDictionary" key="flattenedProperties">
@@ -3840,6 +3918,8 @@ AAEAAQAAAT0AAwAAAAEAAgAAAVIAAwAAAAEAAQAAAVMAAwAAAAIAAQABAAAAAA</bytes>
                                <string key="588.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
                                <string key="591.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
                                <string key="592.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+                               <string key="595.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+                               <string key="596.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
                                <string key="72.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
                                <string key="73.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
                                <string key="74.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
@@ -3856,24 +3936,51 @@ AAEAAQAAAT0AAwAAAAEAAgAAAVIAAwAAAAEAAQAAAVMAAwAAAAIAAQABAAAAAA</bytes>
                        <nil key="activeLocalization"/>
                        <dictionary class="NSMutableDictionary" key="localizations"/>
                        <nil key="sourceID"/>
-                       <int key="maxID">592</int>
+                       <int key="maxID">599</int>
                </object>
                <object class="IBClassDescriber" key="IBDocument.Classes">
                        <array class="NSMutableArray" key="referencedPartialClassDescriptions">
                                <object class="IBPartialClassDescription">
                                        <string key="className">AppDelegate</string>
                                        <string key="superclassName">NSObject</string>
-                                       <object class="NSMutableDictionary" key="outlets">
-                                               <string key="NS.key.0">window</string>
-                                               <string key="NS.object.0">NSWindow</string>
-                                       </object>
-                                       <object class="NSMutableDictionary" key="toOneOutletInfosByName">
-                                               <string key="NS.key.0">window</string>
-                                               <object class="IBToOneOutletInfo" key="NS.object.0">
+                                       <dictionary class="NSMutableDictionary" key="actions">
+                                               <string key="doInit:">id</string>
+                                               <string key="doStart:">id</string>
+                                               <string key="doStop:">id</string>
+                                               <string key="pathChanged:">id</string>
+                                       </dictionary>
+                                       <dictionary class="NSMutableDictionary" key="actionInfosByName">
+                                               <object class="IBActionInfo" key="doInit:">
+                                                       <string key="name">doInit:</string>
+                                                       <string key="candidateClassName">id</string>
+                                               </object>
+                                               <object class="IBActionInfo" key="doStart:">
+                                                       <string key="name">doStart:</string>
+                                                       <string key="candidateClassName">id</string>
+                                               </object>
+                                               <object class="IBActionInfo" key="doStop:">
+                                                       <string key="name">doStop:</string>
+                                                       <string key="candidateClassName">id</string>
+                                               </object>
+                                               <object class="IBActionInfo" key="pathChanged:">
+                                                       <string key="name">pathChanged:</string>
+                                                       <string key="candidateClassName">id</string>
+                                               </object>
+                                       </dictionary>
+                                       <dictionary class="NSMutableDictionary" key="outlets">
+                                               <string key="uiPathControl">NSPathControl</string>
+                                               <string key="window">NSWindow</string>
+                                       </dictionary>
+                                       <dictionary class="NSMutableDictionary" key="toOneOutletInfosByName">
+                                               <object class="IBToOneOutletInfo" key="uiPathControl">
+                                                       <string key="name">uiPathControl</string>
+                                                       <string key="candidateClassName">NSPathControl</string>
+                                               </object>
+                                               <object class="IBToOneOutletInfo" key="window">
                                                        <string key="name">window</string>
                                                        <string key="candidateClassName">NSWindow</string>
                                                </object>
-                                       </object>
+                                       </dictionary>
                                        <object class="IBClassDescriptionSource" key="sourceIdentifier">
                                                <string key="majorKey">IBProjectSource</string>
                                                <string key="minorKey">./Classes/AppDelegate.h</string>