Continuing the discussion from UI Browser Documents:
UI Browser 3 3.0.0 (2017 - Swift 4, 5)
Change Log
Rewrite the UI Browser application from scratch in Swift using storyboards and container views, revise and modernize the user interface, refactor and update the class structure, and add new features.
2017-03-09 (3.0.0 build 1)
Create a new UIBrowser3 project and a new PFAssistiveFramework4 workspace, and add the project to the workspace. The PFAssistiveFramework4 project was created at the same time in a separate project located elsewhere and added to the workspace.
- Started development on macOS Sierra 10.12.3, Xcode 8.2.1 and Swift version 3.0.2.
- Created a new Xcode Cocoa Application project with Product Name âUIBrowser3â, Language Swift, Use Storyboards, Include Unit Tests and Include UI Tests, in PreForm Products/UI Browser/UI Browser 3 Code. [Now UI Browser 3 Code 3.0.0]
- Created a new UIBrowser3 workspace and added the new PFAssistiveFramework4 and UIBrowser3 projects to it.
- Left the projectâs Versioning -
CURRENT_PROJECT_VERSION
(âCurrent Project Versionâ) build setting at 1, despite the requirement of Technical Note TN2420: Version Numbers and Build Numbers that âFor macOS apps, build numbers must monotonically increase even across different versions. In other words, for macOS apps you cannot use the same build numbers again in different release trainsâ, on the theory that UI Browser 3 in Swift is a new product. - Left the Info.plist CFBundleVersion (âBundle versionâ) at 1.
- Revised Info.plist by setting CFBundleShortVersionString (âBundle versions string, shortâ) to â3.0.0â and
NSHumanReadableCopyright
(âCopyright (human-readable)â) to âCopyright © 2017 Bill Cheeseman. All rights reserved. Used by permission.â - Revised the AppDelegate.swift template heading by changing the copyright to âCopyright © 2017 Bill Cheeseman. All rights reserved. Used by permission.â and adding the line âVersion 3.0.0â.
- Revised the ViewController.swift template heading by changing the copyright to âCopyright © 2017 Bill Cheeseman. All rights reserved. Used by permission.â and adding the line âVersion 3.0.0â.
- Revised ViewController.swift viewDidLoad() by setting constant element to UIElement() and calling element.shoutOut() to log the name of elementâs class.
- Built and ran the UIBrowser3 workspace.
- Saved a snapshot of build version 1.
2017-03-09 (3.0.0 build 2)
Create MainWindowController.swift as the main windowâs delegate, implement its windowShouldClose(_:)
delegate method to control the main windowâs size on relaunch using the frameAutosaveName mechanism, rename the ViewController.swift template as MainViewController.swift, and set the initial Main.storyboard templateâs settings.
- Changed the projectâs Versioning -
CURRENT_PROJECT_VERSION
(âCurrent Project Versionâ) build setting to 2. - Revised Info.plist by setting CFBundleVersion (âBundle versionâ) to 2.
- Changed the targetâs General - Identity - Application Category to Developer Tools.
- Created a new Cocoa Class file MainWindowController.swift as a subclass of NSWindowController with no XIB file.
- Revised the MainWindowController.swift template heading by changing the copyright to âCopyright © 2017 Bill Cheeseman. All rights reserved. Used by permission.â and adding the line âVersion 3.0.0â.
- Revised MainWindowController.swift by implementing the NSWindowDelegate protocolâs
windowShouldClose(_:)
delegate method to terminate the application when the main window is closed even if auxiliary windows remain open, and added NSWindowDelegate to the class declaration. - Revised Main.storyboard by setting the Window Controller Sceneâs Window Controllerâs Class to MainWindowController (which changes its sidebar name to âMain Window Controllerâ), setting its Autosave name to âMainWindowAutosaveNameâ, and connecting its delegate outlet to Main Window Controller.
- Revised the ViewController.swift template by changing its name to MainContentViewController.swift, changing its class declaration to MainContentViewController, and changing its heading by changing its name to MainContentViewController.
- Revised Main.storyboard by setting the View Controller Sceneâs View Controllerâs Class to MainContentViewController (which changes its sidebar name to âMain Content View Controllerâ).
- Confirmed through testing that the frameAutoSaveName mechanism is working both when the application is quit and when the main window is closed after resizing it.
- Saved a snapshot of build version 2.
2017-03-10 (3.0.0 build 3)
Create skeleton classes for all of the view controllers needed for a basic working user interface in the main window; namely, the main content view, main split view, master split item view, master tab view and browser, outline and list tab item views, detail split item view, detail tab view, and attributes, actions and notifications tab item view controllers.
- Changed the projectâs Versioning -
CURRENT_PROJECT_VERSION
(âCurrent Project Versionâ) build setting to 3. - Revised Info.plist by setting CFBundleVersion (âBundle versionâ) to 3.
- Revised MainContentViewController.swift by overriding the NSSeguePerforming protocolâs prepare(for:sender:) method and declaring the detailSplitViewItem dynamic variable, in preparation for adding a binding to the push on/push off disclosure button to enable the user to collapse and reveal the detail split view item.
- Created a new Cocoa Class file MainSplitViewController.swift as a subclass of NSSplitViewController with no XIB file.
- Revised the MainSplitViewController.swift template heading by changing the copyright to âCopyright © 2017 Bill Cheeseman. All rights reserved. Used by permission.â and adding the line âVersion 3.0.0â.
- Revised MainSplitViewController.swift by overriding the NSSplitViewDelegate protocolâs splitView(_:additionalEffectiveRectOfDividerAt:) method, to make the divider thicker for easy grabbing.
- Revised MainSplitViewController.swift by overriding viewDidLoad() to set the bottom (detail) split view itemâs minimumThickness and maximumThickkness properties, but commented it out when implemented Main.storyboard constraints to accomplish the same thing.
- Created a new Cocoa Class file MasterSplitItemViewController.swift as a subclass of NSViewController with no XIB file.
- Revised the MasterSplitItemViewController.swift template heading by changing the copyright to âCopyright © 2017 Bill Cheeseman. All rights reserved. Used by permission.â and adding the line âVersion 3.0.0â.
- Revised MasterSplitItemViewController.swift by overriding the NSSeguePerforming protocolâs prepare(for:sender:) method and declaring the masterTabViewController dynamic variable, in preparation for adding a binding to the segmented control to enable the user to select a master pane tab view item.
- Created a new Cocoa Class file MasterTabViewController.swift as a subclass of NSTabViewController with no XIB file.
- Revised the MasterTabViewController.swift template heading by changing the copyright notice to âCopyright © 2017 Bill Cheeseman. All rights reserved. Used by permission.â and adding the line âVersion 3.0.0â.
- Revised MasterTabViewController.swift by overriding NSResponderâs restorableStateKeyPaths() method to enable restoration of the last selected master tab view item at relaunch.
- Created three new Cocoa Class files named âBrowserTabItemViewController.swiftâ, âOutlineTabItemViewController.swiftâ and âListTabItemViewController.swiftâ as subclasses of NSViewController with no XIB files.
- Revised the BrowserTabItemViewController.swift, OutlineTabItemViewController.swift and ListTabItemViewController.swift template headings by changing the copyright to âCopyright © 2017 Bill Cheeseman. All rights reserved. Used by permission.â and adding the line âVersion 3.0.0â.
- Created a new Cocoa Class file DetailSplitItemViewController.swift as a subclass of NSViewController with no XIB file.
- Revised the DetailSplitItemViewController.swift template heading by changing the copyright to âCopyright © 2017 Bill Cheeseman. All rights reserved. Used by permission.â and adding the line âVersion 3.0.0â.
- Created a new Cocoa Class file DetailTabViewController.swift as a subclass of NSTabViewController with no XIB file.
- Revised the DetailTabViewController.swift template heading by setting the copyright notice to âCopyright © 2017 Bill Cheeseman. All rights reserved. Used by permission.â and adding the line âVersion 3.0.0â.
- Revised DetailTabViewController.swift by overriding NSResponderâs restorableStateKeyPaths() method to enable restoration of the last selected master tab view item at relaunch.
- Created three new Cocoa Class files named âAttributesTabItemViewController.swiftâ, âActionsTabItemViewController.swiftâ and âNotificationsTabItemViewController.swiftâ as subclasses of NSViewController with no XIB files.
- Revised the AttributesTabItemViewController.swift, ActionsTabItemViewController.swift and NotificationsTabItemViewController.swift template headings by setting the copyright notice to âCopyright © 2017 Bill Cheeseman. All rights reserved. Used by permission.â and adding the line âVersion 3.0.0â.
- Confirmed through testing that the application builds and runs, but the new classes cannot be tested until Main.storyboard is revised to make use of them (in build 5).
- Saved a snapshot of build version 3.
2017-03-10 (3.0.0 build 4)
Revise Main.storyboard by experimentally setting up the Applicationâs Main Menu in the Application Scene, and revise Info.plist and create an InfoPlist.strings file to set the displayed application name of the application menu as UI Browser even though the project and bundle name is UIBrowser3.
- Changed the projectâs Versioning -
CURRENT_PROJECT_VERSION
(âCurrent Project Versionâ) build setting to 4. - Revised Info.plist by setting CFBundleVersion (âBundle versionâ) to 4.
- Revised Main.storyboard by changing the names of the About, Hide, Quit and Help menu items to refer to âUI Browserâ instead of âUIBrowser3â in the Applicationâs Main Menu in the Application Scene.
- Revised Main.storyboard by adding and removing other menus and menu bar items, including several that will be named in code, in the Applicationâs Main Menu in the Application Scene.
- Revised Info.plist by adding a CFBundleDisplayName (âBundle display nameâ) item and setting it to 'UI Browser".
- Created an InfoPlist.strings file with CFBundleName and CFBundleDisplayName items set to âUI Browserâ, and CFBundleShortVersionString and NSHumanReadableCopyright items, for localization.
- Confirmed through testing that the application menu is named UI Browser.
- Saved a snapshot of build version 4.
2017-03-10 (3.0.0 build 5)
Revise Main.storyboard by adding views for all of the new view controllers to create a basic working user interface in the main window; namely, the main content view, main split view, master split item view, master tab view and browser, outline and list tab item views, detail split item view, detail tab view, and attributes, actions and notifications tab item views, as well as the main windowâs buttons. Also revised attributes of the main window.
- Changed the projectâs Versioning -
CURRENT_PROJECT_VERSION
(âCurrent Project Versionâ) build setting to 5. - Revised Info.plist by setting CFBundleVersion (âBundle versionâ) to 5.
- Set up Main.storyboard for all view controllers created in build 3 by copying the old Main.storyboard file from the 2016 build of UI Browser 3. This has the effect of replacing the experimental changes made to the Main.storyboardâs Applicationâs Main Menu in the Application Scene in build 4 (they are identical). It also has the effect of adding all of the main windowâs buttons (but outlets, actions and supporting methods will be added in later builds).
- Revised Main.storyboard by setting Main Windowâs Tabbing Mode to Disallowed to remove the Show Tab Bar menu item from the View menu and related menu items from the Window menu.
- Revised Main.storyboard by setting Main Windowâs Spaces to Can Join All Spaces, Expose to Managed and Cycling to Participates in Cycle.
- Changed the copyright notices in all files by adding â2003-â.
- Confirmed through testing that the split view items can be resized by dragging the divider, that the Main.storyboard constraints work correctly when the split view items and main window are resized, that the master and detail tab view items can all be shown by clicking the segment control or tabs, that the Show Tab Bar menu items were successfully hidden, and that the application handles Spaces and Expose changes appropriately. Two problems were found and left for future consideration: (1) Double-clicking the split view divider does not collapse the detail split pane, and (2) dragging the split view divider does not collapse the split viewâs detail pane.
- Saved a snapshot of build version 5.
##2017-03-11 (3.0.0 build 6)
Set up and populate the main windowâs Target pop-up buttonâs menu and the main menu barâs Target menu.
- Changed the projectâs Versioning -
CURRENT_PROJECT_VERSION
(âCurrent Project Versionâ) build setting to 6. - Revised Info.plist by setting CFBundleVersion (âBundle versionâ) to 6.
- Revised MainContentViewController.swift by adding the targetPopUpButton IBOutlet and confirmed that it is connected in Main.storyboard to the main windowâs Target pop-up menu, in preparation for providing its content and setting it as the main windowâs initialFirstResponder.
- Revised MainContentViewController.swift by overriding its viewWillAppear() method to set the main windowâs initialFirstResponder to targetPopUpButton.
- Revised MainContentViewController.swift by implementing the NSMenuDelegate protocolâs
menuNeedsUpdate(_:)
delegate method to update the main windowâs Target pop-up menu by calling AppDelegateâsupdateTargetMenu(_:)
and declaring that MainContentViewController conforms to the NSMenuDelegate protocol, and confirmed that the main windowâs targetPopUpButtonâs menu outlet is connected to its Menu and Menuâs delegate outlet is connected to MainContentViewController. - Revised AppDelegate.swift by declaring appDelegate as a type variable, and revised the
applicationDidFinishLaunching(_:)
template delegate method to set its value to self, to make the appDelegate available to any other window or view controller. - Revised AppDelegate.swift by declaring targetMenu as an IBOutlet for use in
menuNeedsUpdate(_:)
, and confirmed that is is connected to the main menu barâs Target menu in Main.storyboard. - Revised AppDelegate.swift by implementing the NSMenuDelegate protocolâs
menuNeedsUpdate(_:)
delegate method to update the main menu barâs Target menu by calling AppDelegateâsupdateTargetMenu(_:)
, declaring that AppDelegate conforms to the NSMenuDelegate protocol, and confirmed that the main menu barâs Target menu itemâs Target Menuâs delegate outlet is connected to AppDelegate.swift. - Revised MainContentViewController.swift by declaring controller as a type variable, and revised viewDidLoad() to set its value to self, to make the main content view controller available to any other window or view controller.
- Created a new Swift File Defines.swift to hold constants to be used in AppDelegateâs
updateTargetMenu(_:)
method. - Revised the Defines.swift template heading by setting the copyright notice to âCopyright © 2003-2017 Bill Cheeseman. All rights reserved. Used by permission.â, adding the line âVersion 3.0.0â and deleting the import Foundation statement.
- Revised Defines.swift by defining (in the order they are called in
updateTargetMenu(_:)
) the constants CHOOSE_NO_TARGET_TITLE, CHOOSE_ANY_TARGET_TITLE, RUNNING_APP_KEY, RUNNING_APP_NAME_KEY, NO_TARGET_MENU_ITEM_TAG, DISPLAYS_BACKGROUND_APPS_DEFAULTS_KEY, and DISPLAYS_BACKGROUND_APPS_SEPARATELY_DEFAULTS_KEY. - Revised MainContentViewController.swift by adding stubs for the
chooseNoTarget(_:)
,chooseAnyTarget(_:)
andchooseRunningTarget(_:)
action methods. - Revised MainContentViewController.swift by adding the selectedTarget instance variable.
- Revised MainContentViewController.swift by adding computed instance property processTrusted to be used to enable and disable controls and setting it to true temporarily. (It should be set to PFUIElement.isProcessTrustedWithOptions(nil) once PFAssistiveFramework4 is written.)
- Revised AppDelegate.swift by implementing
updateTargetMenu(_:)
to update the main menu barâs Target menu or the main windowâs Target pop-up button when the user opens it. - Confirmed that the main menu barâs Target menuâs Auto Enables Items setting and the Target popup buttonâs menuâs Auto Enables Items setting in Main.storyboard are turned off so manual enabling of menu items will work.
- Confirmed through testing that the main windowâs Target pop-up buttonâs menu and the main menu barâs Target menu are populated with its fixed menu items and the running application names and open when clicked.
- Saved a snapshot of build version 6.
##2017-03-11 (3.0.0 build 7)
Add functionality to the main windowâs Target pop-up buttonâs menu and the main menu barâs Target menu.
- Changed the projectâs Versioning -
CURRENT_PROJECT_VERSION
(âCurrent Project Versionâ) build setting to 7. - Revised Info.plist by setting CFBundleVersion (âBundle versionâ) to 7.
- Revised MainWindowController.swift by adding updateWindowTitle(with:). to set the window title and the menu bar Window menuâs window menu item
- Revised MainWindowController.swiftâs
windowDidLoad()
by calling updateWindowTitle(with:) to set the window title and the menu bar Window menuâs window menu item to CHOOSE_NO_TARGET_TITLE at launch. - Revised MainContentViewController.swiftâs viewDidLoad() to set the target popup buttonâs title at launch.
- Revised MainWindowController.swift by declaring controller as a type variable, and revised windowDidLoad() to set its value to self, to make the main window controller available to any other window or view controller.
- Revised Defines.swift by adding
IS_FINISHED_LAUNCHING_CONTEXT_VALUE
,IS_FINISHED_LAUNCHING_KEYPATH
,IS_TERMINATED_CONTEXT_VALUE
andIS_TERMINATED_KEYPATH
. - Revised MainContentViewController.swift by adding the launchedTarget, isFinishedLaunchingContext and isTerminatedContext instance variables.
- Revised MainContentViewController.swift by adding stubs for
updateTarget(_:)
andclearTarget()
to update and clear global target application information,updateTargetDisplay()
andclearTargetDisplay()
to update and clear the display of information about the target application, andupdateTargetPopUpButton()
and clearTargetPopUpButton() to update the target popup buttonâs title, all after the user chooses a new target application. - Revised MainContentViewController.swift by adding the
observeValue(forKeyPath:ofObject:change:context:)
KVO observing method. - Confirmed through testing that the window title and the menu bar Window menuâs window menu item are correctly set to
CHOOSE_NO_TARGET_TITLE
at launch. The remaining functionality of the main windowâs Target pop-up buttonâs menu and the main menu barâs Target menu cannot be tested until the data model is created in build 9. - Saved a snapshot of build version 7.
##2017-03-12 (3.0.0 build 8)
Set up the main content viewâs remaining controls.
- Changed the projectâs Versioning -
CURRENT_PROJECT_VERSION
(âCurrent Project Versionâ) build setting to 8. - Revised Info.plist by setting CFBundleVersion (âBundle versionâ) to 8.
- Revised MainContentViewController by adding IBOutlets activateButton and accessCheckbox and confirmed that they are connected in Main.storyboard.
- Revised MainContentViewController.swift by adding validateControls().
- Revised MainContentViewController.swift by adding class initialize() method to register user defaults values.
- Revised Defines.swift by defining the constants
CHOOSING_TARGET_ACTIVATES_APPLICATION_DEFAULTS_KEY
andTERMINOLOGY_DEFAULTS_KEY
. - Revised MainContentViewController.swift by adding deinit method to unregister KVO.
- Revised MainContentViewController.swift by adding a stub for
validateMenuItem(_:)
. - Revised MainContentViewController.swift by adding a stub for
updateTarget(withTimer:)
. - Revised Defines.swift by defining the constants
SELECT_ELEMENT_TIMER_INTERVAL
andSELECT_ELEMENT_TIMER_DURATION
. - Revised MainContentViewController.swift by adding sheetForApplicationFailedToLaunch and
sheetForApplicationUIElementNotCreated(_:)
. - Confirmed through testing that the new methods and stub methods cause no problems. The remaining functionality of the main windowâs Target pop-up buttonâs menu and the main menu barâs Target menu cannot be tested until the data model is created in build 9.
- Saved a snapshot of build version 8.
2017-03-12 (3.0.0 build 9)
Set up the data model and its display in the browser view.
- Changed the projectâs Versioning -
CURRENT_PROJECT_VERSION
(âCurrent Project Versionâ) build setting to 9. - Revised Info.plist by setting CFBundleVersion (âBundle versionâ) to 9.
- Created a new Cocoa Class file ElementDataSource.swift as a subclass of NSObject with no XIB file.
- Revised the ElementDataSource.swift template heading by setting the copyright notice to âCopyright © 2003-2017 Bill Cheeseman. All rights reserved. Used by permission.â, adding the line âVersion 3.0.0â
- Revised ElementDataSource.swift by copying the entire contents of ElementDataSource.swift from the 2016 build of UI Browser 3, and making Swift 3 conversions requested by Xcode.
- Revised MainContentViewControllerâs viewDidLoad() method by adding temporary code to test PFAssistiveFramework4 builds 3 and 4.
- Moved development to macOS Sierra 10.12.4, Xcode 8.3 and Swift version 3.1.
2017-08-21 (3.0.0 build 10)
Prepare to convert to Swift 4.
- Changed the projectâs Versioning -
CURRENT_PROJECT_VERSION
(âCurrent Project Versionâ) build setting to 10. - Changed the projectâs
MACOSX_DEPLOYMENT_TARGET
(âmacOS Deployment Targetâ) build setting to 10.13. - Revised Info.plist by setting CFBundleVersion (âBundle versionâ) to 10.
- Moved development to macOS High Sierra 10.13.6 dev beta 7 and Xcode 9 beta 6.
- Updated to recommended Xcode build settings.
- Successfully built in Swift 3.2, with warnings.
- Successfully ran in Swift 3.2.
- Moved initial user defaults registration from MainContentViewControllerâs
initialize()
function to AppDelegateâsapplicationWillFinishLaunching(_:)
function in response to warning that initialize() is not guaranteed to run and will be deprecated in future. - Fixed remaining warnings in MainContentViewControllerâs
viewDidLoad()
. - Added missing QSWShowDetailSplitItemTemplate image to Assets.xcassets.
- Commented out test code in MainContentViewControllerâs
viewDidLoad()
to avoid crash. - Saved a snapshot of build version 10.
2017-08-23 (3.0.0 build 11)
Convert to Swift 4.
- Changed the projectâs Versioning -
CURRENT_PROJECT_VERSION
(âCurrent Project Versionâ) build setting to 11. - Changed the projectâs macOS Deployment Target to 10.13.
- Revised ElementDataSourceâs
updateDataSourceForElementAtLevel(_:forIndex:)
function by casting currentItem[âelementâ] as! AccessibilityElement in order to get its AXChildren property without a warning. - Changed Xcode project format to Xcode 8.0-compatible.
- Fixed âNo such module âPFAssistiveFramework4 moduleââ compiler error by temporarily moving AccessibilityElement.swift from the PFAssistiveFramework4 project to the UIBrowser3 project, converting to the new build system (File > Workspace Settings), converting only the UIBrowser3 project, and turning off conversion of both test targets. But I was later able to convert the test targets one at a time separately, which required no change because they are empty.
- Ran converter; it reported a few source changes needed, and made them.
- Completed migration for @objc inference minimized by turning off deprecated @obj inference.
- Changed Xcode project format to Xcode 8.0-compatible.
- Moved AccessibilityElement.swift back to the PFAssistiveFramework4 project, and resumed using the UIBrowser3 workspace to develop, build and run UI Browser.
- Successfully built and ran in Swift 4.
- Saved a snapshot of build version 11.
2017-08-29 (3.0.0 build 12)
Revise flow of control for choosing and launching a target application.
- Moved development to macOS High Sierra 10.13 dev beta 8.
- Changed the projectâs Versioning -
CURRENT_PROJECT_VERSION
(âCurrent Project Versionâ) build setting to 12. - Revised MainWindowControllerâs updateWindowTitle(with:) method.
- Implemented MainContentViewControllerâs
chooseRunningTarget(_:)
method. - Renamed MainContentViewControllerâs selectedTarget property to currentTarget.
- Created extension on MainTargetViewController in TargetMenuExtension.swift, and moved the
chooseNoTarget(_:)
,chooseAnyTarget(_:)
, andchooseRunningTarget(_:)
action methods into it from MainTargetViewController.swift, and moved theupdateTargetMenu(_:)
method into it from AppDelegate.swift. - Renamed MainContentViewControllerâs
updateTarget(_:)
method toupdateApplication(for:)
, and broke most of its code out into new methodupdateApplicationData()
. - Renamed MainContentViewControllerâs
updateTargetDisplay()
method to updateApplicationDisplay(). - Implemented MainContentViewControllerâs
updateApplication(for:withTimer:)
method, and moved it intoobserveValue(forKeyPath:of:change:context:)
as a closure. - Added MainContentViewControllerâs
validateChosenTarget(_:)
method to consolidate KVO observer management and test whether a new target that has finished launching has made access available. - Added MainContentViewControllerâs
menuDidClose(_:)
NSMenuDelegate delegate method to update the Target pop-up buttonâs title if the user opened its menu and then dismissed it without choosing an item. - Revised the MainContentViewControllerâs
sheetForApplicationFailedToLaunch(name:)
andsheetForApplicationUIElementNotCreated(name:)
methods. - Added TargetMenuExtensionâs
updateTargetPopUpButton()
method to consolidate Target pop-up button title management. - Implemented TargetMenuExtensionâs
chooseNoTarget(_:)
action method. - Successfully built and ran in Swift 4.
- Saved a snapshot of build version 12.
2017-09-06 (3.0.0 build 13)
Clean up handling of No Target menu item.
- Moved development to macOS High Sierra 10.13 dev beta 9.
- Changed the projectâs Versioning -
CURRENT_PROJECT_VERSION
(âCurrent Project Versionâ) build setting to 13. - Revised TargetMenuExtensionâs
chooseNoTarget(_:)
action method to callupdateApplication(for:)
with a nil target parameter to clear UI Browserâs data and display. - Revised MainContentViewControllerâs updateApplication(for:) to handle the nil target passed in from the
chooseNoTarget(_:)
action method by clearing UI Browserâs data and display. - Revised MainWindowControllerâs
updateWindowTitle(for:)
to take an NSRunningApplication parameter. - Successfully built and ran in Swift 4.
- Saved a snapshot of build version 13.
2017-09-8 (3.0.0 build 14)
Implement Swift 3 KVO (removed in build 16).
- Changed the projectâs Versioning -
CURRENT_PROJECT_VERSION
(âCurrent Project Versionâ) build setting to 14. - Revised Defines.h and MainContentViewController to remove the KVO value constants because KVO only uses the addresses.
- Revised Defines.h to remove the KVO key constants, and revised MainContentViewController and TargetMenuExtensions to use the #keyPath() expression instead.
- Revised MainContentViewController and TargetMenuExtensions to add the context: parameter to all
removeObserver()
calls. - Successfully built and ran in Swift 4.
- Saved a snapshot of build version 14.
2017-09-8 (3.0.0 build 15)
Implement Swift 4 KVO.
- Changed the projectâs Versioning -
CURRENT_PROJECT_VERSION
(âCurrent Project Versionâ) build setting to 15. - Implemented Swift 4 KVO by adding observe() method calls in TargetMenuExtensionâs
chooseAnyTarget(_:)
for the isFinishedLaunching key path and in MainContentViewControllerâsvalidateChosenTarget(_:)
for the isTerminated key path, and moving the two context blocks in the observeValue(forKeyPath:of:change:context:) Swift 3 KVO observer method into the two observe() methodsâ handler blocks. - Added tests for #available(macOS 10.13, *) to call the observe() Swift 4 KVO methods when UI Browser is running on macOS High Sierra 10.13 or newer, and to call the
addObserver()
andremoveObserver()
Swift 3 KVO methods otherwise. - Revised MainContentViewControllerâs
validateChosenTarget()
method and changed it tovalidateTarget()
. - Successfully built and ran in Swift 4.
- Saved a snapshot of build version 15.
2017-09-10 (3.0.0 build 16)
Change deployment target to OS X Yosemite 10.10, and remove all Swift 3 KVO code.
- Changed the projectâs Versioning -
CURRENT_PROJECT_VERSION
(âCurrent Project Versionâ) build setting to 16. - Changed the projectâs
MACOSX_DEPLOYMENT_TARGET
(âmacOS Deployment Targetâ) build setting to 10.10. - Revised TargetMenuExtensionâs
chooseAnyTarget(_:)
action method to use repeating timer block only if #available(OSX 10.12, *) and otherwise post an alert. - Removed all tests for if #available(OSX 10.13, *), which should have been tests for #if swift(>=4.0) to limit use of new Swift 4 KVO observer method to builds performed with Swift 4, and removed all of the Swift 3 branches and the
observeValue(forKeyPath:of:change:context:)
Swift 3 KVO observer method, because we will never again build under Swift 3. - Revised TargetMenuExtensionâs
UpdateTargetMenu(_:)
to break running background applications array into separate arrays for LSUIElement and LSBackgroundApplication applications, in anticipation of altering the preferences settings to eliminate or separate handling of the latter. - Successfully built and ran in Swift 4.
- Saved a snapshot of build version 16.
2017-09-12 (3.0.0 build 17)
Clean up Target menu handling.
- Changed the projectâs Versioning -
CURRENT_PROJECT_VERSION
(âCurrent Project Versionâ) build setting to 17. - Modified all type properties allowing outside references to self by renaming them âsharedâ.
- Revised TargetMenuExtensionâs
chooseAnyTarget(_:)
andchooseRunningTarget(_:)
action methods to do nothing if the chosen target is already the current target. - Revised TargetMenuExtensions by adding Markup documentation.
- Moved development to macOS High Sierra 10.13 GM Candidate 1 and Xcode 9 GM.
- Renamed MainContentViewControllerâs
validateTarget(_:)
method tovalidate(_:)
, moved it to TargetMenuExtension, and revised it. - Changed all references to NSRunningApplicationâs localizedName to NSFileManagerâs displayName per Apple Technical Q&A QA1544, including in MainWindowControllerâs
updateWindowTitle(for:)
- Implemented MainContentViewControllerâs
displayNameForTarget()
method using code extracted fromupdatedWindowTitle()
, and called the new method in several places to save space and maintain consistency. - Implemented MainContentViewControllerâs
displayName(for:)
method for more general use. - Revised MainWindowControllerâs updateWindowTitle() by removing its parameter for consistency and improving efficiency.
- Revised MainContentViewControllerâs viewDidLoad() method by registering it to observe the willPopUpNotification notification instead of implementing the menuNeedsUpdate(_ delegate method.
- Removed MainContentViewControllerâs designation as NSMenuDelegate and removed its
menuNeedsUpdate(_:)
andmenuDidClose(_:)
delegate methods because no longer needed. - Implemented MainContentViewControllerâs
targetPopUpButtonWillPopUp(_:)
notification method and moved the last block ofupdateTargetMenu(_:)
into it, with modifications modeled on UI Browser 2 code. - Revised AppDelegateâs
MenuNeedsUpdate(_:)
delegate method and moved the last block of TargetMenuExtensionsâsupdateTargetMenu(_:)
into it, with modifications modeled on UI Browser 2 code. - Successfully built and ran in Swift 4.
- Saved a snapshot of build version 17.
2017-09-20 (3.0.0 build 18)
Complete Target menu handling.
- Changed the projectâs Versioning -
CURRENT_PROJECT_VERSION
(âCurrent Project Versionâ) build setting to 18. - Moved development to Xcode 9 final (build version unchanged from GM) and Swift 4.0 final.
- Revised TargetMenuExtensionâs
chooseAnyTarget(_:)
action method extensively. - Implemented TargetMenuExtensionâs
targetValidationTimer(_:)
method so it could be scheduled in two places inchooseAnyTarget(_:)
. - Renamed launchedTarget property to launchingTarget.
- Added typealias RunningInfo and used it throughout TargetMenuExtension.
- Implemented TargetMenuExtensionâs
chooseSystemwideTarget(_:)
action method and the isSystemwideTarget variable to identify when a nil currentTarget signifies that the systemwide target instead of no target is chosen, and revised methods throughout to use it. - Renamed
validate(_:)
method tovalidate(target:)
. - Completed markup documentation in TargetMenuExtension.
- Successfully built and ran in Swift 4.
- Saved a snapshot of build version 18.
2017-09-25 (3.0.0 build 19)
Start setting up ElementDataSource and BrowserTabItemViewController.
- Changed the projectâs Versioning -
CURRENT_PROJECT_VERSION
(âCurrent Project Versionâ) build setting to 19. - Moved development to macOS High Sierra 10.13.0 final.
- Revised MainContentViewControllerâs
updateApplicationData()
and updateApplicationDisplay(). - Revised MasterTabViewController by adding âsharedâ type property allowing outside references to self and revised
viewDidLoad()
to set it. - Revised MasterSplitItemViewController by adding âsharedâ type property allowing outside references to self and revised
viewDidLoad()
to set it. - Revised Defines.swift by adding MASTER_TAB_VIEW_ITEM_DEFAULTS_KEY and the MasterTabViewItemIndex enum.
- Revised AppDelegateâs
applicationWillFinishLaunching(_:)
delegate method to set MASTER_TAB_VIEW_ITEM_DEFAULTS_KEY to MasterTabViewItemIndex.Browser.rawValue at first launch. - Revised MasterSplitItemViewController by adding
updateDisplay()
method to update the master split itemâs display when the user chooses a new target. - Revised MainContentViewControllerâs
updateApplicationDisplay()
to call MasterSplitItemViewControllerâsupdateDisplay()
method when the user chooses a new target. - Revised
BrowserTabItemViewController
to implement NSBrowser datasource item-based protocol, and declared it to conform to NSBrowserDelegate. - Successfully built in Swift 4, but it wonât yet successfully display the contents of the browser view.
- Saved a snapshot of build version 19.
2017-10-10 (3.0.0 build 20)
Complete ElementDataSource and BrowserTabItemViewController for an application target.
- Changed the projectâs Versioning -
CURRENT_PROJECT_VERSION
(âCurrent Project Versionâ) build setting to 20. - Revise ElementDataSource by changing all uses of type AnyObject to Any to conform to Swift 3 and 4 usage in NSBrowserDelegate.
- Revised BrowserTabItemViewController by implementing the
selectElement(_:)
action method and connected it to BrowserTabItemViewControllerâs first responder in Main.storyboard. - Successfully built and ran in Swift 4.
- Saved a snapshot of build version 20.
##2017-10-12 (3.0.0 build 21)
Improve efficiency of choosing and validating a new target.
- Changed the projectâs Versioning -
CURRENT_PROJECT_VERSION
(âCurrent Project Versionâ) build setting to 21. - Revised TargetMenuExtensionâs
validate(target:)
method to return the application AccessibilityElement object that was created to validate the proposed target, instead of discarding it, so it can be used inupdateApplication(for:)
to update ElementDataSource instead of recreating it; and renamed the method validatedTargetElement(for:). - Revised MainContentViewControllerâs
updateApplication(for:)
to take the AccessibilityElement returned byvalidatedTargetElement(for:)
and pass it toupdateApplicationData()
to update ElementDataSource; and renamed the methodupdateApplication(forTarget:withElement:)
. - Revised MainContentViewControllerâs
updateApplicationData()
to take the AccessibilityElement returned byvalidatedTargetElement(for:)
and use it to update ElementDataSource; and renamed the methodupdateApplicationData(withTargetElement:)
. - Revised
chooseNoTarget(_:)
andchooseSystemWideTarget(_:)
action methods so they do not call validatedTargetElement(for:), and moved the code to clean out the old currentTarget to MainContentViewControllerâsupdateApplication(forTarget:withElement:)
. - Revised
validatedTargetElement(for:)
so the parameter value is not optional, removed the nil branch, and added the code from thechooseNoTarget(_:)
andchooseSystemWideTarget(_:)
action methods to clean out the old currentTarget. - Revised all of the TargetMenuExtensionâs action method signatures to specify NSMenuItem specifically as the sender type.
- Revised the
chooseAnyTarget(_:)
action method by removing theisRunning(_:)
nested function and replacing it with the NSRunningApplication arrayâscontains(where:)
method, instead. - Revised the names of methods and properties throughout to comply with Appleâs API Design Guidelines for Swift 3 and 4.
- Successfully built and ran in Swift 4.
- Saved a snapshot of build version 21.
2017-10-15 (3.0.0 build 22)
Complete ElementDataSource and BrowserTabItemViewController for no target.
- Changed the projectâs Versioning -
CURRENT_PROJECT_VERSION
(âCurrent Project Versionâ) build setting to 22. - Moved development to Xcode 9.0.1.
- Removed the isProcessTrusted global property and code that set it, and replaced all references to it with direct calls to the PFAssistiveFramework4
isProcessTrusted()
method. - Implemented the NSBrowser+PFSmallBrowserAdditions Objective-C category file.
- Revised BrowserTabItemViewControllerâs
viewDidLoad()
method to call methods implemented in the NSBrowser+PFSmallBrowserAdditions Objective-C category. - Implemented BrowserTabItemViewControllerâs
clearView()
method. - Revised MasterSplitItemViewController by implementing
clearView()
to call BrowserTabItemViewControllerâsclearView()
. - Revised MainContentViewController
updateView()
to call MasterSplitItemViewControllerâsclearView()
. - Revised several methods to use optional parameters.
- Revised TargetMenuExtensionâs
validatedTargetElement(for:)
method by limiting it to the validation code and moving other code to MainContentViewControllerâsupdateApplication(for:using:)
, and by adding the role == NSAccessibilityRole.application.rawValue test. - Successfully built and ran in Swift 4.
- Saved a snapshot of build version 22.
2017-10-22 (3.0.0 build 23)
Implement system-wide element data and display.
- Changed the projectâs Versioning -
CURRENT_PROJECT_VERSION
(âCurrent Project Versionâ) build setting to 23. - Changed the currentTarget, launchingTarget and currentDataSource properties to runningApplicationTarget, launchingApplicationTarget and currentElementData throughout.
- Removed the isSystemWideTarget property.
- Revised ElementDatasource by adding the
updateDataSourceForSystemWideElement(element:)
method. - Revised
MainContentViewcontroller.displayName(for:)
by adding an assertionFailure() call, returning empty string if error, and making returned string nonoptional. - Revised
MainContentViewController.displayNameForTarget()
by changing its name todisplayNameForTargetApplication()
, adding anassert()
call if runningApplicationTarget is nil, callingdisplayName(for:)
and returning empty string if error, and making returned string nonoptional. - Revised
MainWindowController.updateWindowTitle()
to handle SystemWide Target. - Revised TargetMenuExtensionâs
MainContentViewController.targetPopUpButtonWillPopUp(_:)
to handle SystemWide Target. - Revised
AppDelegate.menuNeedsUpdate(_:)
to handle SystemWide Target. - Revised TargetMenuExtensionâs
MainContentViewController.updateTargetPopUpButton()
by changing its name toUpdateTargetPopUpButtonTitle()
, and to handle SystemWide Target. - Successfully built and ran in Swift 4.
- Saved a snapshot of build version 23.
2017-10-25 (3.0.0 build 24)
Adopt PFAssistiveFramework4 AccessibilityElement changes.
- Changed the projectâs Versioning -
CURRENT_PROJECT_VERSION
(âCurrent Project Versionâ) build setting to 24. - Adopted PFAssistiveFramework4 build 11 changes to AccessibilityElement.
- Revised TargetMenuExtensionâs
validatedTargetElement(for:)
to call newAccessibilityElement.applicationElement(forProcessIdentifier:withDelegate:)
class method. - Revised TargetMenuExtensionâs
chooseSystemWideTarget(_:)
action method to call newsystemWidwElement(withDelegate:)
class method. - Successfully built and ran in Swift 4.
- Saved a snapshot of build version 24.
2017-10-25 (3.0.0 build 25)
Simplify and clarify ElementDataSource code.
- Changed the projectâs Versioning -
CURRENT_PROJECT_VERSION
(âCurrent Project Versionâ) build setting to 25. - Made terminology changes throughout.
- Revised BrowserTabItemViewController by adding Markup documentation.
- Revised
MainContentViewController.updateView()
to callMasterSplitItemViewController.clearView()
for running application targets as well as No Target and SystemWide Target, to work around NSBrowser bug relating to column titles. - Declared ElementDataSourceâs typealias ElementNodeInfo in order to better hide the actual type.
- Renamed ElementDataSource.currentItem to currentNode.
- Renamed the ElementDataSource.elementArray property to elementTree.
- Moved creation of elementTree and currentNode into init().
- Renamed methods to
nodeAt(level:index:)
,node(atIndexPath:)
,childNode(ofParentNode:atChildIndex:)
,nodeCount(atLevel:)
,element(ofNode:)
,childCount(ofNode:)
,indexPath(ofNode:)
,briefDescription(ofNode:)
, . - Revised the
BrowserTabItemViewController.browser(_:child:ofItem:)
NSBrowser datasource method to assert in debug mode that the type of item is ElementNodeInfo. - Changed ElementDataSource uses of item to node.
- Removed ElementDataSource uses of AnyObject.
- Added type designations for ElementNodeInfo.
- Successfully built and ran in Swift 4.
- Saved a snapshot of build version 25.
2017-10-30 (3.0.0 build 26)
Improve ElementDataSource code, change its terminology and write its markup documentation.
- Changed the projectâs Versioning -
CURRENT_PROJECT_VERSION
(âCurrent Project Versionâ) build setting to 26. - Moved development to macOS High Sierra 10.13.1 and Xcode 9.1.
- Revised ElementDataSource by defining ElementNodeKey enumeration for element node dictionary keys.
- Renamed ElementDataSource class to ElementDataModel.
- Revised terminology throughout to refer to the model as the âdata modelâ and âdatasourceâ methods to âdata sourceâ methods.
- Revised ElementDataModel by adding Markup documentation.
- Revised ElementDataModel by renaming many methods to comply with Apple style guidelines.
- Revised Defines.h by chaning the Terminology enumeration cases to lowercase.
- Revised
ElementDataModel.updateDataModel(forApplicationElement:)
by moving inline code into theappleScriptDescriptions(forElement:)
nested method. - Revised
ElementDataModel.updateDataModelForCurrentElementAt(level:index:)
by moving inline code into theappleScriptNameAndIndex(forElement:elementIndex:roleIndex:)
nested method. - Revised ElementDataModelâs updateDataModel⊠methods by removing multiple local variable declarations in favor of creating a node dictionary using inline method calls.
- Revised ElementDataModelâs appleScriptClassNames variable, improved its error handling, and added the
sheetForRolesAppleScriptFileFailedToLoad()
method. - Pruned the list of AppleScript roles in RoleAppleScript.strings to match the System Events scripting dictionary.
- Successfully built and ran in Swift 4.
- Saved a snapshot of build version 26.
2017-11-05 (3.0.0 build 27)
Add support for the system-wide element in ElementDataSource.
- Changed the projectâs Versioning -
CURRENT_PROJECT_VERSION
(âCurrent Project Versionâ) build setting to 27. - Replaced RolesAppleScript.strings file with AppleScriptRoles.plist file.
- Revised
ElementDataModel.updateDataModel(forSystemWideElement:)
by moving inline code into theappleScriptDescriptions(forElement:)
nested method. - Revised
MainContentViewController.updateView()
to callMasterSplitItemViewController.shared.updateView()
when the system-wide element is chosen as well as when an application element is chosen as the target. - Successfully built and ran in Swift 4.
- Saved a snapshot of build version 27.
2017-11-06 (3.0.0 build 28)
Implement the Activate buttonâs activateTarget(_ action method.
- Changed the projectâs Versioning -
CURRENT_PROJECT_VERSION
(âCurrent Project Versionâ) build setting to 28. - Created extension on MainContentViewController in ActivateButtonExtension.swift.
- Implemented ActivateButtonExtensionâs
activateTarget(_:)
action method. - Connected activateButton outlet to First Responderâs
activateTarget(_:)
action method in Main.storyboard. - Successfully built and ran in Swift 4.
- Saved a snapshot of build version 28.
2017-11-06 (3.0.0 build 29)
Import the PFAccessibilityAuthorizer2 framework and use it in the Accessibility checkboxâs action method and elsewhere.
- Changed the projectâs Versioning -
CURRENT_PROJECT_VERSION
(âCurrent Project Versionâ) build setting to 29. - Created extension on MainTargetViewController in AccessibilityCheckboxExtension.swift.
- Implemented AccessibilityCheckboxExtensionâs
toggleAccessibility(_:)
action method. - Connected accessibilityCheckbox outlet to First Responderâs
toggleAccessibility(_:)
action method in Main.storyboard. - Added the PFAccessibilityAuthorizer2 project to the UIBrowser3 workspace by dragging the project file into the root level of the workspace navigator.
- Designated the PFAccessibilityAuthorizer2 project to the UIBrowser3 project as an embedded binary by using the plus button in the General pane.
- Revised AccessibilityCheckboxExtension by importing PFAccessibilityAuthorizer2.
- Revised AccessibilityCheckboxExtension
toggleAccessibilityList(_:)
by temporarily callingAuthorizer().shoutOut()
to test the PFAccessibilityAuthorizer2 framework. - Revised AppDelegate by importing PFAccessibilityAuthorizer2, declaring the accessibilityAuthorizer instance property, and revising the
applicationWillFinishLaunching(_:)
delegate method to create and initialize an instance of AccessibilityAuthorizer and set it to use sheets instead of modal alerts. - Revised
applicationDidFinishLaunching(_:)
by moving the definition of AppDelegate.shared to theapplicationWillFinishLaunching(_:)
delegate method, along with the accessibilityAuthorizer calls. - Revised the AccessibilityCheckboxExtension
toggleAccessibility(_:)
action method by callingaccessibilityAuthorizer.updateAndOpenAccessibilityList()
. - Changed the targetâs Packaging - PRODUCT_NAME (âProduct Nameâ) build setting from $(Target_NAME) to UI Browser, so that PFAccessibilityAuthorizer2 will display it correctly in alerts while UI Browser is running in Xcode.
- Revised AppDelegateâs
applicationWillFInishLaunching(_:)
delegate method to call PFAccessibilityAuthorizer2âs convenience initializer. - Added the
menuDidClose(_:)
delegate method to AppDelegate and the TargetMenuExtension on MainContentViewController to call requestAccess() after the Target menu is dismissed, and set MainContentViewController to conform to the NSMenuDelegate formal protocol. - Successfully built and ran in Swift 4.
- Saved a snapshot of build version 29.
2017-11-21 (3.0.0 build 30)
Implement the NSUserInterfaceValidation and NSValidateUserInterfaceItem protocols for the Activate button in the MainContentViewController per Cocoa Recipes for Mac OS X (2nd Edition), Recipe 4, Step 4.
- Changed the projectâs Versioning -
CURRENT_PROJECT_VERSION
(âCurrent Project Versionâ) build setting to 30. - Created MainWindow.swift as a subclass of NSWindow to override its update() method, then decided to implement user interface validation in MainWindowControllerâs
windowDidUpdate()
delegate method instead. - Revised the MainWindow.swift template heading by changing the copyright to âCopyright © 2017 Bill Cheeseman. All rights reserved. Used by permission.â and adding the line âVersion 3.0.0â.
- Revised Main.storyboard by changing the Main Window Controllerâs Main Window to Custom Class MainWindow instead of NSWindow.
- Revised MainContentViewController.swift by implementing the custom ValidatedControl protocol as a subprotocol of the NSValidatedUserInterfaceItem protocol and implementing the ValidatedButton subclass of NSButton declaring that it conforms to the custom ValidatedControl protocol.
- Revised Main.storyboard by setting the Activate buttonâs Custom Class to ValidatedButton instead of NSButton.
- Revised MainWindowController by implementing the
windowDidUpdate()
delegate method and calling the custom ValidatedControl protocolâs update() method. - Revised MainContentViewController by implementing the
validateUserInterfaceItem(_:)
protocol method and declaring that MainContentViewController conforms to the NSUserInterfaceValidations formal protocol. - Successfully built and ran in Swift 4.
- Saved a snapshot of build version 30.
2017-11-21 (3.0.0 build 31)
Implement the Detail buttonâs toggleDetailSplitItem(_ action method.
- Changed the projectâs Versioning -
CURRENT_PROJECT_VERSION
(âCurrent Project Versionâ) build setting to 31. - Revised MainContentViewController by adding its disclosureButton outlet, and connected it in Main.storyboard.
- Created extension on MainContentViewController in DisclosureButtonExtension.swift.
- Revised the DisclosureButtonExtension.swift template heading by changing the copyright to âCopyright © 2017 Bill Cheeseman. All rights reserved. Used by permission.â and adding the line âVersion 3.0.0â.
- Revised DisclosureButtonExtension by implementing the
discloseDetailSplitItem(_:)
action method to toggle the DetailSplitItemâs isCollapsed property. - Connected
discloseDetailSplitItem(_:)
action method to MainContentViewcontrollerâs First Responder in Main.storyboard. - Revised DetailSplitItemViewController by implementing its shared static variable and setting it in viewDidLoad().
- Revised MainSplitViewController by implementing
splitView(_:canCollapseSubview)
delegate method to return true for the detail split item, so we can collapse it by dragging the divider, but then removed it in favor of setting the value in Main.storyboard. - Revised MainContentViewController by changing the case statement in
prepare(for:sender:)
from MainContentViewSegueIdentifier to MainContentViewControllerSegueIdentifier, a bug that was preventing the detail split view from expanding and collapsing in some circumstances. - Renamed Disclosure button as Detail button and the
discloseDetailSplitItem(_:)
action method as toggleDetailSplitItem. - Revised the
toggleDetailSplitItem(_:)
action method to change only the isCollapsed property (removing the isHidden property), and added a call to the animator proxy to animate the expansion and collapse of the detail split item. - Revised Main.storyboard by changing the detail button to a Square Momentary Push In borderless button with the same image (renamed), and removed the proxy animator binding from Main.storyboard.
- Revised Main.storyboard by disconnecting the delegate property of all NSWindow, NSTabView and NSSplitView objects because they are connected automatically by Xcode 9, per macOS High Sierra 10.13 AppKit Release Notes.
- Confirmed through testing that the
splitView(_ splitView:shouldCollapseSubview:forDoubleClickOnDividerAt:)
delegate method does not work in macOS High Sierra 10.13, but left it in place for testing under eariler versions of macOS. - Successfully built and ran in Swift 4.
- Saved a snapshot of build version 31.
2017-11-23 (3.0.0 build 32)
Make the Detail button a Toggle button with on and off images.
- Changed the projectâs Versioning -
CURRENT_PROJECT_VERSION
(âCurrent Project Versionâ) build setting to 32. - Created DetailToggleButtonOnTemplate.pdf and DetailToggleButtonOffTemplate.pdf images in Photoshop and added them to Assets.xcassets.
- Revised MainContentViewControllerâs
validateUserInterfaceItem(_:)
protocol method by adding a branch to toggle the state of the detail button when the detail split view item is collapsed or expanded. - Revised Main.storyboard by setting the detail buttonâs Custom Class to ValidatedButton instead of NSButton.
- Successfully built and ran in Swift 4.
- Saved a snapshot of build version 32.
2017-11-23 (3.0.0 build 33)
Make Target menu and Accessibility checkbox respond to changes in access status.
- Changed the projectâs Versioning -
CURRENT_PROJECT_VERSION
(âCurrent Project Versionâ) build setting to 33. - Revised MainContentViewControllerâs
validateUserInterfaceItem(_:)
protocol method by adding a branch to update the state of the Accessibility checkbox based on the value of isProcessTrusted. - Revised Main.storyboard by setting the accessibility checkboxâs Custom Class to ValidatedButton instead of NSButton.
- Revised MainContentViewControllerâs
viewDidLoad()
method to observe the AccessAuthorizer.didChangeAccessStatusNotification notification, and added thedidChangeAccessStatus(_:)
notification method to respond by clearing the application and setting the Target menu to No Target. - Revised TargetMenuExtension by adding an import PFAccessibilityAuthorizer2 statement
- Revised the
MainContentViewController.validateUserInterfaceItem(_:)
notification method to use a switch statement. - Successfully built and ran in Swift 4.
- Saved a snapshot of build version 33.
2017-11-25 (3.0.0 build 34)
Conform MainContentViewController to AccessibilityElementâs AccessibleElementDelegate protocol observing elementsâ destruction.
- Changed the projectâs Versioning -
CURRENT_PROJECT_VERSION
(âCurrent Project Versionâ) build setting to 34. - Revised MasterSplitItemViewController by implementing the
refreshApplication(_:)
action method. - Revised Main.storyboard by connecting the
refreshApplication(_:)
action method to First Responder. - Revised MasterSplitItemViewController by implementing refreshApplicationToRoot(_ for Shift-click on refresh application button.
- Revised MainContentViewControllerâs
viewDidLoad()
by registering as an observer of the PFAssistiveFramework4 AccessibilityElementâs elementWasDestroyedNotification. - Revised MainContentViewController by implementing the
elementWasDestroyed(_:)
notification method as a test stub. - Revised
ElementDataModel.updateDataModelForCurrentElementAt(level:index:)
to set every child elementâs delegate property when it is added to the data source for display. - Revised MainContentViewController by implementing an extension on MainContentViewController declaring that it conforms to the AccessibleElementDelegate formal protocol, and moved the notification method test stub into the extension, so it can also serve as the delegate method as well as a notification method.
- Successfully built and ran in Swift 4.
- Saved a snapshot of build version 34.
2017-12-01 (3.0.0 build 35)
Revise ElementDataModel to cache selected parent and child nodes and track the selected element path as the user selects UI elements.
- Changed the projectâs Versioning -
CURRENT_PROJECT_VERSION
(âCurrent Project Versionâ) build setting to 35. - Revised ElementDataModelâs ElementNodeKey enum by adding .parentNodeKey and .childNodeKey.
- Revised ElementDataModel by implementing the elementPath property.
- Revised ElementDataModelâs designated initializer by creating elementPath as an empty array.
- Revised ElementDataModel
updateDataModel(forSystemWideElement:)
andupdateDataModel(forApplicationElement:)
by adding .parentElementKey and .childElementKey values of an empty dictionary to the node. - Revised ElementDataModel
updateDataForCurrentElementAt(level:index:)
by setting the selected nodeâs parent nodeâs child node, setting the parent nodes of all of the selected nodeâs child nodes to the selected node, setting their child nodes to an empty dictionary, and updating the elementPath property. - Revised ElementDataModel
clearDataModel()
by removing all from elementPath. - Successfully built and ran in Swift 4.
- Saved a snapshot of build version 35.
2017-12-02 (3.0.0 build 36)
Implement color coding for destroyed elements.
- Changed the projectâs Versioning -
CURRENT_PROJECT_VERSION
(âCurrent Project Versionâ) build setting to 36. - Moved development to Xcode 9.2, Swift 4.0.3.
- Revised MainContentViewController by implementing the destroyedColor property.
- Revised BrowserTabItemViewController by implementing the
browser(_:wilDisplayCell:atRow:column:)
optional item-based NSBrowser delegate method. - Revised BrowserTabItemViewController by implementing
modifiedObjectValueForCell(_:atRow:column:)
, called by thebrowser(_willDisplayCell:atRow:column:)
delegate method, to change the color of destroyed elements to destroyedColor just before the element is displayed. - Revised BrowserTabItemViewController by implementing the
browser(_:isColumnValid:)
delegate method to return false if any cell in the column is destroyed, thereby forcing NS Browser to reload the column, and revised the MainContentViewController elementWasDestroyed delegate method to call the browserâsvalidateVisibleColumns()
method to callbrowser(_:isColumnValid:)
on every visibile column. Confirmed that this caused all destroyed elements to turn destroyedColor as soon as any one of them was destroyed. - Removed the new column validation methods because they are too inefficient, being called by every element that is destroyed and repeatedly redrawing all of them on each call. Will instead call
reloadData(forRowIndexes:inColumn)
only once for each cell holding a destroyed element and only for that element. The ElementDataModel must set the indexPath of each AccessibleElement when it is added to the data source, so it can efficiently tell the browser which row and column it is in when it is destroyed instead of forcing the browser to search for it. - Revised AccessibleElement by adding an indexPath property.
- Revised MainContentViewControllerâs
elementWasDestroyed(_:)
delegate method to callreloadData(forRowIndexes:inColumn)
. - Successfully built and ran in Swift 4, but errors when select a destroyed element.
- Saved a snapshot of build version 36.
2018-01-17 (3.0.0 build 37)
Review all for best Swift 4 practices.
- Changed the projectâs Versioning -
CURRENT_PROJECT_VERSION
(âCurrent Project Versionâ) build setting to 37. - Revised
AppDelegate.menuNeedsUpdate(_:)
by adding assert() to test assignment to âcontrollerâ instead of using a guard block. - Revised all classes that declare a âsharedâ type property to use a âsharedInstanceâ property instead.
- Revised AppDelegate.swift by removing its âsharedInstanceâ property, and replaced all calls to it with NSApp.delegate.
- Revised
MainContentViewController.displayNameForTargetApplication()
by removing unneeded reference to âMainContentViewController.sharedInstanceâ. - Revised MainContentViewController by adding â@objc dynamicâ to the detailSplitViewItem property.
- Revised MasterSplitItemViewController.swift by calling masterTabViewController instead of MasterTabViewController.sharedInstance in
updateView()
andclearView()
. - Revised
AppDelegate.menuDidClose(_:)
by testing âmenu == targetMenuâ instead of âmenu.title == TARGET_MENU_TITLEâ. - Revised
MainContentViewController.menuDidClose(_:)
(in TargetMenuExtension) by testing âmenu == targetPopUpButton.menuâ instead of menu.numberOfItems, etc. - Revised
MainWindowController.windowDidUpdate(_:)
by replacing for-in loop with forEach closure. - Revised
MainWindowController.prepare(for:sender:)
by addingpreconditionFailure()
to default case of switch statement, and in other locations. - Revised
MainWindowController.updateTargetMenu(_:)
(in TargetMenuExtension) by replacing for-in loops with forEach closures, combining them into a nested function, and simplifying the sort routines. - Revised
MasterSplitItemViewController.refreshApplication()
by replacing for-in loop with forEach closure. - Successfully built and ran in Swift 4.
- Saved a snapshot of build version 37.
2018-01-26 (3.0.0 build 38)
Redesign user interface validation per https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/UIValidation/UIValidation.html#//apple_ref/doc/uid/10000040i.
- Changed the projectâs Versioning -
CURRENT_PROJECT_VERSION
(âCurrent Project Versionâ) build setting to 38. - Revised forEach loops to use âletâ declarations inside loops instead of âvarâ declarations outside loops.
- Revised MainContentViewController by implementing the
updateValidatedControls()
method to validate and update controls that conform to the ValidatedControls subprotocol of the NSUserInterfaceItem protocol, using code formerly located inMainWindowController.windowDidUpdate(_:)
. - Revised the
MainWindowController.windowDidUpdate(_:)
delegate method by calling the new MainContentViewController.updateValidatedControls() method. - Revised MainContentViewController.updateValidatedControls to avoid creating a local constant.
- Revised MainContentViewControllerâs
ValidatedButton.update()
method to make it more general. - Successfully built and ran in Swift 4.
- Saved a snapshot of build version 38.
#2018-01-28 (3.0.0 build 39)
Make the Detail toggle button conform to the current system control tint per https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/DrawColor/Tasks/SystemTintAware.html#//apple_ref/doc/uid/20002180-BCIBFAHH.
- Changed the projectâs Versioning -
CURRENT_PROJECT_VERSION
(âCurrent Project Versionâ) build setting to 39. - Revised Info.plist NSHumanReadableCopyright (Copyright (human-readable)) and InfoPlist.strings NSHumanReadableCopyright ending year to 2018.
- Renamed
MainContentViewController.updateApplication(for:using:)
asupdateApplication(forNewTarget:usingTargetElement:)
. - Renamed
MainContentViewController.updateData(using:)
asupdateData(usingTargetElement:)
. - Revised Main.storyboard by connecting Main Content View Controllerâs detailButton IBOutlet to the Detail button.
- Revised Assets.xcassets by replacing DetailToggleButtonOnTemplate and DetailToggleButtonOffTemplate images with Blue and Graphite counterparts DetailToggleButtonBlueOn, DetailToggleButtonBlueOff, DetailToggleButtonGraphiteOn andf DetailToggleButtonGraphiteOff.
- Revised Main.storyboard by changing the Detail buttonâs Image Set settings to Render As: Default, Resizing: Preserve Vector Data, Devices: Mac, and Scales: Single Scale.
- Revised MainContentViewController (in DetailButtonExtension.swift) by implementing the setDetailButtonColor() method to set the Detail buttonâs image based on the current Tint Color and expanded or collapsed state of the main split view.
- Revised
MainContentViewController.viewDidLoad()
by registering to observe theNSColor.currentControlTintDidChangeNotification
notification. - Revised MainContentViewController by implementing the
systemTintDidChange()
notification method to call thesetDetailButtonColor()
method (and similar methods for any other custom controls) when the user changes the Appearance setting in General preferences. - Revised AppDelegate by implementing the
applicationDidBecomeActive(_:)
andapplicationDidResignActive(_:)
NSApplicationDelegate delegate methods to change the Detail buttonâs color to graphite (clear) when the application is not active. - Revised the Detail button images to use thinner lines.
- Successfully built and ran in Swift 4.
- Saved a snapshot of build version 39.
2018-02-05 (3.0.0 build 40)
Implement the refreshApplication action method and support, and clean up build 37âs errors when selecting a destroyed element.
- Changed the projectâs Versioning -
CURRENT_PROJECT_VERSION
(âCurrent Project Versionâ) build setting to 40. - Revised ElementDataModel by implementing
clearDataModelBeyondLevel(_:)
method. - Revised ElementDataModel by renaming private properties elementTree as elementNodeTree, elementPath as currentElementNodePath and currentNode as currentElementNode, renaming public property indexPathOfCurrentElement as currentElementIndexPath, and adding public property currentElementPath.
- Revised
ElementDataModel.updateDataModelForCurrentElementAt(level:index:)
to fix two bugs (1) by removing the guard statement and adding currentElementNode to currentElementNodePath even when it has no children (it is a leaf node), and (2) by removing a previous currentElementNode from currentElementNodePath if the user selected a differrent row in the currently selected column. - Revised
MasterSplitViewController.refreshApplication()
. - Revised ElementDataModel by adding the
removeNodeAt(level:Index:)
,nodesAt(level:)
andelements(atLevel:)
methods. - Successfully built and ran in Swift 4.
- Saved a snapshot of build version 40.
2018-03-14 (3.0.0 build 41)
Implement OutlineTabItemViewController and ListTabItemViewController.
- Changed the projectâs Versioning -
CURRENT_PROJECT_VERSION
(âCurrent Project Versionâ) build setting to 41. - Revised OutlineTabItemViewController and ListTabItemViewController by declaring that they conform to the NSOutlineViewDataSource and NSTableViewDataSource protocols.
- Revised MasterSplitItemViewControllerâs
updateView()
andclearView()
methods to call the corresponding OutlineTabItemViewController and ListTabItemViewController methods. - Revised OutlineTabItemViewController and ListTabItemViewController by implementing
updateView()
andclearView()
method stubs. - Revised OutlineTabItemViewController and ListTabItemViewController by implementing a sharedInstance type property and setting it in
viewDidLoad()
. - Revised Main.storyboard by inserting a path control and outline view in the Outline Tab Item View Controller Scene and a path control and a table view in the List Tab Item View Controller Scene, by connecting their dataSource outlets, and by configuring their constraints.
- Revised OutlineTabItemViewController and ListTabItemViewController by adding an elementOutline and elementList IBOutlet, and connected them in Main.storyboard.
- Revised OutlineTabItemViewController and ListTabItemViewController by implementing the selectElement(_ action method and connected them in Main.storyboard. This is subject to rethinking because it could all be done in the âŠDidSelect delegate method instead, if nothing needs to be done when a clicked row was already selected.
- Revised ListTabItemViewController by declaring the listPathControl IBOutlet, and by connecting it in Main.storyboard.
- Revised ListTabItemViewController by implementing the numberOfRows(in:) dataSource method and the
tableView(_:viewFor:row:)
delegate method for view-based tab views. - Revised Main.storyboard by connecting the List Tab Item View Controllerâs path controlâs delegate outlet to ListTabItemViewController, in addition to the dataSource outlet.
- Revised ListTabItemViewController by declaring that it conforms to the NSPathControlDelegate protocol.
- Revised ListTabItemViewController by implementing the
pathControl(_:willPopUp:)
delegate method. - Revised ListTabItemViewController.swift by declaring the
clickedPathControlItemIndex
global variable used in thepathControl(_:willPopUp:)
delegate method to populate the pop-up menu based on the selected item. - Revised
ListTabItemViewcontroller
by declaring theListPathControl
subclass ofNSPathControl
and implementing an override ofmouseDown(with:)
to set the newclickedPathControlItemIndex
global variable. - Moved development to Xcode 9.3.1, Swift 4.1.
- Moved development to Xcode 9.4.0, Swift 4.1.2.
- Saved a snapshot of build version 41 (2018-10-28).
====
2018-10-28 (3.0.0 build 42)
Update to macOS Mojave 10.14, Xcode 10, and Swift 4.2.
- Moved development to macOS Mojave 10.14.0, Xcode 10.0.0, Swift 4.2.
- Changed the Projectâs Versioning (Current Project Version or
CURRENT_PROJECT_VERSION
) to 42. - Changed the Projectâs Deployment (macOS Deployment Target or
MACOSX_DEPLOYMENT_TARGET
) to macOS 10.14. - Revised the MasterSplitItemViewController.swift and MainContentViewController.swift
prepare(for:sender:)
methods to use as? instead of as! to fix build errors. - Miscellaneous revisions to UIBrowser3 ListTabItemViewController.swift to begin dealing with Mojave deprecations of NSPathControl cell methods.
- Removed references to UIBrowser3Tests and UIBrowser3UITests targets and deselected Test for them in UIBrowser3 scheme to prepare for conversion to Swift 4.2.
- Converted the Target to Current Swift Syntax (Swift 4.2).
- Changed the Projectâ's Swift Compiler - Language (Swift Language Version or SWIFT_VERSION) to Swift 4.2.
- Revised Main.storyboard to change the placeholder for the outline and list master tab view items from ârootâ to âNo Target.â
- Saved a snapshot of build version 42.
2018-10-28 (3.0.0 build 43)
Complete a version of the list path control and its pop-up menu in ListTabItemViewController subclassing NSPathControl to capture a mouse down event to position the first menu item.
- Changed the Projectâs Versioning (Current Project Version or
CURRENT_PROJECT_VERSION
) to 43. - Revised ListTabItemViewController
updateView()
andclearView()
to eliminate the use of the ârootâ placeholder and the ârootâ persistent first path control item. - Implemented the
ListTabItemViewController
selectPathControlItem(_:)
action method to set the clickedPathControlItemIndex property and connected it to the list path control in Main.storyboard. - Revised the
ListPathControl
mouseDown(with:)
override method to create the pop-up menu and position it over the clicked path control item. - Renamed the
ListTabItemViewController
menuForCell(_:)
method asmenuForPathItem(_:)
and revised it to remove the ârootâ item.
- Revised the
ListTabItemViewController
selectElement(_:)
action method.
- Moved development to macOS Mojave 10.14.1, Xcode 10.1.0, Swift 4.2.1.
- Cleaned out old comments and unused code.
- Saved a snapshot of build version 43.
- Commited Source Control.
##2018-11-01 (3.0.0 build 44)
Implement a new version of the list path control and its pop-up menu in ListTabItemViewcontroller using NSMenuDelegate for the list path control pop-up menu without subclassing NSPathControl to position the first menu item.
- Changed the Projectâs Versioning (Current Project Version or
CURRENT_PROJECT_VERSION
) to 44. - Revised Main.storyboard by disconnecting the list path controlâs delegate connection.
- Revised ListTabItemViewController by declaring that it conforms to the
NSMenuDelegate
formal protocol. - Revised
ListTabItemViewController
menuForPathItem(_:)
by setting the controller as the new pop-up menuâs delegate. - Revised
ListTabItemViewController
by mplementing stubs forListTabItemViewController
menuNeedsUpdate(_:)
andmenu(_:willHighlight)
. - Removed the
ListPathControl
subclass ofNSPathControl
and itsmouseDown(with:)
override method. - Revised
ListTabItemViewController
by renaming theselectPathItem(_:)
action methodpopUpPathControlMenu(_:)
, and revising it to not only detect which path item was clicked but also to create the pop-up menu, set its delegate, configure its menu items with an express call to themenuNeedsUpdate(_:)
delegate method, and pop it up with the menu item for the clicked path item positioned over the clicked path item. - Revised ListTabItemViewController by moving the
menuForPathItem(_:)
code that creates menu items intoconfigurePathControlMenu(_:)
and the code that sets a submenu into themenu(_:willHighlight:)
delegate method. - Revised
ListTabItemViewController
by removingmenuForPathItem(_:)
because the top-level menu is now created in thepopUpPathControlMenu(_:)
action method and the menu items and submenus are created in the delegate methods. - Revised
ListTabItemViewController
by moving theconfigurePathControlMenu(_:)
code into themenuNeedsUpdated(_:)
delegate method and removingconfigurePathControlMenu(_:)
, because. - Added an extension on NSMenu to get the level of a path item submenu in the delegate methods.
- Generally revised all of the code for the list path control and the pop-up menu to work correctly.
- Revised
ElementDataModel
updateDataModelForCurrentElementAt(level:index:)
to update level and index, not index always set to 0 (which was for testing). - Revised
ListTabItemViewController
by implementing theNSMenuDelegate
menuWillOpen(_:)
and menuDidClose(_ delegate methods to cache the datasource when the user opens the list path control pop-up menu and restore it if the user closes the menu without choosing a menu item. This required adding methods toElementDataModel
. - Revised
ElementDataModel
by adding thecachedElementNodeTree
private instance variable and thecacheDataModel(_:)
andrestoreDataModel(_:)
methods. - Revised
ElementDataModel
by addingmediumDescription(ofNode:)
method for use in the path control pop-up menu, and made many other changes to accommodate it. - Cleaned out old comments and unused code.
- Saved a snapshot of build version 44.
- Commited Source Control.
2018-11-13 (3.0.0 build 45)
Fix remaining issues in the list path control and its pop-up menu.
- Changed the Projectâs Versioning (Current Project Version or
CURRENT_PROJECT_VERSION
) to 45. - Revised ElementDataModel by adding the
cachedCurrentIndexPath
private instance variable and removing thecachedElementNodeTree
,cachedCurrentElementNode
andcachedCurrentElementNodePath
private instance variables. - Revised
ElementDataModel
by revisingcacheDataModel(_:)
andrestoreDataModel(_:)
methods to save only the current index path and restore in a loop by callingupdateDataModelForCurrentElementAt(level:index:)
for each level of the index path. - Revised
ListTabItemViewController
by implementing themenuWasDismissed()
@objc method and performing after a delay in themenuDidClose(_:)
delegate method to determine whether the user dismissed the path control pop-up menu without selecting a UI element. - Revised
ListTabItemViewController
selectElement(_:)
andupdateView()
to set the font size of the list path control titles to small. - Cleaned out old comments and unused code.
- Saved a snapshot of build version 45.
- Commited Source Control.
2018-11-16 (3.0.0 build 46)
Fix segmented control and View > UI Elements menu in the Master split view to display an existing datasource in the list view when switching from another view.
- Changed the Projectâs Versioning (Current Project Version or
CURRENT_PROJECT_VERSION
) to 46. - Revised
MasterSplitItemViewController
by implementing theshowMasterTabItem(_:)
action method callingshowView()
and connecting it to themasterTabViewSelector
segmented control in Main.storyboard. - Revised Main.storyboard Main Menu by rewording the âShow UI Element Hierarchyâ menu as âUI Elementsâ and changing its menu items as âShow in Browserâ, âShow in Outlineâ and âShow in Listâ.
- Revised Main.storyboard Main Menu by rewording the âShow UI Element Detailâ menu as âUI Element Informationâ and changing its menu items as âShow Attributesâ, âShow Actionsâ and âShow Notificationsâ.
- Revised Main.storyboard by connecting the
showMasterTabItem(_:)
action method to the masterTabViewSelector segmented control and the View > UI Elements > Show menu items. - Revised
MasterSplitItemViewController
by implementing thevalidateMenuItem(_:)
protocol method for the View > UI Elements > Show menu items, and declared that the controller conforms to theNSMenuItemValidation
formal protocol. - Revised Main.storyboard by adding tags to the segmented control items and View > UI Elements > Show menu items, for use in the action method.
- Revised
MasterSplitItemViewController
by implementing the showView() method called by theshowMasterTabItem(_:)
action method. - Revised
ListTabItemViewController
by implementing theshowView()
method called by theMasterSplitItemViewController
showView()
method. - Saved a snapshot of build version 46.
- Commited Source Control.
2018-11-17 (3.0.0 build 47)
General improvements to the browser and list views, including more fixes for the segmented control and View > UI Elements menu in the Master split view.
- Changed the Projectâs Versioning (Current Project Version or
CURRENT_PROJECT_VERSION
) to 47. - Revised
BrowserTabItemViewController
by implementing theshowView()
method called by theMasterSplitItemViewController
showView()
method. - Revised
BrowserTabItemViewController
by implementing thebrowserWillScroll(_:)
delegate method to work around a longstanding bug that leaves a browser column title undisplayed when a hidden column scrolls into view. - Revised
BrowserTabItemViewController
andListTabItemViewController
showView()
methods to call clearView() if the chosen target was No Target when the master tab view item was switched. - Revised ListTabItemViewController selectElement(_ action method to handle user clicking a table row by updating the list path control, the data model, and the list view.
- Revised ListTabItemViewController by moving the table view branch of the selectElement( action method into the tableViewSelectionDidChange( delegate method to handle selection using the mouse or keyboard there and leave the action method to handle only the list path control.
- Revised
ElementDataModel
by addingupdateIsPending
instance variable and setting it to true in all of the update⊠methods, and setting it to false in theListTabItemViewController
tableViewSelectionDidChange(_:)
delegate method after using it to avoid duplicate updates to the data model. - Cleaned out old comments and unused code.
- Saved a snapshot of build version 47.
- Commited Source Control.
2018-11-22 (3.0.0 build 48)
Create new class ElementPathControlManager to consolidate code for the path controls for reuse in the other master tab item element views.
- Changed the Projectâs Versioning (Current Project Version or
CURRENT_PROJECT_VERSION
) to 48. - Created a new file ElementPathControlManager.swift and implemented the
ElementPathControlManager
class in it. - Revised
ListTabItemViewController
andElementPathControlManager
by moving all code relating to the management of the list path control from the former to the latter. - Revised
MasterSplitItemViewController
by adding thecurrentElementView()
method, and revisedElementPathControlManager
to use it in themenuDidClose(_:)
delegate method to make the current element view first responder so it will respond to arrow key presses. - Revised
MasterSplitItemViewController
by adding thecurrentTabItemSelectElementAction()
method, and revisedElementPathControlManager
to use it in themenuNeedsUpdate(_:)
delegate method to set the current element viewâsselectElement(_:)
as the action method for pop-up menu items. - Saved a snapshot of build version 48.
- Commited Source Control.
##2018-11-23 (3.0.0 build 49)
Implement right-click contextual menu in the list view.
- Changed the Projectâs Versioning (Current Project Version or
CURRENT_PROJECT_VERSION
) to 49. - Created the
ListTableView
subclass ofNSTableView
and implemented an override ofNSTableView
menu(for:)
to create a contextual menu automatically and set its delegate toListTabItemViewController
when the user right-clicks or Control-clicks the list view. - Revised
ListTabItemViewController
to declare that it conforms to theNSMenuDelegate
protocol. - Revised
ListTabItemViewController
by adding themenuNeedsUpdate(_:)
,menu(_:willHighlight:)
andmenuWillClose(_:)
NSMenuDelegate methods to handle the contextual menu. - Revised
ListTabItemViewController
by implementing themenuWasDismissed()
@objc method and performing after a delay in themenuDidClose(_:)
delegate method to determine whether the user dismissed the contextual menu without selecting a UI element. - Revised
ListTabItemViewController
by implementing theselectElementWithContextMenu(_:)
action method. - Revised
ElementDataModel
nodesAt(level:)
and one other to return nil if level is out of range. - Saved a snapshot of build version 49.
- Commited Source Control.
2018-12-01 (3.0.0 build 50)
Implement the updateNeedsDisplay and selectionWasUpdated flags to manage selections, data model updates and their display in the list view.
- Changed the Projectâs Versioning (Current Project Version or
CURRENT_PROJECT_VERSION
) to 50. - Revised the
ListTabItemViewController
selectElement(_:)
action method by updating the dataSource for the final selection, to make sure the dataSource is always correct after an element is selected because updates during menu navigation do not update it when the mouse is moved to the left to a shallower level. - Revised
ElementDataModel
and other classes by renaming theupdateIsPending
instance property asupdateNeedsDisplay
. - Revised
ListTabItemViewController
showView()
by settingupdateNeedsDisplay
to false instead of true. - Revised
ListTabItemViewController
upddateView()
by settingupdateNeedsDisplay
to false. - Revised
ListTabItemViewController
by declaring theselectionWasUpdated
instance property and initializing it to false, setting it to true inupdateView()
,showView()
,clearView()
,selectElement(_:)
andselectElementWithContextMenu(_:)
, and testing it and setting it to false in thetableViewSelectionDidChange(_:)
delegate method. - Saved a snapshot of build version 50.
- Commited Source Control.
2018-12-02 (3.0.0 build 51)
Implement a toolbar for the main content view controls.
- Changed the Projectâs Versioning (Current Project Version or
CURRENT_PROJECT_VERSION
) to 51. - Revised Main.storyboard by dragging a toolbar from the library to the
MainWindowController
scene, set its Display to Icon Only, not Customizable and no Separator, and set its Size to Small. - Copied and pasted the Target pop-up menu, Activate button, Accessibility checkbox and Split view button into the Allowed Toolbar Items area of the toolbar controller; removed the default Colors, Fonts and Print toolbar items, and dragge the 4 new items into the Default area.
- Resized the container view in the Main Content View Controller scene to fill it to the top, remove the 4 controls left underneath, and changed the Top Space constraint from 8 below the Target Pop Up Menu to Superview.
- Revised
MainWindowController
by moving the 4 tool bar controls IBOutlet declarations fromMainContentViewController
because the toolbar is in the main window area outside of its main content view. - Revised
MainContentViewController
and extension references to the 4 controls by addingMainWindowController.sharedInstance
to the reference path. - Revised
MainContentViewController
by moving thetargetPopUpButton
initialization code fromviewDidLoad()
toviewWillAppear()
to it is called afterMainWindowController
initializes its sharedInstance property inwindowDidLoad()
. - Saved a snapshot of build version 51.
- Commited Source Control.
2018-12-03 (3.0.0 build 52)
Modernize the layout of the master and detail split views.
- Changed the Projectâs Versioning (Current Project Version or
CURRENT_PROJECT_VERSION
) to 52. - Revised Main.storyboard by changing the constraints on the master and detail split item container views and the Browser, Outline and List Tab Item views to eliminate gaps around the edges of the window.
- Revised Main.storyboard by setting the Detail Tab View Controller scene Style to Tabs on Top instead of Unspecified, to eliminate the border around the edge and the dark background.
- Saved a snapshot of build version 52.
- Commited Source Control.
2018-12-03 (3.0.0 build 53)
Continue Implementing OutlineTabItemViewController.
- Changed the Projectâs Versioning (Current Project Version or
CURRENT_PROJECT_VERSION
) to 53. - Revised
OutlineTabItemViewController
by declaring theelementPathControlManager
instance property and initializing it. - Revised
OutlineTabItemViewController
by delaring theselectionWasUpdated
instance property and initializing it. - Revised
OutlineTabItemViewController
by declaring theoutlinePathControl
IBOutlet and connected it in Main.storyboard. - Revised
OutlineTabItemViewController
viewDidLoad()
by setting the font size of the path control. - Revised
OutlineTabItemViewController
updateView()
,showView()
,clearView()
,popUpPathControlMenu(_:) and selectElement(_:)
, by adapting them fromListTabItemViewController
. - Revised
OutlineTabItemViewController
by implementing theoutlineView(_;child:ofItem:)
,outlineView(_:isItemExpandable:)
,outlineView(_:numberOfChildrenOfItem:)
andoutlineView(_:objectValueFor:byItem:)
NSOutlineViewDataSource
methods. - Revised
OutlineTabItemViewController
by declaring that it conforms to theNSOutlineDelegate
protocol - Revised Main.storyboard by connecting the outline viewâs delegate outlet and disconnecting its action method.
- Revised
OutlineTabItemViewController
viewDidLoad() by callingelementOutline.reloadData()
per AppleâsNSOutlineView
documentation. - Revised
OutlineTabItemViewController
outlineView(_:numberOfChildrenOfItem:)
by returning 0 if the data source is empty per AppleâsNSOutlineView
documentation. - Saved a snapshot of build version 53.
- Commited Source Control?
2018-12-06 (3.0.0 build 54)
Fix Detail Tab View tabs in Main.storyboard.
- Changed the Projectâs Versioning (Current Project Version or
CURRENT_PROJECT_VERSION
) to 54. - Revised Main.storyboard in numerous ways to make the detail tab view look better.
- Saved a snapshot of build version 54.
- Commited Source Control.
2018-12-06 (3.0.0 build 55)
Continue Implementing OutlineTabItemViewController.
- Changed the Projectâs Versioning (Current Project Version or
CURRENT_PROJECT_VERSION
) to 55. - Revised
ListTabItemViewController
viewDidLoad()
to callelementList.reloadData()
and thenumberOfRows(in:)
NSTableViewDataSource
method per AppleâsNSTableView
documentation, to match similar code inOutlineTabItemViewController
viewDidLoad()
and theoutlineView(_:numberOfChildrenOfItem:)
NSOutlineViewDataSource
method per AppleâsNSOutlineView
documentation. - Revised
OutlineTabItemViewController
updateView()
to expand the first row to show the children of the selected root application UI element. - Revised
OutlineTabItemViewController
showView()
to expand all rows in the selection path to show their siblings and children. - Revised
OutlineTabItemViewController
clearView()
. - Revised
ListTabItemViewController
updateView()
,showView()
andclearView()
to correspond to the new execution flow in the correspondingListTabItemViewController
methods. - Revised
ListTabItemViewController
viewDidLoad()
by settingselectionWasUpdated
to true before callingreloadData()
, as inOutlineTabItemViewcontroller
. - Globally changed
selectionWasUpdated
instance property toselectionDeclinesDisplay
. - Saved a snapshot of build version 55.
- Commited Source Control.
2018-12-08 (3.0.0 build 56)
Reverse order of subviews in master split item view controller.
- Changed the Projectâs Versioning (Current Project Version or
CURRENT_PROJECT_VERSION
) to 56. - Revised Main.storyboard by moving the master tab view to the bottom of the master split view, reversing the top-to-bottom order of the two rows of controls now at the top of the master split view, reversing the top-to-bottom order of the Keystrokes and Screen Reader buttons, and changing the split view divider to the default thick divider
- Saved a snapshot of build version 56.
- Commited Source Control.
2018-12-08 (3.0.0 build 57)
Continue Implementing OutlineTabItemViewController.
- Changed the Projectâs Versioning (Current Project Version or
CURRENT_PROJECT_VERSION
) to 57. - Revised Main.storyboard by connecting the outline view path control IBAction to the
OutlineTabItemViewController
. - Revised
MasterSplitItemViewController
currentTabItemSelectElementAction()
by uncommenting and revising theMasterTabViewItemIndex.Outline.rawValue
case to return theOutlineTabItemViewController
selectElement(_:)
action selector. - Revised
OutlineTabItemViewController
selectElement(_:)
by changing the @IBAction attribute to @objc because its selector is connected to path control pop-up menu items using a #selector expression. - Revised
OutlineTabItemViewController
selectElement(_:)
by adopting the node-based technique used inshowView()
to set theselectedRow
local variable by getting the row of the selected item. - Revised
ElementPathControlManager
updateRowSelection(for:at:)
by adopting the node-based technique used in showView() to accommodate outline view row numbering and click at any level. - Note: still need to work on
ElementPathControlManager
updateRowSelection(for:at:)
and add code to handle expansion of outline row. - Saved a snapshot of build version 57.
- Commited Source Control.
2018-12-11 (3.0.0 build 58)
Finish implementing OutlineTabItemViewController
and ListTabItemViewController
methods to select a new element and to use the outlineViewSelectionDidChange(_:)
and tableViewSelectionDidChange(_:)
delegate methods only to handle data source update and path control display for mouse and keyboard row selection.
- Changed the Projectâs Versioning (Current Project Version or
CURRENT_PROJECT_VERSION
) to 58. - Renamed the
ListTableView
class and all references to it toListTabItemTableView
. - Renamed the
selectionDeclinesDisplay
flag toselectionNeedsUpdate
and reversed the Boolean logic. - Revised
ListTabItemTableView
to implement overrides ofNSResponder
mouseDown(with:)
andkeyDown(with:)
and of theNSStandardKeyBindingResponding
protocol methodsmoveUp(_:)
andmoveDown(_:)
, to set theselectionNeedsUpdate
flag to true when the user selects a new row using the mouse or keyboard. - Created
OutlineTabItemOutlineView
, and revised it to implement overrides ofNSResponder
mouseDown(with:)
andkeyDown(with:)
and of theNSStandardKeyBindingResponding
protocol methodsmoveUp(_:)
andmoveDown(_:)
, to set theselectionNeedsUpdate
flag to true when the user selects a new row using the mouse or keyboard. - Revised
ListTabItemViewController
updateView()
,showView()
andclearView()
to set theupdateNeedsDisplay
andselectionNeedsUpdate
flags before calls toreloadData()
trigger thetableViewSelectionDidChange(_:)
delegate method, and revised theselectElement(_:)
andselectElementWithContextMenu(_:) action methods to eliminate the unneeded second setting of the
selectionNeedsUpdate` flag. -
RevisedOutlineTabItemViewController
updateView()
,showView()
andclearView()
to set theupdateNeedsDisplay
andselectionNeedsUpdate
flags before calls toreloadData()
trigger theoutlineViewSelectionDidChange(_:)
delegate method, and revised theselectElement(_:)
action method to eliminate the unneeded second setting of theselectionNeedsUpdate
flag. - Revised
OutlineTabItemViewController
datasource and delegate methods to use cleaner code. - Revised
ListTabItemViewController
datasource method to use cleaner code. - Saved a snapshot of build version 58.
- Commited Source Control.
2018-12-13 (3.0.0 build 59)
Continue fixing problems in OutlineTabItemViewController
.
- Changed the Projectâs Versioning (Current Project Version or
CURRENT_PROJECT_VERSION
) to 59. - Revised
ElementPathControlManager
updateRowSelection(for:at:)
by renaming itupdateSelection(for pathControl: NSPathControl, atLevel selectedLevel: Int, index selectedIndex: Int)
and changing the code so it will work in outline view, where the level can be changed using the mouse or keyboard, as well as in list view, where it cannot. - Revised the
OutlineTabItemViewController
selectElement(_:)
action method. - Revised
ElementDataModel
so it does not inherit fromNSObject
, and changed its initializer so it is not an override method. - Saved a snapshot of build version 59.
- Commited Source Control.
2018-12-20 (3.0.0 build 60)
Fix the OutlineTabItemViewController selectElement(_ action method.
- Changed the Projectâs Versioning (Current Project Version or
CURRENT_PROJECT_VERSION
) to 60. - Revised the
OutlineTabItemViewController
selectElement(_:)
action method by collapsing the outline before expanding the new selection path. - Saved a snapshot of build version 60.
- Commited Source Control.
2018-12-21 (3.0.0 build 61)
Continue fixing problems in OutlineTabItemViewController
.
- Changed the Projectâs Versioning (Current Project Version or
CURRENT_PROJECT_VERSION
) to 61. - Revised
ElementDataModel
childNode(ofParentNode:atChildIndex:)
method to return an empty node if the child nodes have not yet been added to the data model, so clients can use this to test whether the child nodes need to be added. - Revised
OutlineTabItemViewController
by implementing theoutlineView(_:shouldExpandItem:)
NSOutlineViewDelegate
method to update the data model by adding the child nodes to be displayed if necessary, by callingElementDataModel
updateDataModelForExpandedElementAt(level:index:)
. - Revised
ElementDataModel
by implementing theupdateDataModelForExpandedElementAt(level:index:)
method to add child nodes for display when an outline row is expanded. - Revised
OutlineTabItemViewController
by changingoutlineView(_:shouldExpandItem:)
tooutlineViewItemWillExpand(_:)
. - Saved a snapshot of build version 61.
- Commited Source Control.
2019-02-25 (3.0.0 build 62)
Finish fixing problems in OutlineTabItemViewController
.
- Changed the Projectâs Versioning (Current Project Version or
CURRENT_PROJECT_VERSION
) to 62. - Revised
OutlineTabItemViewController
outlineViewSelectionDidChange(_:)
to collapse the current selection path and expand the new selected item. - Revised
OutlineTabItemViewController
outlineViewItemWillExpand(_:)
to collapse the current selection path and select the new expanded item. - Revised ElementDataModel.swift by deleting
updateDataModelForExpandedElementAt(level:index:)
. - Revised
BrowserTabItemViewController
,OutlineTabItemViewController
andListItemViewController
by rewriting their respectiveshowView()
methods. - Revised
OutlineTabItemViewController
showView()
,selectElement(_:)
,outlineViewSelectionDidChange(_:)
to prevent call tooutlineViewItemWillExpand(_:)
delegate method. - Saved a snapshot of build version 62.
- Commited Source Control.
2019-03-04 (3.0.0 build 63)
Implement performIgnoringDelegate(_:with:)
to perform selector without triggering the receiverâs delegate method.
- Changed the Projectâs Versioning (Current Project Version or
CURRENT_PROJECT_VERSION
) to 63. - Revised
OutlineTabItemViewController
by implementingperformIgnoringDelegate(_:with:)
and calling it inpopUpPathControlMenu(_:)
andselectElement(_:)
to peformexpandItem(_:)
. - Saved a snapshot of build version 63.
- Commited Source Control.
2019-03-07 (3.0.0 build 64)
Remove the needsRestoreFromCache
flag in favor of savedCurrentIndexPath
object.
- Changed the Projectâs Versioning (Current Project Version or
CURRENT_PROJECT_VERSION
) to 64. - Revised ElementDataModel.swift by renaming private var
cachedCurrentIndexPath
tosavedCurrentElementIndexPath
. - Renamed
cacheDataModel(_:)
tosaveCurrentElementIndexPath(_:)
andrestoreDataModel(_:)
torestoreCurrentElementIndexPath(_:)
throughout. - Changed
savedCurrentElementIndexPath
to an optional in order to use its nil value as a flag in place of theneedsRestoreFromCache
Boolean flag variable. - Revised
restoreCurrentElementIndexPath
by settingsavedCurrentElementIndexPath
to nil at the end. - Replaced all uses of the
needsRestoreFromCache
Boolean flag variable to testing thesavedCurrentElementIndexPath
for nil. - Deleted the
needsRestoreFromCache
Boolean flag variable throughout. - Saved a snapshot of build version 64.
- Commited Source Control.
2019-03-07 (3.0.0 build 65)
Rename the selectionNeedsUpdate
flag to isManualSelection
and simplify its use, and remove the updateNeedsDisplay flag because unused.
- Changed the Projectâs Versioning (Current Project Version or
CURRENT_PROJECT_VERSION
) to 65. - Renamed selectionNeedsUpdate to isManualSelection throughout.
- Revised OutlineTabItemViewController and ListTabItemViewController by setting isManualSelection to false after testing it in the outlineViewSelectionDidChange( and tableViewSelectionDidChange( delegate methods.
- Deleted all other statements setting the isManualSelection flag to false.
- Deleted all references to the updateNeedsDisplay flag.
- Saved a snapshot of build version 65.
- Commited Source Control.
2019-03-07 (3.0.0 build 66)
Scroll selected outline and table rows into view.
- Changed the Projectâs Versioning (Current Project Version or
CURRENT_PROJECT_VERSION
) to 66. - Revised
ListTabItemViewController
showView()
,selectElement(_:)
, andselectElementWithContextMenu(_:)
by callingelementList.scrollRowToVisible()
. - Revised
OutlineTabItemViewController
showView()
,selectElement(_:)
, andoutlineViewItemWillExpand(_:)
by callingelementList.scrollRowToVisible()
. - Saved a snapshot of build version 66.
- Commited Source Control.
2019-03-08 (3.0.0 build 67)
Add attribute columns to the list view.
- Changed the Projectâs Versioning (Current Project Version or
CURRENT_PROJECT_VERSION
) to 67. - Revised the Main.storyboard List Tab Item View Controller Scene table view by making its first column narrower, setting the Columns count to 6, turning on Headers, setting Column Sizing to Uniform, turning on Alternating Rows, setting Vertical Grid to Solid, entering Header Titles âRoleâ, âSubroleâ, âIndexâ, âTitleâ, âTypeâ, and âHelpâ, setting Size to Small, and revised each column by setting their identifiers to role, subrole, index, title, type, and help, turning off Editable, setting the min and max width of the Index column to 50, and setting the min and max width of each remaining column to 80 or 70, and setting the index columnâs table view cell alignment to right aligned.
- Revised the
ListTabItemViewController
tableView(_:viewFor:row:)
delegate method to display the contents of the new columns. - Saved a snapshot of build version 67.
- Commited Source Control.
2019-03-09 (3.0.0 build 68)
Add attribute columns to the outline view.
- Changed the Projectâs Versioning (Current Project Version or
CURRENT_PROJECT_VERSION
) to 68. - Revised the Main.storyboard Outline Tab Item View Controller Scene outline view by making its first column narrower, setting the Columns count to 6, turning on Headers, setting Column Sizing to Uniform, turning on Alternating Rows, setting Vertical Grid to Solid, entering Header Titles âRoleâ, âSubroleâ, âIndexâ, âTitleâ, âTypeâ, and âHelpâ, setting Size to Small, and revised each column by setting their identifiers to role, subrole, index, title, type, and help, turning off Editable, setting the min and max width of the Index column to 50, and setting the min and max width of each remaining column to 80 or 70, and setting the index columnâs table view cell alignment to right aligned.
- Revised the
OutlineTabItemViewController
outlineView(_:viewFor:item:)
delegate method to display the contents of the new columns. - Declared
OutlineTabItemViewController
TableColumnIdentifiers
struct for use in the delegate method. - Revised
ListTabItemViewController
by declaring theTableColumnIdentifiers
struct and revising thetableView(_:viewFor:row:)
delegate method for use in the delegate method. - Saved a snapshot of build version 68.
- Commited Source Control.
2019-03-10 (3.0.0 build 69)
Conform the browser view controller to the outline and list view controllers.
- Changed the Projectâs Versioning (Current Project Version or
CURRENT_PROJECT_VERSION
) to 69. - Revised
BrowserTabItemViewController
showView()
to scroll the selected row to visible. - Revised
BrowserTabItemViewController
updateView()
,showView()
andclearView()
to scroll the last column into view instead of the selected column, so the selected columnâs children will be visible. - Revised
BrowserTabItemViewController
by deletingbrowser(_:willDisplayCell:atRow:column:)
,browserWillScroll(_:)
andmodifiedObjectValueForCell(_:atRow:column:)
because no longer needed. - Revised
BrowserTabItemViewController
browser(_:titleOfColumn:)
to add âân childrenâ instead of â(n)â at end of title - Revised
ElementDataModel
fullNaturalDescription(ofElement:atIndexPath:)
andfullRawDescription(ofElement:atIndexPath:)
to add only the index in parentheses at the end of the description, removing the level - Saved a snapshot of build version 69.
- Commited Source Control.
2019-03-10 (3.0.0 build 70)
Add a path control to the browser view.
- Changed the Projectâs Versioning (Current Project Version or
CURRENT_PROJECT_VERSION
) to 70. - Revised Main.storyboard Browser Tab Item View Controller Scene by lowering the top of the browser view, adding a path control from the library, adding constraints to all 4 sides and adding a Height constraint of 20 and setting the Placeholder to âNo Targetâ.
- Revised all 3 Main.storyboard Tab Item View Controller Scenes by setting the path control background color to Control Background Color.
- Revised
BrowserTabItemViewController
viewDidLoad()
by setting the background color of the browser view title area tocontrolBackgroundColor
to match the header cell background color of the outline and list views. - Revised
BrowserTabItemViewController
by adding anelementPathControlManager
instance variable and creating the path control. - Revised
BrowserTabItemViewController
by adding abrowserPathControl
outlet and connecting it in Main.storyboard. - Revised
BrowserTabItemViewController
viewDidLoad()
by setting the font of the path control to smallSystemFontSize for the placeholder. - Revised
BrowserTabItemViewController
updateView()
,showView()
andclearView()
adding code to update the path control. - Revised
BrowserTabItemViewController
by adding apopUpPathControlMenu(_:)
action method and connecting it to first responder in Main.storyboard. - Revised
MasterSplitItemViewController
currentTabItemSelectElementAction()
by implementing the switch case for the browser view. - Revised
BrowserTabItemViewController
selectElement(_:)
by changing its sender parameter type to Any and adding branch tests to distinguish between browser and path control menu item. - Revised Main.storyboard by connecting
popUpPathControlMenu(_:)
action method to Browser Tab Item View Controller Scene path control. - Revised
BrowserTabItemViewController
selectElement(_:)
by filling in the menu item branch. - Revised the
BrowserTabItemViewController
browser(_:numberOfChildrenOfItem:)
,browser(_:child:ofItem:)
,browser(_:isLeafItem:)
andbrowser(_:objectValueForItem:)
delegate methods to use the better code model inOutlineTabItemViewController
. - Revised
BrowserTabItemViewController
,outlineTabItemViewController
and RevisedlistTabItemViewController
selectElement(_:)
methods andlistTabItemViewController
selectElementWithContextMenu(_:)
to callshowView()
once the data model is updated. - Revised
BrowserTabItemViewController
,outlineTabItemViewController
and RevisedlistTabItemViewController
viewDidLoad()
to set the path control placeholder text attributes. - Revised all 3 Main.storyboard Tab Item View Controller Scenes by setting the path controlâs Focus Ring to None.
- Saved a snapshot of build version 70.
- Commited Source Control.
2019-03-14 (3.0.0 build 71)
Implement application icon and Credits for About box.
- Changed the Projectâs Versioning (Current Project Version or
CURRENT_PROJECT_VERSION
) to 71. - Built and archived as executable release a1 for testing by Michael Tsai.
- Updated Info.plist Copyright (human-readable) to end in 2019.
- Updated InfoPlist.strings
NSHumanReadableCopyright
to end in 2019. - Revised Main.storyboard by rearranging the application menu to include Check for Updates⊠menu, License menu, Registration menu with Online Store and Enter Key⊠submenus, and System Preferences⊠menu.
- Revised Assets.xcassets by adding wide appicon png images to the AppIcon to form working application icon for application and About box Credits file.
- Added Credits.rtf file from UI Browser 2.9.0 and revised text.
- Saved a snapshot of build version 71.
- Commited Source Control.
2019-03-21 (3.0.0 build 72)
Clean up authorizing access with System Preferences menu item.
- Changed the Projectâs Versioning (Current Project Version or
CURRENT_PROJECT_VERSION
) to 72. - Revised Main.storyboard by renaming UI Browser > System Preferences⊠menu item to Accessibility ListâŠ
- Revised AppDelegate by implementing the
openAccessibilityList(_:)
action method and connecting it to the UI Browser > Accessibility List⊠menu item. - Revised Main.storyboard by fixing Accessibility checkbox to Check and Switch.
- Moved development to macOS 10.14.4 Mojave and Xcode 10.2.
- Built and ran successfully.
- Saved a snapshot of build version 72.
- Commited Source Control.
2019-03-26 (3.0.0 build 73)
Convert to Swift 5.
- Changed the Projectâs Versioning (Current Project Version or
CURRENT_PROJECT_VERSION
) to 73. - Add ListTabItemTableView.swift to Source Control.
- Validated project settings and migrated localization from âEnglish.lprojâ.
- Committed Source Control
- Converted the Target to Current Swift Syntax (Swift 5) â no source changes required.
- Revised
MainContentViewController
(in TargetMenuExtension.swift) by adding an @unknown default case to the switch statement inupdateTargetMenu(_:)
at recommendation of compiler. - Changed the Projectâs Swift Compiler - Language (Swift Language Version or SWIFT_VERSION) to Swift 5.
- Built and ran successfully.
- Saved a snapshot of build version 73.
- Commited Source Control.
2019-03-27 (3.0.0 build 74)
Move handling of main windowâs toolbar into the ToolbarExtension and other extensions on MainWindowController
from MainContentViewController
.
- Changed the Projectâs Versioning (Current Project Version or
CURRENT_PROJECT_VERSION
) to 74. - Created ToolbarExtension.swift as an extension on
MainWindowController
. - Revised
TargetMenuExtension
,ActivateButtonExtension
,AccessibilityCheckboxExtension
andDetailButtonExtension
by making them extensions onMainWindowController
instead ofMainContentViewController
. - Revised
MainContentViewController
by moving thedidChangeAccessStatus(_:)
notification method in from TargetMenuExtension.swift, and by revisingviewDidLoad()
accordingly. - Revised
MainWindowController
by moving thetargetPopUpButton
configuration code intowindowDidLoad()
fromMainContentViewController
viewWillAppear()
. - Revised
MainContentViewController
updateApplication(forNewTarget:usingTargetElement:)
by updating the call toupdateWindowTitle()
which was moved toMainWindowController
. - Revised TargetMenuExtension.swift throughout by revising references to properties and methods in
MainContentViewController
to accommodate makingTargetMenuExtension
an extension onMainWindowController
instead ofMainContentViewController
. - Revised AppDelegate
menuNeedsUpdate(_:)
to set var controller to MainWindowController.sharedInstance. - Revised Main.storyboard by changing the toolbar itemsâ view classes from
ValidatedButton
back to their originalNSButton
orNSPopUpButton
. - Revised
MainContentViewController
by declaring themainwindowController
instance property, setting it lazily, and substituting it forMainWindowController.sharedInstance
throughout. - Revised
MainWindowController
and its extensions by declaring themainContentVewController
instance property, setting it lazily, and substituting it forMainContentViewController.sharedInstance
throughout. - Revised Main.storyboard by making Accessibility button Bordered to give it white background color with rounded edges to match toolbar item user interface guidelines.
- Revised
DetailButtonExtension
ofMainWindowController
by removing thesetDetailButtonColor()
method, and revisedMainContentViewController
by removing the call tosetDetailButtonColor()
from thesystemTinitDidChange(_:)
notification method, so that the Detail button can display a simple disclosure button with a chevron instead of the detail toggle images in Assets.xcassets - Revised Main.storyboard by making Detail button a Disclosure On Off button Bordered to give it a white background color with rounded edges to match toolbar item user interface guidelines.
- Revised
DetailButtonExtension
ofMainWindowController
by rewriting thetoggleDetailSplitItem(_:)
action method to expand or collapse the detail split view item based on the current state of the button instead of simply toggling it. - Revised Main.storyboard by moving Float checkbox from main content view to right end of toolbar left of Detail button and making it a Push On Push Off button.
- Revised Main.storyboard by moving Accessibility checkbox from right to center of toolbar and setting its title to Allow Access⊠(to be changed to Deny Access⊠with validation).
- Revised Main.storyboard by renaming application menuâs Accessibility List⊠menu item to Set AccessâŠ
- Revised Main.storyboard by removing View > Customize Toolbar⊠menu item.
- Revised
ElementDataModel
updateDataModel(forSystemWideElement:)
by adding call at end toupdateDataModelForCurrentElementAt(leel: 0, index: 0)
on model ofupdateDataModel(forApplicationElement:)
. [IS THIS NEEDED?] - Revised
MainContentViewController
updateApplication(forNewTarget:usingTargetElement:)
by adding code to set thecurrentElementData
instance property to display the Target menuâs title and the windowâs title when the SystemWide target is chosen. - Revised
MainWindowController
(in TargetMenuExtension.swift)updateTargetPopUpButtonTitle()
andupdateWindowTitle()
to display the Target menuâs title and the windowâs title when the SystemWide target is chosen. - Revised Main.storyboard by reorganizing and rewording the View menu in the menubar and adding Activate Target, Expand Detail View and Show Keystroke menu items to the menu barâs View menu, and by adding a Report button to the master split item view.
- Revised
MainWindowController
by declaring that it conforms toNSMenuDelegate
, and removed declaration of conformance fromMainContentViewController
. - Revised
MainWindowController
windowDidLoad()
to declareMainWindowController
as the delegate oftargetPopUpButton
, so themenuDidClose(_:)
delegate method (in TargetMenuExtension.swift) is called if access is disabled. - Removed AppDelegate
menuDidClose(_:)
delegate method because it gets called while the request access alert is already open or after it is dismissed for unknown reasons, causing duplicate alerts. TheMainWindowController
(in TargetMenuExtension.swift)menuDidClose(_:)
delegate method is still used because it works properly. - Built and ran successfully.
- Saved a snapshot of build version 74.
- Commited Source Control.
2019-04-14 (3.0.0 build 75)
Implement toolbar item validation.
- Changed the Projectâs Versioning (Current Project Version or
CURRENT_PROJECT_VERSION
) to 75. - Revised
MainWindowController
(in ActivateButtonExtension.swift) by removing feedback from theactivateTarget(_:)
action method. - Revised ToolbarExtension.swift by renaming it MainToolbarItem.swift, and by implementing the
MainToolbarItem
subclass ofNSToolbarItem
and overridingvalidate()
, which is called automatically because its Autovalidates setting in Main.storyboard is on by default. - Revised Main.storyboard by setting the class of the Target, Activate, Accessibility, _______ toolbar items to MainToolbarItem, and by setting the tags of all of the toolbar items.
- Revised AccessibilityCheckboxExtension.swift by renaming it AccessibilityButtonExtension.swift.
- Revised MainWindowController by adding the floatButton IBOutlet and connecting it in Main.storyboard.
- Revised
MasterSplitItemViewController
by deleting the floatButton IBOutlet, and revised Main.storyboard by removing the Float checkbox. - Built and ran successfully.
- Saved a snapshot of build version 75.
- Commited Source Control.
2019-04-14 (3.0.0 build 76)
Clean up implementation of the NSUserInterfaceValidations
and NSValidatedUserInterfaceItem
protocols for the reportButton.
- Changed the Projectâs Versioning (Current Project Version or
CURRENT_PROJECT_VERSION
) to 76. - Revised MasterSplitItemViewController by declaring the reportButton IBOutlet, connected it in Main.storyboard, and set its class to ValidatedButton in Main.storyboard.
- Created new file ReportButtonExtension.swift, implemented the ReportButton extension on
MainContentViewController
, implemented a temporary dummyshowReport(_:)
action method, and connected it in Main.storyboard. - Created new file ValidatedControlProtocol.swift, and implemented the ValidatedControl subprotocol of
NSValidatedUserInterfaceItem
and the ValidatedButton subclass of NSButton, conforming it to ValidatedControl by implementing thevalidate()
protocol method. - Revised
MainContentViewController
by revising implementations ofupdateValidatedControls()
andvalidateUserInterfaceItem(_:)
to work with the new reportButton action. - Built and ran successfully.
- Saved a snapshot of build version 76.
- Commited Source Control.
2019-04-16 (3.0.0 build 77)
Implemented the UserControlValidations
subprotocol of NSUserInterfaceValidations
and the ValidatedUserControlItem
protocol and applied them to the reportButton.
- Changed the Projectâs Versioning (Current Project Version or
CURRENT_PROJECT_VERSION
) to 77. - Revised
MainContentViewController
by renaming thevalidateControls()
method asvalidateUserControls()
and revisedMainWindowController
windowDidUpdate(_:)
to call it by its new name. - Renamed the ValidatedControlProtocol.swift file as UserControlValidations.swift, and changed the required
UserControlValidations
protocol method fromvalidate()
tovalidateUserControl(_ item: NSControl)
â Bool. - Revised UserControlValidations.swift by renaming the
ValidatedUserControl
protocol asValidatedUserControlItem
, and by changing the requiredValidatedUserControlItem
protocol method fromvalidate()
toupdate()
(in addition to the action and target methods required by the parentNSUserInterfaceValidations
protocol). - Revised
MainContentViewController
by declaring conformance to theUserControlValidations
protocol and removing conformance to theNSUserInterfaceValidations
protocol. - Revised
MainContentViewController
validateUserControls()
to call the renamedupdate()
method onMasterSplitItemViewController
views that conform to theValidatedUserControlItem
protocol. - Revised
MainContentViewController
by callingvalidateUserControl(_:)
instead ofvalidateUserInterfaceItem(_:)
. - Revised UserControlValidations.Swift validatedButton update() method to call
MainContentViewController
validateUserControl(_:)
, and to callvalidateUserInterfaceItem(_:)
in case any user controls implement it. - Revised ReportButtonExtension.swift to declare an extension on
MasterSplitItemViewController
instead ofMainContentViewController
for theshowReport(_:)
action method. - Revised MasterSplitItemViewController.swift by moving the
validateUserControlItem(_:)
validation method in fromMainContentViewController
and declaring it as conforming to theUserControlValidations
protocol. - Revised Main.storyboard by setting the class of the Report button to NSButton instead of ValidatedButton.
- Built and ran successfully.
- Saved a snapshot of build version 77.
- Commited Source Control.
2019-04-17 (3.0.0 build 78)
Applied the UserControlValidations
subprotocol of NSUserInterfaceValidations
and the ValidatedUserControlItem
protocol and applied them to the remaining user controls in the master split view item controller.
- Changed the Projectâs Versioning (Current Project Version or
CURRENT_PROJECT_VERSION
) to 78. - Moved development to Xcode 10.2.1.
- Revised
UserControlValidations
ValidatedButton
to implement an override ofawakeFromNib()
to observeNSWindow.didUpdateNotification
on the model of Erik M. Buck and Donald A. Yacktman, âCocoa Design Patternsâ (Addison Wesley 2010), pp. 228-29, revisedMainWindowController
by removing thewindowDidUpdate(_:)
delegate method andMainContentViewController
by removing thevalidateUserControls()
method because they are no longer needed to trigger validation. - Revised UserControlValidations.swift by renaming it UserControlValidation.swift and going back to declaring
validatedButton
as a subclass of NSButton instead of an extension, and revised Main.storyboard to set the class of NSButton controls in the master split item view to ValidatedButton, to make it possible to limit the Buck-Yacktman technique to buttons in the windowâs content view. - Revised UserControlValidation.swift by implementing a
ValidatedPopUpButton
subclass of NSPopUpButton, and revised Main.storyboard to set the class of NSPopUpButton controls in the master split item view toValidatedPopUpButton
. - Revised
MasterSplitItemViewController
by removing therefreshApplication(_:)
action method in anticipation of reimplementing it in RefreshApplicationButtonExtension.swift. - Renamed
AppleScriptPopDownButton
asAppleScriptPullDownButton
throughout. - Created extension files with stub action methods for the remaining user controls in the master split view item controller, and connected them in Main.storyboard:
HighlightCheckboxExtension
,FollowFocusCheckboxExtension
,ScreenReaderButtonExtension
,AppleScriptButtonExtension
,MasterTabViewSelectorExtension
,RefreshApplicationButtonExtension
,KeyStrokesButtonExtension
andTerminologyButtonExtension
. - Revised
MasterSplitItemViewController
validateUserControlItem(_:)
by adding cases for all of the new action methods in the master split view item controller. - Revised Main.storyboard to set the Enabled setting of those user controls in the main split item view that need to be disabled when a window first open with No Target selected.
- Revised the
MainContentViewController
didChangeAccessStatus(_:)
notification method by adding a call tosetWindowsNeedUpdate()
to trigger validation when access is changed in System Preferences or elsewhere behind the back of UI Browser. - Revised AccessButtonExtension.swift to make UI Browser stay active after dismissing an access changed sheet by registering to observe the
AccessAuthorizer
didDismissAccessAlertNotification
. - Revised AppDelegate
applicationWillFinishLaunching(_:)
by duplicating codes in AccessButtonExtension.swift to terminate System Preferences after the user grants or denies access. - Built and ran successfully.
- Saved a snapshot of build version 78.
- Commited Source Control.
2019-04-22 (3.0.0 build 79)
Fully implement the NSMenuItemValidation protocol for the toolbar itemsâ corresponding menu items.
- Changed the Projectâs Versioning (Current Project Version or
CURRENT_PROJECT_VERSION
) to 79. - Revised
MainWindowController
by imiplementing thevalidateMenuItem(_:)
NSMenuItemValidation
protocol method for the UI Browser > Grant Access menu item and declared thatMainWindowController
conforms to theNSMenuItemValidation
protocol. - Revised Main.storyboard by connecting the UI Browser > Grant Access menu item to First Responder for the
toggleAccess(_:)
action method. - Revised TargetMenuExtension.swift
updateTargetMenu(_:)
by adding code for the new Activate Target menu item, and revised Defines.swift to declare theACTIVATE_TARGET_MENU_ITEM_TITLE
constant. - Revised ActivateButtonExtension.swift by revising the
activateTarget(_:)
action method to restore the menu itemâs title to the current target application if the user chose the Target pop-up buttonâs Activate Target menu item. - Revised Main.storyboard by removing the View > Activate Target menu item.
- Revised MainWindow.swift by making MainWindow a subclass of NSPanel so it can float.
- Created FloatButtonExtension.swift as an extension on
MainWindowController
, implemented thefloat(_:)
action method, and revised Main.storyboard by connecting thefloat(_:)
action method to the Float button and the Window > Float menu item. - Revised
MainWindowController
validateMenuItem(_:)
to set the state of the Window > Float menu item based on whether the window is floating. - Revised the MainToolbarItem.swift validate() method to add a case for the float button to set its state based on whether the window is floating, and revised Main.storyboard to make the floating button a MainToolbarItem and set its tag to 3.
- renamed MailToolbarItem.swift as ValidatedToolbarItem.swift and renamed the subclass ValidatedToolbarItem.
- Revised AppDelegate
applicationWillFinishLaunching(_:)
by callingAccessAuthorizer
âs designated intializer instead of its convenience initializer, since making UI Browserâs main window a subclass of NSPanel forces AccessAuthorizer to present application-modal dialogs instead of document-modal sheets anyway. - Revised Main.storyboard to make the split viewâs divider thin instead of thick because it looks better.
- Built and ran successfully.
- Saved a snapshot of build version 79.
- Commited Source Control.
2019-04-25 (3.0.0 build 80)
Begin implementing the Outline view.
- Changed the Projectâs Versioning (Current Project Version or
CURRENT_PROJECT_VERSION
) to 80. - Revised the FloatButtonExtension.swift
float(_:)
action method to setisFloatingPanel
based on the state of the button instead of just togglingisFloatingPanel
. - Revised the HighlightCheckboxExtension.swift
highlight(_:)
action method to set⊠- Saved a snapshot of build version 80.
WORK INTERRUPTED TO COMPLETE UI Browser 2 2.9.0 for macOS Catalina 10.15.
2019-10-27 (3.0.0 build 81)
Set size of element browser to small programmatically, and remove NSBrowser+PFSmallBrowserAdditions
Objective-C category.
- Changed the Projectâs Versioning (Current Project Version or
CURRENT_PROJECT_VERSION
) to 81. - Moved development to macOS Catalina 10.15.0 (19A602) and Xcode 11.1 (11A1027).
- Allowed Xcode to switch to development signing and enable hardened runtime.
- Removed UIBrowser3-Bridging-Header.h and NSBrowser+PFSmallBrowserAdditions.h and .m Objective-C category files, because direct access to instance variables was deprecated in macOS Mojave 10.14. Apple announced in 2018 that it would block all use of private instance variables in a future release of macOS, and access was blocked in macOS Catalina 10.15; see my bug report 41209462 2018-06-18, now closed.
- Revised
BrowserTabItemViewController.viewDidLoad()
by deleting calls to the NSBrowser+PFSmallBrowserAdditions categoryâspfSetUsesSmallHorizontalScroller()
, pfSetUsesSmallColumnScrollers andpfSetUsesSmallTitleFont()
methods. - Revised
BrowserTabItemViewController.viewDidLoad()
by adding code setting elementBrowserâscontrolSize
to .small programmatically. Interface Builder still automatically switches back to Regular when attempting to set Size to Small or Mini. - Saved a snapshot of build version 81.
- Commited Source Control.
2019-10-27 (3.0.0 build 82)
Move development to Swift 5.1.
- Moved development to macOS Catalina 10.15.0 (19A602), Xcode 11.2 (11A1027) and Swift 5.1.
- Changed the Projectâs Deployment (macOS Deployment Target or
MACOSX_DEPLOYMENT_TARGET
) to macOS 10.15. - Changed the Projectâs Versioning (Current Project Version or
CURRENT_PROJECT_VERSION
) to 82. - Changed the Projectâs Versioning (Versioning System or VERSIONING_SYSTEM) to Apple Generic to match frameworks.
- Revised Credits.rtf by referring to the âcursorâ instead of the âmouseâ, by referring to macOS 10.15 as âCatalinaâ, and by stating that UI Browser requires macOS Catalina 10.15.
- Moved development to macOS Catalina 10.15.1 (19B88), Xcode 11.2 (11B52) and Swift 5.1.
- Moved development to Xcode 11.2.1 (11B500) and Swift 5.1.2.
- Moved development to macOS Catalina 10.15.2 (19C57), Xcode 11.3 (11C29) and Swift 5.1.3.
- Moved development to macOS Catalina 10.15.3 (19D76), Xcode 11.3.1 (11C505) and Swift 5.1.3.
- Changed copyright notices throughout to cover â-2020â.
- Built and ran successfully.
- Saved a snapshot of build version 82.
- Commited Source Control.
2020-02-17 (3.0.0 build 83)
Embed new framework versions supporting Swift 5.1 module stability and library evolution to facilitate eventual distribution of the built frameworks for use by developers of client applications or frameworks using different versions of Swift.
- Changed the Projectâs Versioning (Current Project Version or
CURRENT_PROJECT_VERSION
) to 83. - Incorporated PFAssistiveFramework4 4.0.0.17 and PFAccessibilityAuthorizer2 2.0.0.8.
- Built and ran successfully.
- Saved a snapshot of build version 83.
- Commited Source Control.
##2020-02-27 (3.0.0 build 84)
???
- Changed the Projectâs Versioning (Current Project Version or
CURRENT_PROJECT_VERSION
) to 84.
ISSUES:
- Detail Toggle Button in Toolbar does not toggle in response to dragging Detail Split Item collapsed or revealed. See builds 32, 39 and 74. It is named
detailToggleButton
where the color is set, but detailButton everywhere else. See MainSplitViewController: âA button can be bound to the isCollapsed property to collapse and reveal a split view, and a suitable bound detail buttonâs state can change automatically when the split view is collapsed and revealed by dragging.â Figure out how to do this when the button is a toolbar item in the toolbar. - Needs a minimum size.
- Michael Tsai encountered a problem where arrow-selecting and click-selecting both failed to auto-expand.
- Try to remove auto-collapse so outline view can be full powered.
- Implement multiple windows for different targets.
- try instantiating completely separate data model for each.
- Check AppleScript support in macOS 15 (/System/Library/Frameworks/Scripting.framework and /System/Library/Frameworks/AppKitScripting.framework are still 32-bit in Mojave).
- Explore compliance with VoiceOver, Dynamic Type and other accessibility technologies.
- Update to latest Paddle Framework (in Cocoa/eCommerce Registration Services/Paddle).