# FilteringController

- `Download example`

A PyObjC Example without documentation

## Sources

### FilteringArrayController.py

    #
    #  FilteringArrayController.py
    #  FilteringController
    #
    #  Converted by u.fiedler on 05.02.05.
    #
    #  The original version was written in Objective-C by Malcolm Crawford
    #  at http://homepage.mac.com/mmalc/CocoaExamples/controllers.html

    from Cocoa import NSArrayController
    from objc import super  # noqa: A004

    class FilteringArrayController(NSArrayController):
        _k_searchString = ""

        def search_(self, sender):
            self.setSearchString_(sender.stringValue())
            self.rearrangeObjects()

        def newObject(self):
            """
            Creates and returns a new object of the class specified by objectClass.
            Set default values, and keep reference to new object -- see arrangeObjects_
            """
            self.newObj = super().newObject()
            self.newObj.setValue_forKey_("First", "firstName")
            self.newObj.setValue_forKey_("Last", "lastName")
            return self.newObj

        def arrangeObjects_(self, objects):
            if self._k_searchString is None or self._k_searchString == "":
                self.newObj = None
                return super().arrangeObjects_(objects)

            # Create array of objects that match search string.
            # Also add any newly-created object unconditionally:
            # (a) You'll get an error if a newly-added object isn't added to
            # arrangedObjects.
            # (b) The user will see newly-added objects even if they don't
            # match the search term.

            matchedObjects = []
            lowerSearch = self._k_searchString.lower()
            for item in objects:
                if item == self.newObj:
                    # if the item has just been created, add it unconditionally
                    matchedObjects.append(item)
                    self.newObj = None
                else:
                    lowerName = item.valueForKeyPath_("firstName").lower()
                    if lowerSearch in lowerName:
                        matchedObjects.append(item)
                    else:
                        lowerName = item.valueForKeyPath_("lastName").lower()
                        if lowerSearch in lowerName:
                            matchedObjects.append(item)
            return super().arrangeObjects_(matchedObjects)

        def searchString(self):
            return self._k_searchString

        def setSearchString_(self, newStr):
            self._k_searchString = newStr

### FilteringController.py

    #
    #  FilteringController
    #

    import FilteringArrayController  # noqa: F401
    import FilteringControllerDocument  # noqa: F401
    from PyObjCTools import AppHelper

    AppHelper.runEventLoop()

### FilteringControllerDocument.py

    #
    #  FilteringControllerDocument.py
    #  FilteringController
    #
    #  Converted by u.fiedler on 05.02.05.
    #
    #  The original version was written in Objective-C by Malcolm Crawford
    #  at http://homepage.mac.com/mmalc/CocoaExamples/controllers.html

    import objc
    from Cocoa import NSDocument, NSKeyedArchiver, NSKeyedUnarchiver
    from objc import super  # noqa: A004

    class FilteringControllerDocument(NSDocument):
        peopleController = objc.IBOutlet()

        def init(self):
            self = super().init()
            if self is None:
                return None
            self._k_people = []
            return self

        def windowNibName(self):
            return "FilteringControllerDocument"

        def windowControllerDidLoadNib_(self, controller):
            super().windowControllerDidLoadNib_(controller)

        def dataRepresentationOfType_(self, aType):
            return NSKeyedArchiver.archivedDataWithRootObject_(self._k_people)

        def loadDataRepresentation_ofType_(self, data, aType):
            self.setPeople_(NSKeyedUnarchiver.unarchiveObjectWithData_(data))
            return True

        # indexed accessors

        def people(self):
            return self._k_people

        def setPeople_(self, people):
            self._k_people[:] = people

        @objc.accessor
        def countOfPeople(self):
            return len(self._k_people)

        @objc.accessor
        def objectInPeopleAtIndex_(self, idx):
            return self._k_people[idx]

        @objc.accessor
        def insertObject_inPeopleAtIndex_(self, obj, idx):
            self._k_people.insert(idx, obj)

        @objc.accessor
        def removeObjectFromPeopleAtIndex_(self, idx):
            del self._k_people[idx]

        @objc.accessor
        def replaceObjectInPeopleAtIndex_withObject_(self, idx, obj):
            self._k_people[idx] = obj

### setup.py

    """
    Script for building the example:

    Usage:
        python3 setup.py py2app
    """
    from setuptools import setup

    plist = {
        "CFBundleDocumentTypes": [
            {
                "CFBundleTypeExtensions": ["FilteringController", "*"],
                "CFBundleTypeName": "FilteringController File",
                "CFBundleTypeRole": "Editor",
                "NSDocumentClass": "FilteringControllerDocument",
            }
        ]
    }

    setup(
        name="FilteringController",
        app=["FilteringController.py"],
        data_files=["English.lproj"],
        options={"py2app": {"plist": plist}},
        setup_requires=["py2app", "pyobjc-framework-Cocoa"],
    )