Repository: MrNoodle/NoodleKit Branch: master Commit: b124f51a9e89 Files: 83 Total size: 1.4 MB Directory structure: gitextract_0bvmvxp4/ ├── English.lproj/ │ └── InfoPlist.strings ├── Examples/ │ ├── ImageLab/ │ │ ├── English.lproj/ │ │ │ └── MainMenu.xib │ │ ├── ImageLab-Info.plist │ │ ├── ImageLabAppDelegate.h │ │ ├── ImageLabAppDelegate.m │ │ ├── Read Me.rtf │ │ ├── TimedImageView.h │ │ ├── TimedImageView.m │ │ ├── main.m │ │ └── test.tiff │ ├── LineNumberView/ │ │ ├── Controller.h │ │ ├── Controller.m │ │ ├── English.lproj/ │ │ │ ├── InfoPlist.strings │ │ │ └── MainMenu.xib │ │ ├── LineNumberView-Info.plist │ │ ├── MarkerLineNumberView.h │ │ ├── MarkerLineNumberView.m │ │ ├── Read Me.rtf │ │ └── main.m │ ├── ModalResponder/ │ │ ├── Controller.h │ │ ├── Controller.m │ │ ├── English.lproj/ │ │ │ ├── InfoPlist.strings │ │ │ └── MainMenu.xib │ │ ├── ModalResponder-Info.plist │ │ ├── Read Me.rtf │ │ └── main.m │ ├── StickyRowTableView Revue/ │ │ ├── Controller.h │ │ ├── Controller.m │ │ ├── English.lproj/ │ │ │ ├── InfoPlist.strings │ │ │ └── MainMenu.xib │ │ ├── Read Me.rtf │ │ ├── StickyRowTableView Revue-Info.plist │ │ └── main.m │ ├── TimerLab/ │ │ ├── English.lproj/ │ │ │ └── MainMenu.xib │ │ ├── Read Me.rtf │ │ ├── TimerLab-Info.plist │ │ ├── TimerLabAppDelegate.h │ │ ├── TimerLabAppDelegate.m │ │ └── main.m │ ├── Window Effects/ │ │ ├── Controller.h │ │ ├── Controller.m │ │ ├── English.lproj/ │ │ │ ├── InfoPlist.strings │ │ │ └── MainMenu.xib │ │ ├── Window Effects-Info.plist │ │ └── main.m │ └── iToonz/ │ ├── Controller.h │ ├── Controller.m │ ├── English.lproj/ │ │ └── MainMenu.xib │ ├── Read Me.rtf │ ├── iToonz-Info.plist │ └── main.m ├── Info.plist ├── NSImage-NoodleExtensions.h ├── NSImage-NoodleExtensions.m ├── NSIndexSet-NoodleExtensions.h ├── NSIndexSet-NoodleExtensions.m ├── NSObject-NoodlePerformWhenIdle.h ├── NSObject-NoodlePerformWhenIdle.m ├── NSResponder-NoodleModalExtensions.h ├── NSResponder-NoodleModalExtensions.m ├── NSTableView-NoodleExtensions.h ├── NSTableView-NoodleExtensions.m ├── NSTimer-NoodleExtensions.h ├── NSTimer-NoodleExtensions.m ├── NSWindow-NoodleEffects.h ├── NSWindow-NoodleEffects.m ├── NoodleCustomImageRep.h ├── NoodleCustomImageRep.m ├── NoodleGlue.h ├── NoodleGlue.m ├── NoodleIPhoneTableView.h ├── NoodleIPhoneTableView.m ├── NoodleKit.xcodeproj/ │ ├── project.pbxproj │ └── project.xcworkspace/ │ └── contents.xcworkspacedata ├── NoodleKit_Prefix.pch ├── NoodleLineNumberMarker.h ├── NoodleLineNumberMarker.m ├── NoodleLineNumberView.h ├── NoodleLineNumberView.m ├── NoodleTableView.h ├── NoodleTableView.m ├── README.md └── version.plist ================================================ FILE CONTENTS ================================================ ================================================ FILE: English.lproj/InfoPlist.strings ================================================ /* Localized versions of Info.plist keys */ ================================================ FILE: Examples/ImageLab/English.lproj/MainMenu.xib ================================================ 1060 10J869 823 1038.35 461.00 com.apple.InterfaceBuilder.CocoaPlugin 823 YES YES com.apple.InterfaceBuilder.CocoaPlugin PluginDependencyRecalculationVersion YES NSApplication FirstResponder NSApplication AMainMenu YES ImageLab 1048576 2147483647 NSImage NSMenuCheckmark NSImage NSMenuMixedState submenuAction: ImageLab YES About ImageLab 2147483647 YES YES 1048576 2147483647 Preferences… , 1048576 2147483647 YES YES 1048576 2147483647 Services 1048576 2147483647 submenuAction: Services YES _NSServicesMenu YES YES 1048576 2147483647 Hide ImageLab h 1048576 2147483647 Hide Others h 1572864 2147483647 Show All 1048576 2147483647 YES YES 1048576 2147483647 Quit ImageLab q 1048576 2147483647 _NSAppleMenu File 1048576 2147483647 submenuAction: File YES New n 1048576 2147483647 Open… o 1048576 2147483647 Open Recent 1048576 2147483647 submenuAction: Open Recent YES Clear Menu 1048576 2147483647 _NSRecentDocumentsMenu YES YES 1048576 2147483647 Close w 1048576 2147483647 Save s 1048576 2147483647 Save As… S 1179648 2147483647 Revert to Saved 2147483647 YES YES 1048576 2147483647 Page Setup... P 1179648 2147483647 Print… p 1048576 2147483647 Edit 1048576 2147483647 submenuAction: Edit YES Undo z 1048576 2147483647 Redo Z 1179648 2147483647 YES YES 1048576 2147483647 Cut x 1048576 2147483647 Copy c 1048576 2147483647 Paste v 1048576 2147483647 Paste and Match Style V 1572864 2147483647 Delete 1048576 2147483647 Select All a 1048576 2147483647 YES YES 1048576 2147483647 Find 1048576 2147483647 submenuAction: Find YES Find… f 1048576 2147483647 1 Find Next g 1048576 2147483647 2 Find Previous G 1179648 2147483647 3 Use Selection for Find e 1048576 2147483647 7 Jump to Selection j 1048576 2147483647 Spelling and Grammar 1048576 2147483647 submenuAction: Spelling and Grammar YES Show Spelling and Grammar : 1048576 2147483647 Check Document Now ; 1048576 2147483647 YES YES 2147483647 Check Spelling While Typing 1048576 2147483647 Check Grammar With Spelling 1048576 2147483647 Correct Spelling Automatically 2147483647 Substitutions 1048576 2147483647 submenuAction: Substitutions YES Show Substitutions 2147483647 YES YES 2147483647 Smart Copy/Paste f 1048576 2147483647 1 Smart Quotes g 1048576 2147483647 2 Smart Dashes 2147483647 Smart Links G 1179648 2147483647 3 Text Replacement 2147483647 Transformations 2147483647 submenuAction: Transformations YES Make Upper Case 2147483647 Make Lower Case 2147483647 Capitalize 2147483647 Speech 1048576 2147483647 submenuAction: Speech YES Start Speaking 1048576 2147483647 Stop Speaking 1048576 2147483647 Format 2147483647 submenuAction: Format YES Font 2147483647 submenuAction: Font YES Show Fonts t 1048576 2147483647 Bold b 1048576 2147483647 2 Italic i 1048576 2147483647 1 Underline u 1048576 2147483647 YES YES 2147483647 Bigger + 1048576 2147483647 3 Smaller - 1048576 2147483647 4 YES YES 2147483647 Kern 2147483647 submenuAction: Kern YES Use Default 2147483647 Use None 2147483647 Tighten 2147483647 Loosen 2147483647 Ligature 2147483647 submenuAction: Ligature YES Use Default 2147483647 Use None 2147483647 Use All 2147483647 Baseline 2147483647 submenuAction: Baseline YES Use Default 2147483647 Superscript 2147483647 Subscript 2147483647 Raise 2147483647 Lower 2147483647 YES YES 2147483647 Show Colors C 1048576 2147483647 YES YES 2147483647 Copy Style c 1572864 2147483647 Paste Style v 1572864 2147483647 _NSFontMenu Text 2147483647 submenuAction: Text YES Align Left { 1048576 2147483647 Center | 1048576 2147483647 Justify 2147483647 Align Right } 1048576 2147483647 YES YES 2147483647 Writing Direction 2147483647 submenuAction: Writing Direction YES YES Paragraph 2147483647 CURlZmF1bHQ 2147483647 CUxlZnQgdG8gUmlnaHQ 2147483647 CVJpZ2h0IHRvIExlZnQ 2147483647 YES YES 2147483647 YES Selection 2147483647 CURlZmF1bHQ 2147483647 CUxlZnQgdG8gUmlnaHQ 2147483647 CVJpZ2h0IHRvIExlZnQ 2147483647 YES YES 2147483647 Show Ruler 2147483647 Copy Ruler c 1310720 2147483647 Paste Ruler v 1310720 2147483647 View 1048576 2147483647 submenuAction: View YES Show Toolbar t 1572864 2147483647 Customize Toolbar… 1048576 2147483647 Window 1048576 2147483647 submenuAction: Window YES Minimize m 1048576 2147483647 Zoom 1048576 2147483647 YES YES 1048576 2147483647 Bring All to Front 1048576 2147483647 _NSWindowsMenu Help 2147483647 submenuAction: Help YES IconLab Help ? 1048576 2147483647 _NSHelpMenu _NSMainMenu 15 2 {{335, 580}, {426, 170}} 1954021376 ImageLab NSWindow {1.79769e+308, 1.79769e+308} {320, 170} 256 YES 274 YES YES Apple PDF pasteboard type Apple PICT pasteboard type Apple PNG pasteboard type NSFilenamesPboardType NeXT Encapsulated PostScript v1.2 pasteboard type NeXT TIFF v4.0 pasteboard type {{17, 18}, {135, 135}} YES 130560 33554432 NSImage test 0 3 2 NO YES 273 YES 297 YES 297 {{17, 2}, {68, 17}} YES 68288064 272630784 Recached: LucidaGrande 13 1044 6 System controlColor 3 MC42NjY2NjY2NjY3AA 6 System controlTextColor 3 MAA 268 {{82, -1}, {22, 23}} YES -1543373312 134217728 Gradient Button -2042347265 162 NSImage NSStatusAvailable 400 75 {{72, 46}, {124, 19}} NSView 289 {{17, 11}, {235, 29}} YES 68288064 138413056 0 ms LucidaGrande 24 16 265 {{17, 125}, {235, 26}} YES -2076049856 2048 109199615 129 400 75 Original 1048576 2147483647 1 _popUpItemAction: YES OtherViews YES Modified (lock focus) 1048576 2147483647 _popUpItemAction: 1 Modified (custom image rep) 2147483647 _popUpItemAction: 2 Drawn (lock focus) 1048576 2147483647 _popUpItemAction: 3 Drawn (custom image rep) 2147483647 _popUpItemAction: 4 Core Image (TIFF Rep) 2147483647 _popUpItemAction: 5 Core Image (custom rep) 2147483647 _popUpItemAction: 6 1 YES YES 2 297 {{84, 67}, {100, 32}} YES 67239424 134217728 Redisplay -2038284033 129 200 25 {{157, 1}, {269, 169}} NSView {426, 170} {{0, 0}, {1920, 1178}} {320, 192} {1.79769e+308, 1.79769e+308} ImageLabAppDelegate NSFontManager YES performMiniaturize: 37 arrangeInFront: 39 print: 86 runPageLayout: 87 clearRecentDocuments: 127 orderFrontStandardAboutPanel: 142 performClose: 193 toggleContinuousSpellChecking: 222 undo: 223 copy: 224 checkSpelling: 225 paste: 226 stopSpeaking: 227 cut: 228 showGuessPanel: 230 redo: 231 selectAll: 232 startSpeaking: 233 delete: 235 performZoom: 240 performFindPanelAction: 241 centerSelectionInVisibleArea: 245 toggleGrammarChecking: 347 toggleSmartInsertDelete: 355 toggleAutomaticQuoteSubstitution: 356 toggleAutomaticLinkDetection: 357 saveDocument: 362 saveDocumentAs: 363 revertDocumentToSaved: 364 runToolbarCustomizationPalette: 365 toggleToolbarShown: 366 hide: 367 hideOtherApplications: 368 unhideAllApplications: 370 newDocument: 373 openDocument: 374 addFontTrait: 421 addFontTrait: 422 modifyFont: 423 orderFrontFontPanel: 424 modifyFont: 425 raiseBaseline: 426 lowerBaseline: 427 copyFont: 428 subscript: 429 superscript: 430 tightenKerning: 431 underline: 432 orderFrontColorPanel: 433 useAllLigatures: 434 loosenKerning: 435 pasteFont: 436 unscript: 437 useStandardKerning: 438 useStandardLigatures: 439 turnOffLigatures: 440 turnOffKerning: 441 terminate: 449 toggleAutomaticSpellingCorrection: 456 orderFrontSubstitutionsPanel: 458 toggleAutomaticDashSubstitution: 461 toggleAutomaticTextReplacement: 463 uppercaseWord: 464 capitalizeWord: 467 lowercaseWord: 468 pasteAsPlainText: 486 performFindPanelAction: 487 performFindPanelAction: 488 performFindPanelAction: 489 showHelp: 493 delegate 495 alignCenter: 518 pasteRuler: 519 toggleRuler: 520 alignRight: 521 copyRuler: 522 alignJustified: 523 alignLeft: 524 makeBaseWritingDirectionNatural: 525 makeBaseWritingDirectionLeftToRight: 526 makeBaseWritingDirectionRightToLeft: 527 makeTextWritingDirectionNatural: 528 makeTextWritingDirectionLeftToRight: 529 makeTextWritingDirectionRightToLeft: 530 window 532 imageView 545 switchImage: 546 timeLabel 553 label 554 redraw: 559 redrawIndicator 569 recacheIndicator 570 YES 0 YES -2 File's Owner -1 First Responder -3 Application 29 YES 19 YES 56 YES 217 YES 83 YES 81 YES 75 80 78 72 82 124 YES 77 73 79 112 74 125 YES 126 205 YES 202 198 207 214 199 203 197 206 215 218 YES 216 YES 200 YES 219 201 204 220 YES 213 210 221 208 209 57 YES 58 134 150 136 144 129 143 236 131 YES 149 145 130 24 YES 92 5 239 23 295 YES 296 YES 297 298 211 YES 212 YES 195 196 346 348 YES 349 YES 350 351 354 371 YES 372 YES 375 YES 376 YES 377 YES 388 YES 389 390 391 392 393 394 395 396 397 YES 398 YES 399 YES 400 401 402 403 404 405 YES 406 407 408 409 410 411 YES 412 413 414 415 YES 416 417 418 419 420 450 YES 451 YES 452 453 454 457 459 460 462 465 466 485 490 YES 491 YES 492 494 Image Lab App Delegate 496 YES 497 YES 498 499 500 501 502 503 YES 504 505 506 507 508 YES 509 510 511 512 513 514 515 516 517 533 YES 534 560 YES 557 YES 558 539 YES 540 YES 541 YES 550 549 548 547 544 543 542 551 YES 552 571 YES 567 YES 568 565 YES 566 YES YES -3.IBPluginDependency 112.IBPluginDependency 112.ImportedFromIB2 124.IBPluginDependency 124.ImportedFromIB2 125.IBPluginDependency 125.ImportedFromIB2 125.editorWindowContentRectSynchronizationRect 126.IBPluginDependency 126.ImportedFromIB2 129.IBPluginDependency 129.ImportedFromIB2 130.IBPluginDependency 130.ImportedFromIB2 130.editorWindowContentRectSynchronizationRect 131.IBPluginDependency 131.ImportedFromIB2 134.IBPluginDependency 134.ImportedFromIB2 136.IBPluginDependency 136.ImportedFromIB2 143.IBPluginDependency 143.ImportedFromIB2 144.IBPluginDependency 144.ImportedFromIB2 145.IBPluginDependency 145.ImportedFromIB2 149.IBPluginDependency 149.ImportedFromIB2 150.IBPluginDependency 150.ImportedFromIB2 19.IBPluginDependency 19.ImportedFromIB2 195.IBPluginDependency 195.ImportedFromIB2 196.IBPluginDependency 196.ImportedFromIB2 197.IBPluginDependency 197.ImportedFromIB2 198.IBPluginDependency 198.ImportedFromIB2 199.IBPluginDependency 199.ImportedFromIB2 200.IBEditorWindowLastContentRect 200.IBPluginDependency 200.ImportedFromIB2 200.editorWindowContentRectSynchronizationRect 201.IBPluginDependency 201.ImportedFromIB2 202.IBPluginDependency 202.ImportedFromIB2 203.IBPluginDependency 203.ImportedFromIB2 204.IBPluginDependency 204.ImportedFromIB2 205.IBEditorWindowLastContentRect 205.IBPluginDependency 205.ImportedFromIB2 205.editorWindowContentRectSynchronizationRect 206.IBPluginDependency 206.ImportedFromIB2 207.IBPluginDependency 207.ImportedFromIB2 208.IBPluginDependency 208.ImportedFromIB2 209.IBPluginDependency 209.ImportedFromIB2 210.IBPluginDependency 210.ImportedFromIB2 211.IBPluginDependency 211.ImportedFromIB2 212.IBPluginDependency 212.ImportedFromIB2 212.editorWindowContentRectSynchronizationRect 213.IBPluginDependency 213.ImportedFromIB2 214.IBPluginDependency 214.ImportedFromIB2 215.IBPluginDependency 215.ImportedFromIB2 216.IBPluginDependency 216.ImportedFromIB2 217.IBPluginDependency 217.ImportedFromIB2 218.IBPluginDependency 218.ImportedFromIB2 219.IBPluginDependency 219.ImportedFromIB2 220.IBEditorWindowLastContentRect 220.IBPluginDependency 220.ImportedFromIB2 220.editorWindowContentRectSynchronizationRect 221.IBPluginDependency 221.ImportedFromIB2 23.IBPluginDependency 23.ImportedFromIB2 236.IBPluginDependency 236.ImportedFromIB2 239.IBPluginDependency 239.ImportedFromIB2 24.IBEditorWindowLastContentRect 24.IBPluginDependency 24.ImportedFromIB2 24.editorWindowContentRectSynchronizationRect 29.IBEditorWindowLastContentRect 29.IBPluginDependency 29.ImportedFromIB2 29.WindowOrigin 29.editorWindowContentRectSynchronizationRect 295.IBPluginDependency 296.IBEditorWindowLastContentRect 296.IBPluginDependency 296.editorWindowContentRectSynchronizationRect 297.IBPluginDependency 298.IBPluginDependency 346.IBPluginDependency 346.ImportedFromIB2 348.IBPluginDependency 348.ImportedFromIB2 349.IBEditorWindowLastContentRect 349.IBPluginDependency 349.ImportedFromIB2 349.editorWindowContentRectSynchronizationRect 350.IBPluginDependency 350.ImportedFromIB2 351.IBPluginDependency 351.ImportedFromIB2 354.IBPluginDependency 354.ImportedFromIB2 371.IBEditorWindowLastContentRect 371.IBPluginDependency 371.IBWindowTemplateEditedContentRect 371.NSWindowTemplate.visibleAtLaunch 371.editorWindowContentRectSynchronizationRect 371.windowTemplate.hasMinSize 371.windowTemplate.maxSize 371.windowTemplate.minSize 372.IBPluginDependency 375.IBPluginDependency 376.IBEditorWindowLastContentRect 376.IBPluginDependency 377.IBPluginDependency 388.IBEditorWindowLastContentRect 388.IBPluginDependency 389.IBPluginDependency 390.IBPluginDependency 391.IBPluginDependency 392.IBPluginDependency 393.IBPluginDependency 394.IBPluginDependency 395.IBPluginDependency 396.IBPluginDependency 397.IBPluginDependency 398.IBPluginDependency 399.IBPluginDependency 400.IBPluginDependency 401.IBPluginDependency 402.IBPluginDependency 403.IBPluginDependency 404.IBPluginDependency 405.IBPluginDependency 406.IBPluginDependency 407.IBPluginDependency 408.IBPluginDependency 409.IBPluginDependency 410.IBPluginDependency 411.IBPluginDependency 412.IBPluginDependency 413.IBPluginDependency 414.IBPluginDependency 415.IBPluginDependency 416.IBPluginDependency 417.IBPluginDependency 418.IBPluginDependency 419.IBPluginDependency 450.IBPluginDependency 451.IBEditorWindowLastContentRect 451.IBPluginDependency 452.IBPluginDependency 453.IBPluginDependency 454.IBPluginDependency 457.IBPluginDependency 459.IBPluginDependency 460.IBPluginDependency 462.IBPluginDependency 465.IBPluginDependency 466.IBPluginDependency 485.IBPluginDependency 490.IBPluginDependency 491.IBEditorWindowLastContentRect 491.IBPluginDependency 492.IBPluginDependency 496.IBPluginDependency 497.IBEditorWindowLastContentRect 497.IBPluginDependency 498.IBPluginDependency 499.IBPluginDependency 5.IBPluginDependency 5.ImportedFromIB2 500.IBPluginDependency 501.IBPluginDependency 502.IBPluginDependency 503.IBPluginDependency 504.IBPluginDependency 505.IBPluginDependency 506.IBPluginDependency 507.IBPluginDependency 508.IBEditorWindowLastContentRect 508.IBPluginDependency 509.IBPluginDependency 510.IBPluginDependency 511.IBPluginDependency 512.IBPluginDependency 513.IBPluginDependency 514.IBPluginDependency 515.IBPluginDependency 516.IBPluginDependency 517.IBPluginDependency 533.CustomClassName 533.IBPluginDependency 533.IBViewBoundsToFrameTransform 534.IBPluginDependency 539.IBPluginDependency 540.IBPluginDependency 541.IBEditorWindowLastContentRect 541.IBPluginDependency 542.IBPluginDependency 543.IBPluginDependency 544.IBPluginDependency 547.IBPluginDependency 548.IBPluginDependency 549.IBPluginDependency 550.IBPluginDependency 551.IBPluginDependency 551.IBViewBoundsToFrameTransform 552.IBPluginDependency 557.IBPluginDependency 557.IBViewBoundsToFrameTransform 558.IBPluginDependency 56.IBPluginDependency 56.ImportedFromIB2 565.IBPluginDependency 566.IBPluginDependency 567.IBPluginDependency 567.IBViewBoundsToFrameTransform 568.IBPluginDependency 57.IBEditorWindowLastContentRect 57.IBPluginDependency 57.ImportedFromIB2 57.editorWindowContentRectSynchronizationRect 58.IBPluginDependency 58.ImportedFromIB2 72.IBPluginDependency 72.ImportedFromIB2 73.IBPluginDependency 73.ImportedFromIB2 74.IBPluginDependency 74.ImportedFromIB2 75.IBPluginDependency 75.ImportedFromIB2 77.IBPluginDependency 77.ImportedFromIB2 78.IBPluginDependency 78.ImportedFromIB2 79.IBPluginDependency 79.ImportedFromIB2 80.IBPluginDependency 80.ImportedFromIB2 81.IBEditorWindowLastContentRect 81.IBPluginDependency 81.ImportedFromIB2 81.editorWindowContentRectSynchronizationRect 82.IBPluginDependency 82.ImportedFromIB2 83.IBPluginDependency 83.ImportedFromIB2 92.IBPluginDependency 92.ImportedFromIB2 YES com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{522, 812}, {146, 23}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{436, 809}, {64, 6}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{753, 187}, {275, 113}} com.apple.InterfaceBuilder.CocoaPlugin {{608, 612}, {275, 83}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{547, 180}, {254, 283}} com.apple.InterfaceBuilder.CocoaPlugin {{187, 434}, {243, 243}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{608, 612}, {167, 43}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{753, 217}, {238, 103}} com.apple.InterfaceBuilder.CocoaPlugin {{608, 612}, {241, 103}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{654, 239}, {194, 73}} com.apple.InterfaceBuilder.CocoaPlugin {{525, 802}, {197, 73}} {{380, 836}, {434, 20}} com.apple.InterfaceBuilder.CocoaPlugin {74, 862} {{6, 978}, {478, 20}} com.apple.InterfaceBuilder.CocoaPlugin {{604, 269}, {231, 43}} com.apple.InterfaceBuilder.CocoaPlugin {{475, 832}, {234, 43}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{746, 287}, {220, 133}} com.apple.InterfaceBuilder.CocoaPlugin {{608, 612}, {215, 63}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{67, 485}, {426, 170}} com.apple.InterfaceBuilder.CocoaPlugin {{67, 485}, {426, 170}} {{33, 99}, {480, 360}} {3.40282e+38, 3.40282e+38} {320, 170} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{591, 420}, {83, 43}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{523, 2}, {178, 283}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{753, 197}, {170, 63}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{725, 289}, {246, 23}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{674, 260}, {204, 183}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{878, 180}, {164, 173}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin TimedImageView com.apple.InterfaceBuilder.CocoaPlugin AUGIAABBkAAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{307, 633}, {262, 143}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDLgAAwuQAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABCrAAAwsAAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDGgAAwlgAAA com.apple.InterfaceBuilder.CocoaPlugin {{392, 653}, {201, 183}} com.apple.InterfaceBuilder.CocoaPlugin {{23, 794}, {245, 183}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{452, 109}, {196, 203}} com.apple.InterfaceBuilder.CocoaPlugin {{145, 474}, {199, 203}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin YES YES YES YES 571 YES ImageLabAppDelegate NSObject YES YES redraw: switchImage: YES id id YES YES redraw: switchImage: YES redraw: id switchImage: id YES YES imageView recacheIndicator timeLabel window YES NSImageView NSButton NSTextField NSWindow YES YES imageView recacheIndicator timeLabel window YES imageView NSImageView recacheIndicator NSButton timeLabel NSTextField window NSWindow IBProjectSource Examples/ImageLab/ImageLabAppDelegate.h NSObject IBProjectSource NSObject-NoodlePerformWhenIdle.h NSObject IBProjectSource NSTableView-NoodleExtensions.h NSObject IBProjectSource NoodleGlue.h NSResponder YES YES cancelModal: confirmModal: YES id id YES YES cancelModal: confirmModal: YES cancelModal: id confirmModal: id IBProjectSource NSResponder-NoodleModalExtensions.h NSTableView scrollToStickyRow: id scrollToStickyRow: scrollToStickyRow: id NSWindow YES YES cancelModal: confirmModal: YES id id YES YES cancelModal: confirmModal: YES cancelModal: id confirmModal: id NSWindow IBProjectSource NSWindow-NoodleEffects.h TimedImageView NSImageView YES YES label redrawIndicator YES id id YES YES label redrawIndicator YES label id redrawIndicator id IBProjectSource Examples/ImageLab/TimedImageView.h YES NSActionCell NSCell IBFrameworkSource AppKit.framework/Headers/NSActionCell.h NSApplication NSResponder IBFrameworkSource AppKit.framework/Headers/NSApplication.h NSApplication IBFrameworkSource AppKit.framework/Headers/NSApplicationScripting.h NSApplication IBFrameworkSource AppKit.framework/Headers/NSColorPanel.h NSApplication IBFrameworkSource AppKit.framework/Headers/NSHelpManager.h NSApplication IBFrameworkSource AppKit.framework/Headers/NSPageLayout.h NSApplication IBFrameworkSource AppKit.framework/Headers/NSUserInterfaceItemSearching.h NSBrowser NSControl IBFrameworkSource AppKit.framework/Headers/NSBrowser.h NSButton NSControl IBFrameworkSource AppKit.framework/Headers/NSButton.h NSButtonCell NSActionCell IBFrameworkSource AppKit.framework/Headers/NSButtonCell.h NSCell NSObject IBFrameworkSource AppKit.framework/Headers/NSCell.h NSControl NSView IBFrameworkSource AppKit.framework/Headers/NSControl.h NSDocument NSObject YES YES printDocument: revertDocumentToSaved: runPageLayout: saveDocument: saveDocumentAs: saveDocumentTo: YES id id id id id id YES YES printDocument: revertDocumentToSaved: runPageLayout: saveDocument: saveDocumentAs: saveDocumentTo: YES printDocument: id revertDocumentToSaved: id runPageLayout: id saveDocument: id saveDocumentAs: id saveDocumentTo: id IBFrameworkSource AppKit.framework/Headers/NSDocument.h NSDocument IBFrameworkSource AppKit.framework/Headers/NSDocumentScripting.h NSDocumentController NSObject YES YES clearRecentDocuments: newDocument: openDocument: saveAllDocuments: YES id id id id YES YES clearRecentDocuments: newDocument: openDocument: saveAllDocuments: YES clearRecentDocuments: id newDocument: id openDocument: id saveAllDocuments: id IBFrameworkSource AppKit.framework/Headers/NSDocumentController.h NSFontManager NSObject IBFrameworkSource AppKit.framework/Headers/NSFontManager.h NSFormatter NSObject IBFrameworkSource Foundation.framework/Headers/NSFormatter.h NSImageCell NSCell IBFrameworkSource AppKit.framework/Headers/NSImageCell.h NSImageView NSControl IBFrameworkSource AppKit.framework/Headers/NSImageView.h NSMatrix NSControl IBFrameworkSource AppKit.framework/Headers/NSMatrix.h NSMenu NSObject IBFrameworkSource AppKit.framework/Headers/NSMenu.h NSMenuItem NSObject IBFrameworkSource AppKit.framework/Headers/NSMenuItem.h NSMenuItemCell NSButtonCell IBFrameworkSource AppKit.framework/Headers/NSMenuItemCell.h NSMovieView NSView IBFrameworkSource AppKit.framework/Headers/NSMovieView.h NSObject IBFrameworkSource AppKit.framework/Headers/NSAccessibility.h NSObject NSObject NSObject NSObject NSObject IBFrameworkSource AppKit.framework/Headers/NSDictionaryController.h NSObject IBFrameworkSource AppKit.framework/Headers/NSDragging.h NSObject NSObject IBFrameworkSource AppKit.framework/Headers/NSFontPanel.h NSObject IBFrameworkSource AppKit.framework/Headers/NSKeyValueBinding.h NSObject NSObject IBFrameworkSource AppKit.framework/Headers/NSNibLoading.h NSObject IBFrameworkSource AppKit.framework/Headers/NSOutlineView.h NSObject IBFrameworkSource AppKit.framework/Headers/NSPasteboard.h NSObject IBFrameworkSource AppKit.framework/Headers/NSSavePanel.h NSObject IBFrameworkSource AppKit.framework/Headers/NSTableView.h NSObject IBFrameworkSource AppKit.framework/Headers/NSToolbarItem.h NSObject IBFrameworkSource AppKit.framework/Headers/NSView.h NSObject IBFrameworkSource Foundation.framework/Headers/NSArchiver.h NSObject IBFrameworkSource Foundation.framework/Headers/NSClassDescription.h NSObject IBFrameworkSource Foundation.framework/Headers/NSError.h NSObject IBFrameworkSource Foundation.framework/Headers/NSFileManager.h NSObject IBFrameworkSource Foundation.framework/Headers/NSKeyValueCoding.h NSObject IBFrameworkSource Foundation.framework/Headers/NSKeyValueObserving.h NSObject IBFrameworkSource Foundation.framework/Headers/NSKeyedArchiver.h NSObject IBFrameworkSource Foundation.framework/Headers/NSObject.h NSObject IBFrameworkSource Foundation.framework/Headers/NSObjectScripting.h NSObject IBFrameworkSource Foundation.framework/Headers/NSPortCoder.h NSObject IBFrameworkSource Foundation.framework/Headers/NSRunLoop.h NSObject IBFrameworkSource Foundation.framework/Headers/NSScriptClassDescription.h NSObject IBFrameworkSource Foundation.framework/Headers/NSScriptKeyValueCoding.h NSObject IBFrameworkSource Foundation.framework/Headers/NSScriptObjectSpecifiers.h NSObject IBFrameworkSource Foundation.framework/Headers/NSScriptWhoseTests.h NSObject IBFrameworkSource Foundation.framework/Headers/NSThread.h NSObject IBFrameworkSource Foundation.framework/Headers/NSURL.h NSObject IBFrameworkSource Foundation.framework/Headers/NSURLConnection.h NSObject IBFrameworkSource Foundation.framework/Headers/NSURLDownload.h NSObject IBFrameworkSource QuartzCore.framework/Headers/CAAnimation.h NSObject IBFrameworkSource QuartzCore.framework/Headers/CALayer.h NSObject IBFrameworkSource QuartzCore.framework/Headers/CIImageProvider.h NSPopUpButton NSButton IBFrameworkSource AppKit.framework/Headers/NSPopUpButton.h NSPopUpButtonCell NSMenuItemCell IBFrameworkSource AppKit.framework/Headers/NSPopUpButtonCell.h NSResponder IBFrameworkSource AppKit.framework/Headers/NSInterfaceStyle.h NSResponder NSObject IBFrameworkSource AppKit.framework/Headers/NSResponder.h NSTableView NSControl NSText NSView IBFrameworkSource AppKit.framework/Headers/NSText.h NSTextField NSControl IBFrameworkSource AppKit.framework/Headers/NSTextField.h NSTextFieldCell NSActionCell IBFrameworkSource AppKit.framework/Headers/NSTextFieldCell.h NSTextView NSText IBFrameworkSource AppKit.framework/Headers/NSTextView.h NSView IBFrameworkSource AppKit.framework/Headers/NSClipView.h NSView NSView IBFrameworkSource AppKit.framework/Headers/NSRulerView.h NSView NSResponder NSWindow IBFrameworkSource AppKit.framework/Headers/NSDrawer.h NSWindow NSResponder IBFrameworkSource AppKit.framework/Headers/NSWindow.h NSWindow IBFrameworkSource AppKit.framework/Headers/NSWindowScripting.h 0 IBCocoaFramework com.apple.InterfaceBuilder.CocoaPlugin.macosx com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3 YES ../../../NoodleKit.xcodeproj 3 YES YES NSMenuCheckmark NSMenuMixedState NSStatusAvailable test YES {9, 8} {7, 2} {16, 16} {64, 64} ================================================ FILE: Examples/ImageLab/ImageLab-Info.plist ================================================ CFBundleDevelopmentRegion English CFBundleExecutable ${EXECUTABLE_NAME} CFBundleIdentifier com.yourcompany.${PRODUCT_NAME:rfc1034identifier} CFBundleInfoDictionaryVersion 6.0 CFBundlePackageType APPL CFBundleShortVersionString 1.0 CFBundleSignature ???? CFBundleVersion 1 LSMinimumSystemVersion ${MACOSX_DEPLOYMENT_TARGET} NSMainNibFile MainMenu NSPrincipalClass NSApplication ================================================ FILE: Examples/ImageLab/ImageLabAppDelegate.h ================================================ // // ImageLabAppDelegate.h // ImageLab // // Created by Paul Kim on 3/20/11. // Copyright 2011 Noodlesoft, LLC. All rights reserved. // // Permission is hereby granted, free of charge, to any person // obtaining a copy of this software and associated documentation // files (the "Software"), to deal in the Software without // restriction, including without limitation the rights to use, // copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the // Software is furnished to do so, subject to the following // conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #import @interface ImageLabAppDelegate : NSObject { IBOutlet NSImageView *imageView; IBOutlet NSTextField *timeLabel; IBOutlet NSButton *recacheIndicator; NSImage *testImage; NSWindow *window; } @property (assign) IBOutlet NSWindow *window; - (IBAction)switchImage:sender; - (IBAction)redraw:sender; @end ================================================ FILE: Examples/ImageLab/ImageLabAppDelegate.m ================================================ // // ImageLabAppDelegate.m // ImageLab // // Created by Paul Kim on 3/20/11. // Copyright 2011-2012 Noodlesoft, LLC. All rights reserved. // // Permission is hereby granted, free of charge, to any person // obtaining a copy of this software and associated documentation // files (the "Software"), to deal in the Software without // restriction, including without limitation the rights to use, // copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the // Software is furnished to do so, subject to the following // conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #import "ImageLabAppDelegate.h" #import "NoodleCustomImageRep.h" #import @implementation ImageLabAppDelegate @synthesize window; - (NSImage *)lockFocusImage { NSImage *image; NSSize size; CGFloat diameter; image = [[testImage copy] autorelease]; size = [image size]; diameter = size.width / 2.0; [image lockFocus]; [[NSColor blackColor] set]; [[NSBezierPath bezierPathWithOvalInRect:NSMakeRect(diameter / 2.0, diameter / 2.0, diameter, diameter)] fill]; [image unlockFocus]; return image; } - (NSImage *)customRepImage { NoodleCustomImageRep *rep; NSSize size; NSImage *image; size = [testImage size]; rep = [NoodleCustomImageRep imageRepWithDrawBlock: ^(NoodleCustomImageRep *blockRep) { NSSize repSize; CGFloat diameter; repSize = [blockRep size]; diameter = repSize.width / 2.0; [testImage drawInRect:NSMakeRect(0.0, 0.0, size.width, size.height) fromRect:NSZeroRect operation:NSCompositeCopy fraction:1.0]; [[NSColor blackColor] set]; [[NSBezierPath bezierPathWithOvalInRect:NSMakeRect(diameter / 2.0, diameter / 2.0, diameter, diameter)] fill]; [recacheIndicator setImage:[[[NSImage imageNamed:NSImageNameStatusAvailable] copy] autorelease]]; }]; [rep setSize:size]; image = [[[NSImage alloc] initWithSize:size] autorelease]; [image addRepresentation:rep]; return image; } - (NSImage *)lockFocusDrawnImage { NSImage *image; NSSize size; size = NSMakeSize(10.0, 10.0); image = [[[NSImage alloc] initWithSize:size] autorelease]; [image lockFocus]; [[NSGraphicsContext currentContext] setShouldAntialias:NO]; [[NSColor blueColor] set]; NSRectFill(NSMakeRect(1.0, 1.0, 8.0, 8.0)); [image unlockFocus]; return image; } - (NSImage *)customRepDrawnImage { NoodleCustomImageRep *rep; NSSize size; NSImage *image; size = NSMakeSize(10.0, 10.0); rep = [NoodleCustomImageRep imageRepWithDrawBlock: ^(NoodleCustomImageRep *blockRep) { [[NSColor blueColor] set]; NSRectFill(NSMakeRect(1.0, 1.0, 8.0, 8.0)); [recacheIndicator setImage:[[[NSImage imageNamed:NSImageNameStatusAvailable] copy] autorelease]]; }]; [rep setSize:size]; image = [[[NSImage alloc] initWithSize:size] autorelease]; [image addRepresentation:rep]; return image; } - (NSImage *)coreImageTIFFRep { NSImage *image; NSSize size; CIImage *input, *output; CIFilter *filter; NSCIImageRep *rep; CGRect extent; CGAffineTransform transform; size = [testImage size]; input = [CIImage imageWithData:[testImage TIFFRepresentation]]; filter = [CIFilter filterWithName:@"CIPointillize" keysAndValues: @"inputImage", input, @"inputRadius", [NSNumber numberWithFloat:(float)(size.width / 10.0)], @"inputCenter", [CIVector vectorWithX:size.width / 2.0 Y:size.height / 2.0], nil]; output = [filter valueForKey:@"outputImage"]; extent = [output extent]; transform = CGAffineTransformMakeScale(size.width / extent.size.width, size.height / extent.size.height); transform = CGAffineTransformTranslate(transform, -extent.origin.x, -extent.origin.y); output = [output imageByApplyingTransform:transform]; image = [[[NSImage alloc] initWithSize:size] autorelease]; rep = [NSCIImageRep imageRepWithCIImage:output]; [rep setSize:size]; [image addRepresentation:rep]; return image; } - (NSImage *)coreImageCustomImageRep { NoodleCustomImageRep *rep; NSSize size; NSImage *image; __block id label; label = timeLabel; size = [testImage size]; rep = [NoodleCustomImageRep imageRepWithDrawBlock: ^(NoodleCustomImageRep *blockRep) { CGImageRef cgImage; CIImage *input, *output; CIFilter *filter; NSRect rect; rect.origin = NSMakePoint(0.0, 0.0); rect.size = [blockRep size]; cgImage = [testImage CGImageForProposedRect:&rect context:[NSGraphicsContext currentContext] hints:nil]; input = [CIImage imageWithCGImage:cgImage]; filter = [CIFilter filterWithName:@"CIPointillize" keysAndValues: @"inputImage", input, @"inputRadius", [NSNumber numberWithFloat:(float)(NSWidth(rect) / 10.0)], @"inputCenter", [CIVector vectorWithX:NSWidth(rect) / 2.0 Y:NSHeight(rect) / 2.0], nil]; output = [filter valueForKey:@"outputImage"]; [output drawInRect:rect fromRect:NSRectFromCGRect([output extent]) operation:NSCompositeCopy fraction:1.0]; [recacheIndicator setImage:[[[NSImage imageNamed:NSImageNameStatusAvailable] copy] autorelease]]; }]; [rep setSize:size]; image = [[[NSImage alloc] initWithSize:size] autorelease]; [image addRepresentation:rep]; return image; } - (void)applicationDidFinishLaunching:(NSNotification *)aNotification { testImage = [[NSImage imageNamed:@"test"] copy]; [recacheIndicator setImage:[[[NSImage imageNamed:NSImageNameStatusNone] copy] autorelease]]; } - (IBAction)switchImage:(id)sender { NSInteger tag; NSImage *image; tag = [sender selectedTag]; image = nil; switch (tag) { case 0: image = testImage; break; case 1: image = [self lockFocusImage]; break; case 2: image = [self customRepImage]; break; case 3: image = [self lockFocusDrawnImage]; break; case 4: image = [self customRepDrawnImage]; break; case 5: image = [self coreImageTIFFRep]; break; case 6: image = [self coreImageCustomImageRep]; break; } [imageView setObjectValue:image]; } - (IBAction)redraw:sender { [imageView display]; } @end ================================================ FILE: Examples/ImageLab/Read Me.rtf ================================================ {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf350 {\fonttbl\f0\fswiss\fcharset0 Helvetica;\f1\fnil\fcharset0 Monaco;} {\colortbl;\red255\green255\blue255;} {\*\listtable{\list\listtemplateid1\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid1\'01\uc0\u8226 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listname ;}\listid1} {\list\listtemplateid2\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid101\'01\uc0\u8226 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listname ;}\listid2}} {\*\listoverridetable{\listoverride\listid1\listoverridecount0\ls1}{\listoverride\listid2\listoverridecount0\ls2}} \margl1440\margr1440\vieww19360\viewh15600\viewkind0 \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural \f0\b\fs24 \cf0 ImageLab \b0 \ \ \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural\pardirnatural \cf0 \ This is a sample program that is a companion piece to my blog article on NSImage here: {\field{\*\fldinst{HYPERLINK "http://www.noodlesoft.com/blog/2011/04/15/the-proper-care-and-feeding-of-nsimage"}}{\fldrslt http://www.noodlesoft.com/blog/2011/04/15/the-proper-care-and-feeding-of-nsimage}}\ \ This program shows different ways, both good and bad, of using NSImage. Please see the companion article as it goes into much more detail. This project also demonstrates use of NoodleCustomImageRep.\ \ \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural\pardirnatural \b \cf0 Notes \b0 \ \pard\tx220\tx720\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\li720\fi-720\ql\qnatural\pardirnatural \ls1\ilvl0\cf0 \ \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural\pardirnatural \cf0 \ \ \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural\pardirnatural \b \cf0 Possible Improvements\ \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural\pardirnatural \b0 \cf0 \ \ \ \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural\pardirnatural \b \cf0 Contact \b0 \ \ Just go {\field{\*\fldinst{HYPERLINK "http://www.noodlesoft.com/about.php"}}{\fldrslt www.noodlesoft.com}} and shoot me an email. Or visit the blog article linked above and leave a comment. Bugs, suggestions and other feedback appreciated.\ \ \ \b License \b0 \ \ I am releasing this under the MIT license.\ \ ____________________________________\ \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural\pardirnatural \f1 \cf0 Copyright (c) 2011 Noodlesoft, LLC. All Rights Reserved.\ \ Permission is hereby granted, free of charge, to any person\ obtaining a copy of this software and associated documentation\ files (the "Software"), to deal in the Software without\ restriction, including without limitation the rights to use,\ copy, modify, merge, publish, distribute, sublicense, and/or sell\ copies of the Software, and to permit persons to whom the\ Software is furnished to do so, subject to the following\ conditions:\ \ The above copyright notice and this permission notice shall be\ included in all copies or substantial portions of the Software.\ \ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\ OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\ OTHER DEALINGS IN THE SOFTWARE.\ \pard\tx220\tx720\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\li720\fi-720\ql\qnatural\pardirnatural \ls2\ilvl0 \f0\b \cf0 \ } ================================================ FILE: Examples/ImageLab/TimedImageView.h ================================================ // // TimedImageView.h // ImageLab // // Created by Paul Kim on 3/20/11. // Copyright 2011 Noodlesoft, LLC. All rights reserved. // // // Permission is hereby granted, free of charge, to any person // obtaining a copy of this software and associated documentation // files (the "Software"), to deal in the Software without // restriction, including without limitation the rights to use, // copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the // Software is furnished to do so, subject to the following // conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #import @interface TimedImageView : NSImageView { IBOutlet id label; IBOutlet id redrawIndicator; } @end ================================================ FILE: Examples/ImageLab/TimedImageView.m ================================================ // // TimedImageView.m // ImageLab // // Created by Paul Kim on 3/20/11. // Copyright 2011 Noodlesoft, LLC. All rights reserved. // // Permission is hereby granted, free of charge, to any person // obtaining a copy of this software and associated documentation // files (the "Software"), to deal in the Software without // restriction, including without limitation the rights to use, // copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the // Software is furnished to do so, subject to the following // conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #import "TimedImageView.h" @implementation TimedImageView - (void)updateLabel:(NSTimeInterval)time { [label setStringValue:[NSString stringWithFormat:@"%.2f ms", time]]; } - (void)drawRect:(NSRect)rect { NSTimeInterval time, diff; [redrawIndicator setImage:[[[NSImage imageNamed:NSImageNameStatusNone] copy] autorelease]]; time = [NSDate timeIntervalSinceReferenceDate]; [super drawRect:rect]; diff = [NSDate timeIntervalSinceReferenceDate] - time; [self updateLabel:diff * 1000]; } @end ================================================ FILE: Examples/ImageLab/main.m ================================================ // // main.m // ImageLab // // Created by Paul Kim on 3/20/11. // Copyright 2011 Noodlesoft, LLC. All rights reserved. // #import int main(int argc, char *argv[]) { return NSApplicationMain(argc, (const char **) argv); } ================================================ FILE: Examples/LineNumberView/Controller.h ================================================ // // Controller.h // Line View Test // // Created by Paul Kim on 9/28/08. // Copyright (c) 2008 Noodlesoft, LLC. All rights reserved. // // Permission is hereby granted, free of charge, to any person // obtaining a copy of this software and associated documentation // files (the "Software"), to deal in the Software without // restriction, including without limitation the rights to use, // copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the // Software is furnished to do so, subject to the following // conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. // #import @class NoodleLineNumberView; @interface Controller : NSObject { IBOutlet NSScrollView *scrollView; IBOutlet NSTextView *scriptView; NoodleLineNumberView *lineNumberView; } @end ================================================ FILE: Examples/LineNumberView/Controller.m ================================================ // // Controller.m // Line View Test // // Created by Paul Kim on 9/28/08. // Copyright (c) 2008 Noodlesoft, LLC. All rights reserved. // // Permission is hereby granted, free of charge, to any person // obtaining a copy of this software and associated documentation // files (the "Software"), to deal in the Software without // restriction, including without limitation the rights to use, // copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the // Software is furnished to do so, subject to the following // conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. // #import "Controller.h" #import "NoodleLineNumberView.h" #import "NoodleLineNumberMarker.h" #import "MarkerLineNumberView.h" @implementation Controller - (void)awakeFromNib { lineNumberView = [[MarkerLineNumberView alloc] initWithScrollView:scrollView]; [scrollView setVerticalRulerView:lineNumberView]; [scrollView setHasHorizontalRuler:NO]; [scrollView setHasVerticalRuler:YES]; [scrollView setRulersVisible:YES]; [scriptView setFont:[NSFont userFixedPitchFontOfSize:[NSFont smallSystemFontSize]]]; } @end ================================================ FILE: Examples/LineNumberView/English.lproj/MainMenu.xib ================================================ 1060 11D50b 2182 1138.32 568.00 com.apple.InterfaceBuilder.CocoaPlugin 2182 YES NSView NSMenu NSScrollView NSWindowTemplate NSMenuItem NSTextView NSScroller NSCustomObject YES com.apple.InterfaceBuilder.CocoaPlugin PluginDependencyRecalculationVersion YES NSApplication FirstResponder NSApplication AMainMenu YES Line View Test 1048576 2147483647 NSImage NSMenuCheckmark NSImage NSMenuMixedState submenuAction: Line View Test YES About Line View Test 2147483647 YES YES 1048576 2147483647 Preferences… , 1048576 2147483647 YES YES 1048576 2147483647 Services 1048576 2147483647 submenuAction: Services YES _NSServicesMenu YES YES 1048576 2147483647 Hide Line View Test h 1048576 2147483647 Hide Others h 1572864 2147483647 Show All 1048576 2147483647 YES YES 1048576 2147483647 Quit Line View Test q 1048576 2147483647 _NSAppleMenu File 1048576 2147483647 submenuAction: File YES New n 1048576 2147483647 Open… o 1048576 2147483647 Open Recent 1048576 2147483647 submenuAction: Open Recent YES Clear Menu 1048576 2147483647 _NSRecentDocumentsMenu YES YES 1048576 2147483647 Close w 1048576 2147483647 Save s 1048576 2147483647 Save As… S 1179648 2147483647 Revert to Saved 2147483647 YES YES 1048576 2147483647 Page Setup... P 1179648 2147483647 Print… p 1048576 2147483647 Edit 1048576 2147483647 submenuAction: Edit YES Undo z 1048576 2147483647 Redo Z 1179648 2147483647 YES YES 1048576 2147483647 Cut x 1048576 2147483647 Copy c 1048576 2147483647 Paste v 1048576 2147483647 Delete 1048576 2147483647 Select All a 1048576 2147483647 YES YES 1048576 2147483647 Find 1048576 2147483647 submenuAction: Find YES Find… f 1048576 2147483647 1 Find Next g 1048576 2147483647 2 Find Previous G 1179648 2147483647 3 Use Selection for Find e 1048576 2147483647 7 Jump to Selection j 1048576 2147483647 Spelling and Grammar 1048576 2147483647 submenuAction: Spelling and Grammar YES Show Spelling… : 1048576 2147483647 Check Spelling ; 1048576 2147483647 Check Spelling While Typing 1048576 2147483647 Check Grammar With Spelling 1048576 2147483647 Substitutions 1048576 2147483647 submenuAction: Substitutions YES Smart Copy/Paste f 1048576 2147483647 1 Smart Quotes g 1048576 2147483647 2 Smart Links G 1179648 2147483647 3 Speech 1048576 2147483647 submenuAction: Speech YES Start Speaking 1048576 2147483647 Stop Speaking 1048576 2147483647 View 1048576 2147483647 submenuAction: View YES Show Toolbar t 1572864 2147483647 Customize Toolbar… 1048576 2147483647 Window 1048576 2147483647 submenuAction: Window YES Minimize m 1048576 2147483647 Zoom 1048576 2147483647 YES YES 1048576 2147483647 Bring All to Front 1048576 2147483647 _NSWindowsMenu Help 1048576 2147483647 submenuAction: Help YES NewApplication Help ? 1048576 2147483647 _NSMainMenu 15 2 {{227, 288}, {428, 456}} 1946157056 Window NSWindow 256 YES 274 YES 2304 YES 2322 YES YES Apple HTML pasteboard type Apple PDF pasteboard type Apple PICT pasteboard type Apple PNG pasteboard type Apple URL pasteboard type CorePasteboardFlavorType 0x6D6F6F76 NSColor pasteboard type NSFilenamesPboardType NSStringPboardType NeXT Encapsulated PostScript v1.2 pasteboard type NeXT RTFD pasteboard type NeXT Rich Text Format v1.0 pasteboard type NeXT TIFF v4.0 pasteboard type NeXT font pasteboard type NeXT ruler pasteboard type WebURLsWithTitlesPboardType public.url {428, 14} YES 6 428 1 67119363 0 3 MQA YES YES NSBackgroundColor NSColor YES 6 System selectedTextBackgroundColor 3 MC42NjY2NjY2NjY3AA 6 System selectedTextColor 3 MAA YES YES NSColor NSUnderline YES 1 MCAwIDEAA 1 6 {858, 10000000} {223, 0} {{1, 1}, {428, 456}} {4, 5} 79691776 YES YES file://localhost/Applications/Xcode.app/Contents/SharedFrameworks/DVTKit.framework/Resources/DVTIbeamCursor.tiff 3 MCAwAA 4 -2147483392 {{282, 1}, {15, 188}} _doScroller: 0.98876399999999998 -2147483392 {{-100, -100}, {87, 18}} 1 _doScroller: 1 0.94565220000000005 {{-1, -1}, {430, 458}} 133650 {428, 456} {{0, 0}, {1440, 878}} {10000000000000, 10000000000000} YES Controller YES orderFrontStandardAboutPanel: 142 performMiniaturize: 37 arrangeInFront: 39 print: 86 runPageLayout: 87 clearRecentDocuments: 127 performClose: 193 toggleContinuousSpellChecking: 222 undo: 223 copy: 224 checkSpelling: 225 paste: 226 stopSpeaking: 227 cut: 228 showGuessPanel: 230 redo: 231 selectAll: 232 startSpeaking: 233 delete: 235 performZoom: 240 performFindPanelAction: 241 centerSelectionInVisibleArea: 245 toggleGrammarChecking: 347 toggleSmartInsertDelete: 355 toggleAutomaticQuoteSubstitution: 356 toggleAutomaticLinkDetection: 357 showHelp: 360 saveDocument: 362 saveDocumentAs: 363 revertDocumentToSaved: 364 runToolbarCustomizationPalette: 365 toggleToolbarShown: 366 hide: 367 hideOtherApplications: 368 terminate: 369 unhideAllApplications: 370 newDocument: 373 openDocument: 374 initialFirstResponder 385 scrollView 405 scriptView 406 YES 0 YES -2 File's Owner -1 First Responder -3 Application 29 YES MainMenu 19 YES 56 YES 103 YES 1 217 YES 83 YES 81 YES 75 3 80 8 78 6 72 82 9 124 YES 77 5 73 1 79 7 112 10 74 2 125 YES 126 205 YES 202 198 207 214 199 203 197 206 215 218 YES 216 YES 200 YES 219 201 204 220 YES 213 210 221 208 209 106 YES 2 111 57 YES 58 134 150 136 1111 144 129 121 143 236 131 YES 149 145 130 24 YES 92 5 239 23 295 YES 296 YES 297 298 211 YES 212 YES 195 196 346 348 YES 349 YES 350 351 354 371 YES 372 YES 375 YES 376 377 378 379 YES YES -1.IBPluginDependency -2.IBPluginDependency -3.IBPluginDependency 103.IBPluginDependency 106.IBPluginDependency 111.IBPluginDependency 112.IBPluginDependency 124.IBPluginDependency 125.IBPluginDependency 126.IBPluginDependency 129.IBPluginDependency 130.IBPluginDependency 131.IBPluginDependency 134.IBPluginDependency 136.IBPluginDependency 143.IBPluginDependency 144.IBPluginDependency 145.IBPluginDependency 149.IBPluginDependency 150.IBPluginDependency 19.IBPluginDependency 195.IBPluginDependency 196.IBPluginDependency 197.IBPluginDependency 198.IBPluginDependency 199.IBPluginDependency 200.IBPluginDependency 201.IBPluginDependency 202.IBPluginDependency 203.IBPluginDependency 204.IBPluginDependency 205.IBPluginDependency 206.IBPluginDependency 207.IBPluginDependency 208.IBPluginDependency 209.IBPluginDependency 210.IBPluginDependency 211.IBPluginDependency 212.IBPluginDependency 213.IBPluginDependency 214.IBPluginDependency 215.IBPluginDependency 216.IBPluginDependency 217.IBPluginDependency 218.IBPluginDependency 219.IBPluginDependency 220.IBPluginDependency 221.IBPluginDependency 23.IBPluginDependency 236.IBPluginDependency 239.IBPluginDependency 24.IBPluginDependency 29.IBPluginDependency 295.IBPluginDependency 296.IBPluginDependency 297.IBPluginDependency 298.IBPluginDependency 346.IBPluginDependency 348.IBPluginDependency 349.IBPluginDependency 350.IBPluginDependency 351.IBPluginDependency 354.IBPluginDependency 371.IBPluginDependency 371.IBWindowTemplateEditedContentRect 371.NSWindowTemplate.visibleAtLaunch 372.IBPluginDependency 375.IBPluginDependency 376.IBPluginDependency 377.IBPluginDependency 378.IBPluginDependency 379.IBPluginDependency 5.IBPluginDependency 56.IBPluginDependency 57.IBPluginDependency 58.IBPluginDependency 72.IBPluginDependency 73.IBPluginDependency 74.IBPluginDependency 75.IBPluginDependency 77.IBPluginDependency 78.IBPluginDependency 79.IBPluginDependency 80.IBPluginDependency 81.IBPluginDependency 82.IBPluginDependency 83.IBPluginDependency 92.IBPluginDependency YES com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{73, 556}, {470, 498}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin YES YES 409 YES Controller NSObject YES YES doModal: doSheet: toggleWindow: YES id id id YES YES doModal: doSheet: toggleWindow: YES doModal: id doSheet: id toggleWindow: id YES YES _iPhoneTableView _stickyRowTableView _tableView _window alert field scriptView scrollView window YES NSTableView NSTableView NoodleTableView id id id NSTextView NSScrollView id YES YES _iPhoneTableView _stickyRowTableView _tableView _window alert field scriptView scrollView window YES _iPhoneTableView NSTableView _stickyRowTableView NSTableView _tableView NoodleTableView _window id alert id field id scriptView NSTextView scrollView NSScrollView window id IBProjectSource ./Classes/Controller.h NSDocument YES YES printDocument: revertDocumentToSaved: runPageLayout: saveDocument: saveDocumentAs: saveDocumentTo: YES id id id id id id YES YES printDocument: revertDocumentToSaved: runPageLayout: saveDocument: saveDocumentAs: saveDocumentTo: YES printDocument: id revertDocumentToSaved: id runPageLayout: id saveDocument: id saveDocumentAs: id saveDocumentTo: id IBProjectSource ./Classes/NSDocument.h NSTableView scrollToStickyRow: id scrollToStickyRow: scrollToStickyRow: id IBProjectSource ./Classes/NSTableView.h NoodleTableView NSTableView IBProjectSource ./Classes/NoodleTableView.h 0 IBCocoaFramework com.apple.InterfaceBuilder.CocoaPlugin.macosx com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3 YES 3 YES YES NSMenuCheckmark NSMenuMixedState YES {11, 11} {10, 3} ================================================ FILE: Examples/LineNumberView/LineNumberView-Info.plist ================================================ CFBundleDevelopmentRegion English CFBundleExecutable ${EXECUTABLE_NAME} CFBundleIdentifier com.noodlesoft.${PRODUCT_NAME:rfc1034identifier} CFBundleInfoDictionaryVersion 6.0 CFBundlePackageType APPL CFBundleShortVersionString 1.0 CFBundleSignature ???? CFBundleVersion 1 LSMinimumSystemVersion ${MACOSX_DEPLOYMENT_TARGET} NSMainNibFile MainMenu NSPrincipalClass NSApplication ================================================ FILE: Examples/LineNumberView/MarkerLineNumberView.h ================================================ // // MarkerTextView.h // Line View Test // // Created by Paul Kim on 10/4/08. // Copyright (c) 2008 Noodlesoft, LLC. All rights reserved. // // Permission is hereby granted, free of charge, to any person // obtaining a copy of this software and associated documentation // files (the "Software"), to deal in the Software without // restriction, including without limitation the rights to use, // copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the // Software is furnished to do so, subject to the following // conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. // #import #import "NoodleLineNumberView.h" @interface MarkerLineNumberView : NoodleLineNumberView { NSImage *markerImage; } @end ================================================ FILE: Examples/LineNumberView/MarkerLineNumberView.m ================================================ // // MarkerTextView.m // Line View Test // // Created by Paul Kim on 10/4/08. // Copyright (c) 2008 Noodlesoft, LLC. All rights reserved. // // Permission is hereby granted, free of charge, to any person // obtaining a copy of this software and associated documentation // files (the "Software"), to deal in the Software without // restriction, including without limitation the rights to use, // copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the // Software is furnished to do so, subject to the following // conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. // #import "MarkerLineNumberView.h" #import "NoodleLineNumberMarker.h" #define CORNER_RADIUS 3.0 #define MARKER_HEIGHT 13.0 @implementation MarkerLineNumberView - (void)dealloc { [markerImage release]; [super dealloc]; } - (void)setRuleThickness:(CGFloat)thickness { [super setRuleThickness:thickness]; // Overridden to reset the size of the marker image forcing it to redraw with the new width. // If doing this in a non-subclass of NoodleLineNumberView, you can set it to post frame // notifications and listen for them. [markerImage setSize:NSMakeSize(thickness, MARKER_HEIGHT)]; } - (void)drawMarkerImageIntoRep:(id)rep { NSBezierPath *path; NSRect rect; rect = NSMakeRect(1.0, 2.0, [rep size].width - 2.0, [rep size].height - 3.0); path = [NSBezierPath bezierPath]; [path moveToPoint:NSMakePoint(NSMaxX(rect), NSMinY(rect) + NSHeight(rect) / 2)]; [path lineToPoint:NSMakePoint(NSMaxX(rect) - 5.0, NSMaxY(rect))]; [path appendBezierPathWithArcWithCenter:NSMakePoint(NSMinX(rect) + CORNER_RADIUS, NSMaxY(rect) - CORNER_RADIUS) radius:CORNER_RADIUS startAngle:90 endAngle:180]; [path appendBezierPathWithArcWithCenter:NSMakePoint(NSMinX(rect) + CORNER_RADIUS, NSMinY(rect) + CORNER_RADIUS) radius:CORNER_RADIUS startAngle:180 endAngle:270]; [path lineToPoint:NSMakePoint(NSMaxX(rect) - 5.0, NSMinY(rect))]; [path closePath]; [[NSColor colorWithCalibratedRed:0.003 green:0.56 blue:0.85 alpha:1.0] set]; [path fill]; [[NSColor colorWithCalibratedRed:0 green:0.44 blue:0.8 alpha:1.0] set]; [path setLineWidth:2.0]; [path stroke]; } - (NSImage *)markerImageWithSize:(NSSize)size { if (markerImage == nil) { NSCustomImageRep *rep; markerImage = [[NSImage alloc] initWithSize:size]; rep = [[NSCustomImageRep alloc] initWithDrawSelector:@selector(drawMarkerImageIntoRep:) delegate:self]; [rep setSize:size]; [markerImage addRepresentation:rep]; [rep release]; } return markerImage; } - (void)mouseDown:(NSEvent *)theEvent { NSPoint location; NSUInteger line; location = [self convertPoint:[theEvent locationInWindow] fromView:nil]; line = [self lineNumberForLocation:location.y]; if (line != NSNotFound) { NoodleLineNumberMarker *marker; marker = [self markerAtLine:line]; if (marker != nil) { [self removeMarker:marker]; } else { marker = [[NoodleLineNumberMarker alloc] initWithRulerView:self lineNumber:line image:[self markerImageWithSize:NSMakeSize([self ruleThickness], MARKER_HEIGHT)] imageOrigin:NSMakePoint(0, MARKER_HEIGHT / 2)]; [self addMarker:marker]; [marker release]; } [self setNeedsDisplay:YES]; } } @end ================================================ FILE: Examples/LineNumberView/Read Me.rtf ================================================ {\rtf1\ansi\ansicpg1252\cocoartf1138\cocoasubrtf470 {\fonttbl\f0\fswiss\fcharset0 Helvetica;\f1\fnil\fcharset0 Monaco;} {\colortbl;\red255\green255\blue255;} {\*\listtable{\list\listtemplateid1\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid1\'01\uc0\u8226 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listname ;}\listid1} {\list\listtemplateid2\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid101\'01\uc0\u8226 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listname ;}\listid2} {\list\listtemplateid3\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid201\'01\uc0\u8226 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listname ;}\listid3} {\list\listtemplateid4\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid301\'01\uc0\u8226 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listname ;}\listid4} {\list\listtemplateid5\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid401\'01\uc0\u8226 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listname ;}\listid5} {\list\listtemplateid6\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid501\'01\uc0\u8226 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listname ;}\listid6} {\list\listtemplateid7\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid601\'01\uc0\u8226 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listname ;}\listid7}} {\*\listoverridetable{\listoverride\listid1\listoverridecount0\ls1}{\listoverride\listid2\listoverridecount0\ls2}{\listoverride\listid3\listoverridecount0\ls3}{\listoverride\listid4\listoverridecount0\ls4}{\listoverride\listid5\listoverridecount0\ls5}{\listoverride\listid6\listoverridecount0\ls6}{\listoverride\listid7\listoverridecount0\ls7}} \vieww16040\viewh15820\viewkind0 \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc \f0\b\fs24 \cf0 Line View Test \b0 \ \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural \cf0 \ This is a sample project and test harness for NoodleLineNumberView.\ \ NoodleLineNumberView is an NSRulerView subclass that will show line numbers when the document view of the scrollview is an NSTextView. It numbers logical lines, not visual ones. NoodleLineNumberMarker works in tandem with NoodleLineNumberView to display markers at specific lines.\ \ A discussion of this project can be found at: {\field{\*\fldinst{HYPERLINK "http://www.noodlesoft.com/blog/2008/10/05/displaying-line-numbers-with-nstextview/"}}{\fldrslt http://www.noodlesoft.com/blog/2008/10/05/displaying-line-numbers-with-nstextview/}}\ \ Notes:\ \ \pard\tx220\tx720\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\li720\fi-720\pardirnatural \ls1\ilvl0\cf0 {\listtext \'95 }The view will expand it's width to accommodate the widths of the labels as needed.\ {\listtext \'95 }The included subclass (MarkerLineNumberView) shows how to deal with markers. It also shows how to use an NSCustomImageRep to do the drawing. This allows you to reset the size of the image and have the drawing adjust as needed (this happens if the line number view changes width because the line numbers gained or lost a digit). If you decide to implement most of this stuff in an external class (not a subclass), you can set the line number view to post frame changed notifications and listen for them.\ {\listtext \'95 }Note that markers are tied to numerical lines, not semantic ones. So, if you have a marker at line 50 and insert a new line at line 49, the marker will not shift to line 51 to point at the same line of text but will stay at line 50 pointing at whatever text is there now. Contrast with XCode where the markers move with insertions and deletions of lines (at least as best as it can). This is logic that you'll have to supply yourself.\ \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural \cf0 \ To integrate NoodleLineNumberView, just create one and set it as the vertical ruler of the scrollview. Depending on the order of operations, you may need to set the client view of the NoodleLineNumberView to the NSTextView manually.\ \ This project actually uses a subclass of NoodleLineNumberView called MarkerLineNumberView. This class shows how one can integrate adding markers. Just click in the line number view to toggle a marker. It's more of an example than a reusable class since your markers may look different and you may have a different UI for adding them. Nonetheless, it shows the basics of how to do it.\ \ \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural \b \cf0 Possible Performance Improvements\ \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural \b0 \cf0 \ For performance, NoodleLineView keeps an array of the character indices for the start of each line. This gets recalculated whenever the text changes but at least it's cached for redisplays (such as scrolling around). It also only redraw the labels for the lines that are showing.\ \ It seems peppy enough for me, testing on a Powerbook 12" (G4) on Leopard. If you feel the need to optimize it further (I advise you Shark it first instead of making assumptions, though), here are some areas that could be improved:\ \ \pard\tx220\tx720\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\li720\fi-720\pardirnatural \ls2\ilvl0\cf0 {\listtext \'95 }\strike \strikec0 Right now, the character indices are recalculated every time the text changes. I only listen for a \f1 NSTextDidChangeNotification \f0 which is pretty coarse as there's no notion of what changed. You need to hook in deeper to get finer grained details of what characters were affected and see if the line indices need to be recalculated at all (check for whether a line ending was added or removed) or what particular lines should be recalculated (if a line was changed, only recalculate the lines after it).\strike0\striked0 (4/12/2012) This is now implemented. Checks the edited range and only recalculates the lines from that point onwards.\ {\listtext \'95 }The layout coordinates of each line can also be cached. If you tie into NSLayoutManager's delegate methods, you can find out when the layout has been invalidated. This would be helpful for cases where the view is scrolled or otherwise redisplayed without having the layout changed. Invalidations would happen in cases like when the view is resized in which case, you recalculate and recache. I have my doubts about whether this will save much but Shark it and find out.\ \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural \cf0 \ The first two were not done because I wanted this subclass to be self-contained and not interfere with any delegates that may already be in place.\ \ \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural \b \cf0 Contact \b0 \ \ Just go {\field{\*\fldinst{HYPERLINK "http://www.noodlesoft.com/about.php"}}{\fldrslt www.noodlesoft.com}} and shoot me an email. Or visit the blog article linked above and leave a comment. Bugs, suggestions and other feedback appreciated.\ \ \ \b License \b0 \ \ I am releasing this under the MIT license.\ \ ____________________________________\ \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural \f1 \cf0 Copyright (c) 2008-2009 Noodlesoft, LLC. All Rights Reserved.\ \ Permission is hereby granted, free of charge, to any person\ obtaining a copy of this software and associated documentation\ files (the "Software"), to deal in the Software without\ restriction, including without limitation the rights to use,\ copy, modify, merge, publish, distribute, sublicense, and/or sell\ copies of the Software, and to permit persons to whom the\ Software is furnished to do so, subject to the following\ conditions:\ \ The above copyright notice and this permission notice shall be\ included in all copies or substantial portions of the Software.\ \ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\ OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\ OTHER DEALINGS IN THE SOFTWARE.\ \pard\tx220\tx720\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\li720\fi-720\pardirnatural \ls3\ilvl0 \f0\b \cf0 \ \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural \cf0 \ Changelog \b0 \ \ 0.4.1:\ \pard\tx220\tx720\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\li720\fi-720\pardirnatural \ls4\ilvl0\cf0 {\listtext \'95 }Fixed display glitch when scrolling after the line number view resizes when linked against/running on 10.4. Apparently, NSRulerView's \f1 setRuleThickness: \f0 does not like non-integral values.\ \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural \cf0 \ 0.4:\ \pard\tx220\tx720\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\li720\fi-720\pardirnatural \ls5\ilvl0\cf0 {\listtext \'95 }Changed default font to use label font. Not sure if semantically, that's what XCode uses but it matches for the time being.\ {\listtext \'95 }Fixed display bugs introduced in 0.3 when line number view resizes itself.\ {\listtext \'95 }Added methods for setting various colors. The alternate text color is the color used by the line number label when a marker is drawn under it.\ {\listtext \'95 }Miscellaneous tweaks.\ \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural \cf0 \ 0.3:\ \pard\tx220\tx720\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\li720\fi-720\pardirnatural \ls6\ilvl0\cf0 {\listtext \'95 }Now listens for NSTextStorage's NSTextStorageDidProcessEditingNotification instead of NSTextDidChangeNotification. The former includes programmatic changes to the text.\ {\listtext \'95 }Was not taking text storage's inset into account when lining up labels. OSAScriptView, for one, had a non-zero inset. Should be fixed now.\ {\listtext \'95 }Calculates lines lazily allowing multiple programmatic text changes to be batched up.\ \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural \cf0 \ 0.2:\ \pard\tx220\tx720\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\li720\fi-720\pardirnatural \ls7\ilvl0\cf0 {\listtext \'95 }Initial public release\ \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural \cf0 \ } ================================================ FILE: Examples/LineNumberView/main.m ================================================ // // main.m // Line View Test // // Created by Paul Kim on 10/5/08. // Copyright Noodlesoft, LLC 2008. All rights reserved. // #import int main(int argc, char *argv[]) { return NSApplicationMain(argc, (const char **) argv); } ================================================ FILE: Examples/ModalResponder/Controller.h ================================================ // // Controller.h // ModalResponderTest // // Created by Paul Kim on 3/6/08. // Copyright 2008-2009 Noodlesoft, LLC. All rights reserved. // #import @interface Controller : NSObject { IBOutlet id window; IBOutlet id alert; IBOutlet id field; } - (IBAction)doModal:sender; - (IBAction)doSheet:sender; @end ================================================ FILE: Examples/ModalResponder/Controller.m ================================================ // // Controller.m // ModalResponderTest // // Created by Paul Kim on 3/6/08. // Copyright 2008-2009 Noodlesoft, LLC. All rights reserved. // #import "Controller.h" @implementation Controller - (IBAction)doModal:sender { NSInteger returnCode; [field setStringValue:@""]; returnCode = [NSApp runModalForWindow:alert]; if (returnCode == NSOKButton) { [field setStringValue:@"OK!"]; } else { [field setStringValue:@"Cancel"]; } } - (IBAction)doSheet:sender { [field setStringValue:@""]; [NSApp beginSheet:alert modalForWindow:window modalDelegate:self didEndSelector:@selector(sheetDidEnd:returnCode:contextInfo:) contextInfo:nil]; //PENDING /* NSLog(@"ALERT: %@", alert); NSLog(@"PARENT: %@", [alert parentWindow]); NSLog(@"SHEET: %@", [[alert parentWindow] attachedSheet]); NSLog(@"WINDOW: %@", window); NSLog(@"CHILD: %@", [window childWindows]); NSLog(@"ALERT CHILD: %@", [alert childWindows]); NSLog(@"ATTACHED: %@", [window attachedSheet]); */ } - (void)sheetDidEnd:(NSWindow *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo { if (returnCode == NSOKButton) { [field setStringValue:@"OK!"]; } else { [field setStringValue:@"Cancel"]; } } @end ================================================ FILE: Examples/ModalResponder/English.lproj/MainMenu.xib ================================================ 0 10B504 732 1038.2 437.00 com.apple.InterfaceBuilder.CocoaPlugin 732 YES YES com.apple.InterfaceBuilder.CocoaPlugin YES YES YES YES NSApplication FirstResponder NSApplication AMainMenu YES NewApplication 1048576 2147483647 NSImage NSMenuCheckmark NSImage NSMenuMixedState submenuAction: NewApplication YES About NewApplication 2147483647 YES YES 1048576 2147483647 Preferences… , 1048576 2147483647 YES YES 1048576 2147483647 Services 1048576 2147483647 submenuAction: Services YES _NSServicesMenu YES YES 1048576 2147483647 Hide NewApplication h 1048576 2147483647 Hide Others h 1572864 2147483647 Show All 1048576 2147483647 YES YES 1048576 2147483647 Quit NewApplication q 1048576 2147483647 _NSAppleMenu File 1048576 2147483647 submenuAction: File YES New n 1048576 2147483647 Open… o 1048576 2147483647 Open Recent 1048576 2147483647 submenuAction: Open Recent YES Clear Menu 1048576 2147483647 _NSRecentDocumentsMenu YES YES 1048576 2147483647 Close w 1048576 2147483647 Save s 1048576 2147483647 Save As… S 1179648 2147483647 Revert to Saved 2147483647 YES YES 1048576 2147483647 Page Setup... P 1179648 2147483647 Print… p 1048576 2147483647 Edit 1048576 2147483647 submenuAction: Edit YES Undo z 1048576 2147483647 Redo Z 1179648 2147483647 YES YES 1048576 2147483647 Cut x 1048576 2147483647 Copy c 1048576 2147483647 Paste v 1048576 2147483647 Delete 1048576 2147483647 Select All a 1048576 2147483647 YES YES 1048576 2147483647 Find 1048576 2147483647 submenuAction: Find YES Find… f 1048576 2147483647 1 Find Next g 1048576 2147483647 2 Find Previous G 1179648 2147483647 3 Use Selection for Find e 1048576 2147483647 7 Jump to Selection j 1048576 2147483647 Spelling and Grammar 1048576 2147483647 submenuAction: Spelling and Grammar YES Show Spelling… : 1048576 2147483647 Check Spelling ; 1048576 2147483647 Check Spelling While Typing 1048576 2147483647 Check Grammar With Spelling 1048576 2147483647 Substitutions 1048576 2147483647 submenuAction: Substitutions YES Smart Copy/Paste f 1048576 2147483647 1 Smart Quotes g 1048576 2147483647 2 Smart Links G 1179648 2147483647 3 Speech 1048576 2147483647 submenuAction: Speech YES Start Speaking 1048576 2147483647 Stop Speaking 1048576 2147483647 Format 1048576 2147483647 submenuAction: Format YES Show Fonts t 1048576 2147483647 Show Colors C 1179648 2147483647 View 1048576 2147483647 submenuAction: View YES Show Toolbar t 1572864 2147483647 Customize Toolbar… 1048576 2147483647 Window 1048576 2147483647 submenuAction: Window YES Minimize m 1048576 2147483647 Zoom 1048576 2147483647 YES YES 1048576 2147483647 Bring All to Front 1048576 2147483647 _NSWindowsMenu Help 1048576 2147483647 submenuAction: Help YES NewApplication Help ? 1048576 2147483647 _NSMainMenu 15 2 {{335, 536}, {306, 214}} 1946157056 Modal Testing Thingy NSWindow {1.79769e+308, 1.79769e+308} 256 YES 256 {{57, 25}, {192, 32}} YES 1 2 YES 67239424 134217728 Modal LucidaGrande 13 1044 -2038284033 1 200 25 67239424 134217728 Sheet -2038284033 1 200 25 {96, 32} {0, 0} -2080374784 67239424 134217728 Button -2038284033 1 200 25 -1 -1 6 System controlColor 3 MC42NjY2NjY2NjY3AA 268 {{73, 112}, {160, 44}} YES 67239488 138413056 LucidaGrande 36 16 6 System controlTextColor 3 MAA {306, 214} {{0, 0}, {1920, 1178}} {1.79769e+308, 1.79769e+308} Controller 1 2 {{196, 369}, {336, 141}} -1543503872 NSPanel {1.79769e+308, 1.79769e+308} 256 YES 256 {{155, 11}, {172, 32}} YES 1 2 YES 67239424 134217728 Cancel -2038284033 1 Gw 200 25 -1006502400 134217728 OK -2038284033 1 DQ 200 25 {86, 32} {0, 0} -2080374784 67239424 134217728 Button -2038284033 1 200 25 -1 -1 268 {{148, 80}, {31, 17}} YES 67239488 272630784 Ok? 268 YES YES Apple PDF pasteboard type Apple PICT pasteboard type Apple PNG pasteboard type NSFilenamesPboardType NeXT Encapsulated PostScript v1.2 pasteboard type NeXT TIFF v4.0 pasteboard type {{20, 57}, {64, 64}} YES 130560 33554432 NSImage NSApplicationIcon 0 0 0 NO YES {336, 141} {{0, 0}, {1920, 1178}} {1.79769e+308, 1.79769e+308} YES performMiniaturize: 37 arrangeInFront: 39 print: 86 runPageLayout: 87 clearRecentDocuments: 127 orderFrontStandardAboutPanel: 142 performClose: 193 toggleContinuousSpellChecking: 222 undo: 223 copy: 224 checkSpelling: 225 paste: 226 stopSpeaking: 227 cut: 228 showGuessPanel: 230 redo: 231 selectAll: 232 startSpeaking: 233 delete: 235 performZoom: 240 performFindPanelAction: 241 centerSelectionInVisibleArea: 245 toggleGrammarChecking: 347 toggleSmartInsertDelete: 355 toggleAutomaticQuoteSubstitution: 356 toggleAutomaticLinkDetection: 357 showHelp: 360 orderFrontColorPanel: 361 saveDocument: 362 saveDocumentAs: 363 revertDocumentToSaved: 364 runToolbarCustomizationPalette: 365 toggleToolbarShown: 366 hide: 367 hideOtherApplications: 368 terminate: 369 unhideAllApplications: 370 newDocument: 373 openDocument: 374 confirmModal: 388 cancelModal: 389 alert 392 window 393 doModal: 408 doSheet: 409 field 412 delegate 415 YES 0 -2 File's Owner -1 First Responder -3 Application 29 YES MainMenu 19 YES 56 YES 103 YES 1 217 YES 83 YES 81 YES 75 3 80 8 78 6 72 82 9 124 YES 77 5 73 1 79 7 112 10 74 2 125 YES 126 205 YES 202 198 207 214 199 203 197 206 215 218 YES 216 YES 200 YES 219 201 204 220 YES 213 210 221 208 209 106 YES 2 111 57 YES 58 134 150 136 1111 144 129 121 143 236 131 YES 149 145 130 24 YES 92 5 239 23 295 YES 296 YES 297 298 299 YES 300 YES 344 345 211 YES 212 YES 195 196 346 348 YES 349 YES 350 351 354 371 YES 372 YES 375 377 YES 378 YES 381 YES 382 380 386 396 YES 397 395 407 410 YES 411 413 YES 414 416 YES 417 YES YES -3.IBPluginDependency 103.IBPluginDependency 103.ImportedFromIB2 106.IBPluginDependency 106.ImportedFromIB2 106.editorWindowContentRectSynchronizationRect 111.IBPluginDependency 111.ImportedFromIB2 112.IBPluginDependency 112.ImportedFromIB2 124.IBPluginDependency 124.ImportedFromIB2 125.IBPluginDependency 125.ImportedFromIB2 125.editorWindowContentRectSynchronizationRect 126.IBPluginDependency 126.ImportedFromIB2 129.IBPluginDependency 129.ImportedFromIB2 130.IBPluginDependency 130.ImportedFromIB2 130.editorWindowContentRectSynchronizationRect 131.IBPluginDependency 131.ImportedFromIB2 134.IBPluginDependency 134.ImportedFromIB2 136.IBPluginDependency 136.ImportedFromIB2 143.IBPluginDependency 143.ImportedFromIB2 144.IBPluginDependency 144.ImportedFromIB2 145.IBPluginDependency 145.ImportedFromIB2 149.IBPluginDependency 149.ImportedFromIB2 150.IBPluginDependency 150.ImportedFromIB2 19.IBPluginDependency 19.ImportedFromIB2 195.IBPluginDependency 195.ImportedFromIB2 196.IBPluginDependency 196.ImportedFromIB2 197.IBPluginDependency 197.ImportedFromIB2 198.IBPluginDependency 198.ImportedFromIB2 199.IBPluginDependency 199.ImportedFromIB2 200.IBPluginDependency 200.ImportedFromIB2 200.editorWindowContentRectSynchronizationRect 201.IBPluginDependency 201.ImportedFromIB2 202.IBPluginDependency 202.ImportedFromIB2 203.IBPluginDependency 203.ImportedFromIB2 204.IBPluginDependency 204.ImportedFromIB2 205.IBPluginDependency 205.ImportedFromIB2 205.editorWindowContentRectSynchronizationRect 206.IBPluginDependency 206.ImportedFromIB2 207.IBPluginDependency 207.ImportedFromIB2 208.IBPluginDependency 208.ImportedFromIB2 209.IBPluginDependency 209.ImportedFromIB2 210.IBPluginDependency 210.ImportedFromIB2 211.IBPluginDependency 211.ImportedFromIB2 212.IBPluginDependency 212.ImportedFromIB2 212.editorWindowContentRectSynchronizationRect 213.IBPluginDependency 213.ImportedFromIB2 214.IBPluginDependency 214.ImportedFromIB2 215.IBPluginDependency 215.ImportedFromIB2 216.IBPluginDependency 216.ImportedFromIB2 217.IBPluginDependency 217.ImportedFromIB2 218.IBPluginDependency 218.ImportedFromIB2 219.IBPluginDependency 219.ImportedFromIB2 220.IBPluginDependency 220.ImportedFromIB2 220.editorWindowContentRectSynchronizationRect 221.IBPluginDependency 221.ImportedFromIB2 23.IBPluginDependency 23.ImportedFromIB2 236.IBPluginDependency 236.ImportedFromIB2 239.IBPluginDependency 239.ImportedFromIB2 24.IBPluginDependency 24.ImportedFromIB2 24.editorWindowContentRectSynchronizationRect 29.IBEditorWindowLastContentRect 29.IBPluginDependency 29.ImportedFromIB2 29.WindowOrigin 29.editorWindowContentRectSynchronizationRect 295.IBPluginDependency 296.IBPluginDependency 296.editorWindowContentRectSynchronizationRect 297.IBPluginDependency 298.IBPluginDependency 299.IBPluginDependency 300.IBPluginDependency 300.editorWindowContentRectSynchronizationRect 344.IBPluginDependency 345.IBPluginDependency 346.IBPluginDependency 346.ImportedFromIB2 348.IBPluginDependency 348.ImportedFromIB2 349.IBPluginDependency 349.ImportedFromIB2 349.editorWindowContentRectSynchronizationRect 350.IBPluginDependency 350.ImportedFromIB2 351.IBPluginDependency 351.ImportedFromIB2 354.IBPluginDependency 354.ImportedFromIB2 371.IBEditorWindowLastContentRect 371.IBPluginDependency 371.IBWindowTemplateEditedContentRect 371.NSWindowTemplate.visibleAtLaunch 371.editorWindowContentRectSynchronizationRect 372.IBPluginDependency 377.IBEditorWindowLastContentRect 377.IBPluginDependency 377.IBWindowTemplateEditedContentRect 377.NSWindowTemplate.visibleAtLaunch 377.editorWindowContentRectSynchronizationRect 378.IBPluginDependency 380.IBPluginDependency 381.IBPluginDependency 382.IBPluginDependency 386.IBPluginDependency 395.IBPluginDependency 396.IBPluginDependency 397.IBPluginDependency 407.IBPluginDependency 410.IBPluginDependency 411.IBPluginDependency 413.IBPluginDependency 414.IBPluginDependency 416.IBPluginDependency 417.IBPluginDependency 5.IBPluginDependency 5.ImportedFromIB2 56.IBPluginDependency 56.ImportedFromIB2 57.IBPluginDependency 57.ImportedFromIB2 57.editorWindowContentRectSynchronizationRect 58.IBPluginDependency 58.ImportedFromIB2 72.IBPluginDependency 72.ImportedFromIB2 73.IBPluginDependency 73.ImportedFromIB2 74.IBPluginDependency 74.ImportedFromIB2 75.IBPluginDependency 75.ImportedFromIB2 77.IBPluginDependency 77.ImportedFromIB2 78.IBPluginDependency 78.ImportedFromIB2 79.IBPluginDependency 79.ImportedFromIB2 80.IBPluginDependency 80.ImportedFromIB2 81.IBPluginDependency 81.ImportedFromIB2 81.editorWindowContentRectSynchronizationRect 82.IBPluginDependency 82.ImportedFromIB2 83.IBPluginDependency 83.ImportedFromIB2 92.IBPluginDependency 92.ImportedFromIB2 YES com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{596, 852}, {216, 23}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{522, 812}, {146, 23}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{436, 809}, {64, 6}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{608, 612}, {275, 83}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{187, 434}, {243, 243}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{608, 612}, {167, 43}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{608, 612}, {241, 103}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{525, 802}, {197, 73}} {{21, 1080}, {478, 20}} com.apple.InterfaceBuilder.CocoaPlugin {74, 862} {{6, 978}, {478, 20}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{475, 832}, {234, 43}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{231, 634}, {176, 43}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{608, 612}, {215, 63}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{63, 851}, {306, 214}} com.apple.InterfaceBuilder.CocoaPlugin {{63, 851}, {306, 214}} {{549, 673}, {306, 214}} com.apple.InterfaceBuilder.CocoaPlugin {{42, 947}, {336, 141}} com.apple.InterfaceBuilder.CocoaPlugin {{42, 947}, {336, 141}} {{709, 705}, {336, 141}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{23, 794}, {245, 183}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{145, 474}, {199, 203}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin YES YES YES YES 417 YES Controller NSObject YES YES scriptView scrollView YES NSTextView NSScrollView IBProjectSource Examples/LineNumberView/Controller.h Controller NSObject YES YES doModal: doSheet: YES id id YES YES alert field window YES id id id IBProjectSource Examples/ModalResponder/Controller.h Controller NSObject YES YES _iPhoneTableView _stickyRowTableView YES NSTableView NSTableView IBProjectSource Examples/StickyRowTableView Revue/Controller.h Controller NSObject toggleWindow: id _window id IBProjectSource Examples/Window Effects/Controller.h Controller NSObject IBUserSource FirstResponder NSObject YES YES cancelModal: cancelSheet: confirmModal: confirmSheet: YES id id id id IBUserSource NSObject IBProjectSource NSObject-NoodlePerformWhenIdle.h NSObject IBProjectSource NoodleStickyRowTableView.h NSResponder YES YES cancelModal: confirmModal: YES id id IBProjectSource NSResponder-NoodleModalExtensions.h NSResponder NSObject YES YES cancelSheet: confirmSheet: YES id id IBUserSource NSTableView scrollToStickyRow: id NSWindow YES YES cancelModal: confirmModal: YES id id NSWindow IBProjectSource NSWindow-NoodleEffects.h YES NSActionCell NSCell IBFrameworkSource AppKit.framework/Headers/NSActionCell.h NSApplication NSResponder IBFrameworkSource AppKit.framework/Headers/NSApplication.h NSApplication IBFrameworkSource AppKit.framework/Headers/NSApplicationScripting.h NSApplication IBFrameworkSource AppKit.framework/Headers/NSColorPanel.h NSApplication IBFrameworkSource AppKit.framework/Headers/NSHelpManager.h NSApplication IBFrameworkSource AppKit.framework/Headers/NSPageLayout.h NSApplication IBFrameworkSource AppKit.framework/Headers/NSUserInterfaceItemSearching.h NSBrowser NSControl IBFrameworkSource AppKit.framework/Headers/NSBrowser.h NSButtonCell NSActionCell IBFrameworkSource AppKit.framework/Headers/NSButtonCell.h NSCell NSObject IBFrameworkSource AppKit.framework/Headers/NSCell.h NSControl NSView IBFrameworkSource AppKit.framework/Headers/NSControl.h NSDocument NSObject YES YES printDocument: revertDocumentToSaved: runPageLayout: saveDocument: saveDocumentAs: saveDocumentTo: YES id id id id id id IBFrameworkSource AppKit.framework/Headers/NSDocument.h NSDocument IBFrameworkSource AppKit.framework/Headers/NSDocumentScripting.h NSDocumentController NSObject YES YES clearRecentDocuments: newDocument: openDocument: saveAllDocuments: YES id id id id IBFrameworkSource AppKit.framework/Headers/NSDocumentController.h NSFormatter NSObject IBFrameworkSource Foundation.framework/Headers/NSFormatter.h NSImageCell NSCell IBFrameworkSource AppKit.framework/Headers/NSImageCell.h NSImageView NSControl IBFrameworkSource AppKit.framework/Headers/NSImageView.h NSMatrix NSControl IBFrameworkSource AppKit.framework/Headers/NSMatrix.h NSMenu NSObject IBFrameworkSource AppKit.framework/Headers/NSMenu.h NSMenuItem NSObject IBFrameworkSource AppKit.framework/Headers/NSMenuItem.h NSMovieView NSView IBFrameworkSource AppKit.framework/Headers/NSMovieView.h NSObject IBFrameworkSource AppKit.framework/Headers/NSAccessibility.h NSObject NSObject NSObject NSObject NSObject IBFrameworkSource AppKit.framework/Headers/NSDictionaryController.h NSObject IBFrameworkSource AppKit.framework/Headers/NSDragging.h NSObject IBFrameworkSource AppKit.framework/Headers/NSFontManager.h NSObject IBFrameworkSource AppKit.framework/Headers/NSFontPanel.h NSObject IBFrameworkSource AppKit.framework/Headers/NSKeyValueBinding.h NSObject NSObject IBFrameworkSource AppKit.framework/Headers/NSNibLoading.h NSObject IBFrameworkSource AppKit.framework/Headers/NSOutlineView.h NSObject IBFrameworkSource AppKit.framework/Headers/NSPasteboard.h NSObject IBFrameworkSource AppKit.framework/Headers/NSSavePanel.h NSObject IBFrameworkSource AppKit.framework/Headers/NSTableView.h NSObject IBFrameworkSource AppKit.framework/Headers/NSToolbarItem.h NSObject IBFrameworkSource AppKit.framework/Headers/NSView.h NSObject IBFrameworkSource Foundation.framework/Headers/NSArchiver.h NSObject IBFrameworkSource Foundation.framework/Headers/NSClassDescription.h NSObject IBFrameworkSource Foundation.framework/Headers/NSError.h NSObject IBFrameworkSource Foundation.framework/Headers/NSFileManager.h NSObject IBFrameworkSource Foundation.framework/Headers/NSKeyValueCoding.h NSObject IBFrameworkSource Foundation.framework/Headers/NSKeyValueObserving.h NSObject IBFrameworkSource Foundation.framework/Headers/NSKeyedArchiver.h NSObject IBFrameworkSource Foundation.framework/Headers/NSObject.h NSObject IBFrameworkSource Foundation.framework/Headers/NSObjectScripting.h NSObject IBFrameworkSource Foundation.framework/Headers/NSPortCoder.h NSObject IBFrameworkSource Foundation.framework/Headers/NSRunLoop.h NSObject IBFrameworkSource Foundation.framework/Headers/NSScriptClassDescription.h NSObject IBFrameworkSource Foundation.framework/Headers/NSScriptKeyValueCoding.h NSObject IBFrameworkSource Foundation.framework/Headers/NSScriptObjectSpecifiers.h NSObject IBFrameworkSource Foundation.framework/Headers/NSScriptWhoseTests.h NSObject IBFrameworkSource Foundation.framework/Headers/NSThread.h NSObject IBFrameworkSource Foundation.framework/Headers/NSURL.h NSObject IBFrameworkSource Foundation.framework/Headers/NSURLConnection.h NSObject IBFrameworkSource Foundation.framework/Headers/NSURLDownload.h NSPanel NSWindow IBFrameworkSource AppKit.framework/Headers/NSPanel.h NSResponder IBFrameworkSource AppKit.framework/Headers/NSInterfaceStyle.h NSResponder NSObject IBFrameworkSource AppKit.framework/Headers/NSResponder.h NSScrollView NSView IBFrameworkSource AppKit.framework/Headers/NSScrollView.h NSTableView NSControl NSText NSView IBFrameworkSource AppKit.framework/Headers/NSText.h NSTextField NSControl IBFrameworkSource AppKit.framework/Headers/NSTextField.h NSTextFieldCell NSActionCell IBFrameworkSource AppKit.framework/Headers/NSTextFieldCell.h NSTextView NSText IBFrameworkSource AppKit.framework/Headers/NSTextView.h NSView IBFrameworkSource AppKit.framework/Headers/NSClipView.h NSView NSView IBFrameworkSource AppKit.framework/Headers/NSRulerView.h NSView NSResponder NSWindow IBFrameworkSource AppKit.framework/Headers/NSDrawer.h NSWindow NSResponder IBFrameworkSource AppKit.framework/Headers/NSWindow.h NSWindow IBFrameworkSource AppKit.framework/Headers/NSWindowScripting.h 0 com.apple.InterfaceBuilder.CocoaPlugin.macosx com.apple.InterfaceBuilder.CocoaPlugin.macosx com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3 YES ../../ModalResponderTest.xcodeproj 3 ================================================ FILE: Examples/ModalResponder/ModalResponder-Info.plist ================================================ CFBundleDevelopmentRegion English CFBundleExecutable ${EXECUTABLE_NAME} CFBundleIdentifier com.noodlesoft.${PRODUCT_NAME:rfc1034identifier} CFBundleInfoDictionaryVersion 6.0 CFBundlePackageType APPL CFBundleShortVersionString 1.0 CFBundleSignature ???? CFBundleVersion 1 LSMinimumSystemVersion ${MACOSX_DEPLOYMENT_TARGET} NSMainNibFile MainMenu NSPrincipalClass NSApplication ================================================ FILE: Examples/ModalResponder/Read Me.rtf ================================================ {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf110 {\fonttbl\f0\fswiss\fcharset0 Helvetica;\f1\fnil\fcharset0 Monaco;\f2\fmodern\fcharset0 Courier; } {\colortbl;\red255\green255\blue255;} \margl1440\margr1440\vieww15820\viewh15260\viewkind0 \pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural \f0\b\fs24 \cf0 ModalResponder \b0 \ \ This is a simple demo of an NSResponder category which deals with modal windows and sheets. If you are creating a modal window or sheet that has "OK" and "Cancel" buttons, you most likely end up writing some glue method that just orders the window out and returns a code. This category makes it so that all you have to do is hook up the buttons to either the \f1\fs22 -confirmModal: \f0\fs24 or \f1\fs22 -cancelModal: \f0\fs24 actions on the First Responder in Interface Builder. The methods will set a return code of NSOKButton and NSCancelButton respectively. No extra glue though you may have to add the methods to NSResponder in IB.\ \ For more details check out the related blog post at http://www.noodlesoft.com/blog/2008/03/10/modal-glue/\ \ Enjoy.\ \ Paul Kim\ http://www.noodlesoft.com\ \ ========================================\ \ This code is provided for free under the terms of the MIT license:\ \ \pard\pardeftab720\sl360\sa180\ql\qnatural \f2 \cf0 Copyright (c) 2008-2009 Noodlesoft, LLC. All Rights Reserved\ Permission is hereby granted, free of charge, to any person obtaining a copy\uc0\u8232 of this software and associated documentation files (the "Software"), to deal\u8232 in the Software without restriction, including without limitation the rights\u8232 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\u8232 copies of the Software, and to permit persons to whom the Software is\u8232 furnished to do so, subject to the following conditions:\ The above copyright notice and this permission notice shall be included in\uc0\u8232 all copies or substantial portions of the Software.\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\uc0\u8232 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\u8232 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\u8232 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\u8232 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\u8232 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\u8232 THE SOFTWARE.\ } ================================================ FILE: Examples/ModalResponder/main.m ================================================ // // main.m // ModalResponderTest // // Created by Paul Kim on 3/6/08. // Copyright __MyCompanyName__ 2008. All rights reserved. // #import int main(int argc, char *argv[]) { return NSApplicationMain(argc, (const char **) argv); } ================================================ FILE: Examples/StickyRowTableView Revue/Controller.h ================================================ // // Controller.h // // Created by Paul Kim on 8/21/09. // Copyright 2009-2012 Noodlesoft, LLC. All rights reserved. // // Permission is hereby granted, free of charge, to any person // obtaining a copy of this software and associated documentation // files (the "Software"), to deal in the Software without // restriction, including without limitation the rights to use, // copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the // Software is furnished to do so, subject to the following // conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. // #import @class NoodleTableView; @interface Controller : NSObject { IBOutlet NoodleTableView *_stickyRowTableView; IBOutlet NSTableView *_iPhoneTableView; NSMutableArray *_names; } @end ================================================ FILE: Examples/StickyRowTableView Revue/Controller.m ================================================ // // Controller.m // // Created by Paul Kim on 8/21/09. // Copyright 2009 Noodlesoft, LLC. All rights reserved. // // Permission is hereby granted, free of charge, to any person // obtaining a copy of this software and associated documentation // files (the "Software"), to deal in the Software without // restriction, including without limitation the rights to use, // copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the // Software is furnished to do so, subject to the following // conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. // #import "Controller.h" #import "NoodleTableView.h" @implementation Controller - (void)awakeFromNib { NSString *fileContents; NSUInteger i, count; NSString *temp, *prefix, *currentPrefix; NSArray *words; fileContents = [NSString stringWithContentsOfFile:@"/usr/share/dict/propernames" usedEncoding:NULL error:NULL]; words = [fileContents componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]]; [self willChangeValueForKey:@"names"]; words = [words sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)]; _names = [[NSMutableArray alloc] init]; count = [words count]; currentPrefix = nil; for (i = 0; i < count; i++) { temp = [words objectAtIndex:i]; if ([temp length] > 0) { prefix = [temp substringToIndex:1]; if ((currentPrefix == nil) || ([currentPrefix caseInsensitiveCompare:prefix] != NSOrderedSame)) { currentPrefix = [prefix uppercaseString]; [_names addObject:currentPrefix]; } [_names addObject:temp]; } } [_stickyRowTableView setShowsStickyRowHeader:YES]; [_stickyRowTableView reloadData]; [_iPhoneTableView reloadData]; } - (BOOL)_isHeader:(NSInteger)rowIndex { return ((rowIndex == 0) || [[[_names objectAtIndex:rowIndex] substringToIndex:1] caseInsensitiveCompare:[[_names objectAtIndex:rowIndex - 1] substringToIndex:1]] != NSOrderedSame); } #pragma mark NSTableDataSource methods - (NSInteger)numberOfRowsInTableView:(NSTableView *)aTableView { return [_names count]; } - (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex { return [_names objectAtIndex:rowIndex]; } - (BOOL)tableView:(NSTableView *)tableView isGroupRow:(NSInteger)row { return [self _isHeader:row]; } @end ================================================ FILE: Examples/StickyRowTableView Revue/English.lproj/MainMenu.xib ================================================ 1050 10B504 740 1038.2 437.00 com.apple.InterfaceBuilder.CocoaPlugin 740 YES YES com.apple.InterfaceBuilder.CocoaPlugin YES YES YES YES NSApplication FirstResponder NSApplication AMainMenu YES NoodleStickyRowTableView Test 1048576 2147483647 NSImage NSMenuCheckmark NSImage NSMenuMixedState submenuAction: NoodleStickyRowTableView Test YES About NoodleStickyRowTableViewTest 2147483647 YES YES 1048576 2147483647 Preferences… , 1048576 2147483647 YES YES 1048576 2147483647 Services 1048576 2147483647 submenuAction: Services YES _NSServicesMenu YES YES 1048576 2147483647 Hide NoodleStickyRowTableViewTest h 1048576 2147483647 Hide Others h 1572864 2147483647 Show All 1048576 2147483647 YES YES 1048576 2147483647 Quit NoodleStickyRowTableViewTest q 1048576 2147483647 _NSAppleMenu File 1048576 2147483647 submenuAction: File YES New n 1048576 2147483647 Open… o 1048576 2147483647 Open Recent 1048576 2147483647 submenuAction: Open Recent YES Clear Menu 1048576 2147483647 _NSRecentDocumentsMenu YES YES 1048576 2147483647 Close w 1048576 2147483647 Save s 1048576 2147483647 Save As… S 1179648 2147483647 Revert to Saved 2147483647 YES YES 1048576 2147483647 Page Setup... P 1179648 2147483647 Print… p 1048576 2147483647 Edit 1048576 2147483647 submenuAction: Edit YES Undo z 1048576 2147483647 Redo Z 1179648 2147483647 YES YES 1048576 2147483647 Cut x 1048576 2147483647 Copy c 1048576 2147483647 Paste v 1048576 2147483647 Delete 1048576 2147483647 Select All a 1048576 2147483647 YES YES 1048576 2147483647 Find 1048576 2147483647 submenuAction: Find YES Find… f 1048576 2147483647 1 Find Next g 1048576 2147483647 2 Find Previous G 1179648 2147483647 3 Use Selection for Find e 1048576 2147483647 7 Jump to Selection j 1048576 2147483647 Spelling and Grammar 1048576 2147483647 submenuAction: Spelling and Grammar YES Show Spelling… : 1048576 2147483647 Check Spelling ; 1048576 2147483647 Check Spelling While Typing 1048576 2147483647 Check Grammar With Spelling 1048576 2147483647 Substitutions 1048576 2147483647 submenuAction: Substitutions YES Smart Copy/Paste f 1048576 2147483647 1 Smart Quotes g 1048576 2147483647 2 Smart Links G 1179648 2147483647 3 Speech 1048576 2147483647 submenuAction: Speech YES Start Speaking 1048576 2147483647 Stop Speaking 1048576 2147483647 Format 2147483647 submenuAction: Format YES Font 2147483647 submenuAction: Font YES Show Fonts t 1048576 2147483647 Bold b 1048576 2147483647 2 Italic i 1048576 2147483647 1 Underline u 1048576 2147483647 YES YES 2147483647 Bigger + 1048576 2147483647 3 Smaller - 1048576 2147483647 4 YES YES 2147483647 Kern 2147483647 submenuAction: Kern YES Use Default 2147483647 Use None 2147483647 Tighten 2147483647 Loosen 2147483647 Ligature 2147483647 submenuAction: Ligature YES Use Default 2147483647 Use None 2147483647 Use All 2147483647 Baseline 2147483647 submenuAction: Baseline YES Use Default 2147483647 Superscript 2147483647 Subscript 2147483647 Raise 2147483647 Lower 2147483647 YES YES 2147483647 Show Colors C 1048576 2147483647 YES YES 2147483647 Copy Style c 1572864 2147483647 Paste Style v 1572864 2147483647 _NSFontMenu Text 2147483647 submenuAction: Text YES Align Left { 1048576 2147483647 Center | 1048576 2147483647 Justify 2147483647 Align Right } 1048576 2147483647 YES YES 2147483647 Show Ruler 2147483647 Copy Ruler c 1310720 2147483647 Paste Ruler v 1310720 2147483647 View 1048576 2147483647 submenuAction: View YES Show Toolbar t 1572864 2147483647 Customize Toolbar… 1048576 2147483647 Window 1048576 2147483647 submenuAction: Window YES Minimize m 1048576 2147483647 Zoom 1048576 2147483647 YES YES 1048576 2147483647 Bring All to Front 1048576 2147483647 _NSWindowsMenu Help 1048576 2147483647 submenuAction: Help YES NewApplication Help ? 1048576 2147483647 _NSMainMenu 15 2 {{237, 530}, {286, 358}} 1946157056 NoodleStickyRowTableView NSWindow {1.79769e+308, 1.79769e+308} 256 YES 274 YES 2304 YES 256 {229, 316} YES 256 {{424, 0}, {16, 17}} YES foo 226 40 1000 75628096 2048 LucidaGrande 11 3100 3 MC4zMzMzMzI5OQA 6 System headerTextColor 3 MAA 337772096 2048 Text Cell LucidaGrande 13 1044 6 System controlBackgroundColor 3 MC42NjY2NjY2NjY3AA 6 System controlTextColor 3 YES YES 3 2 6 System gridColor 3 MC41AA 22 -767557632 4 15 0 YES 0 {{1, 1}, {229, 316}} 4 256 {{230, 1}, {15, 316}} _doScroller: 0.99680511182108622 -2147483392 {{-100, -100}, {423, 15}} 1 _doScroller: 0.99764150943396224 {{20, 20}, {246, 318}} 18 QSAAAEEgAABBwAAAQcAAAA {286, 358} {{0, 0}, {1920, 1178}} {1.79769e+308, 1.79769e+308} 15 2 {{542, 532}, {286, 358}} 1946157056 NoodleIPhoneTableView NSWindow {1.79769e+308, 1.79769e+308} 256 YES 274 YES 2304 YES 256 {229, 316} YES 256 {{424, 0}, {16, 17}} YES foo 226 40 1000 75628096 2048 3 MC4zMzMzMzI5OQA 337772096 2048 Text Cell 3 YES YES 3 2 22 -767557632 4 15 0 YES 0 {{1, 1}, {229, 316}} 4 256 {{230, 1}, {15, 316}} _doScroller: 0.99668874172185429 -2147483392 {{-100, -100}, {423, 15}} 1 _doScroller: 0.99764150943396224 {{20, 20}, {246, 318}} 18 QSAAAEEgAABBwAAAQcAAAA {286, 358} {{0, 0}, {1920, 1178}} {1.79769e+308, 1.79769e+308} NSFontManager Controller YES performMiniaturize: 37 arrangeInFront: 39 print: 86 runPageLayout: 87 clearRecentDocuments: 127 orderFrontStandardAboutPanel: 142 performClose: 193 toggleContinuousSpellChecking: 222 undo: 223 copy: 224 checkSpelling: 225 paste: 226 stopSpeaking: 227 cut: 228 showGuessPanel: 230 redo: 231 selectAll: 232 startSpeaking: 233 delete: 235 performZoom: 240 performFindPanelAction: 241 centerSelectionInVisibleArea: 245 toggleGrammarChecking: 347 toggleSmartInsertDelete: 355 toggleAutomaticQuoteSubstitution: 356 toggleAutomaticLinkDetection: 357 showHelp: 360 saveDocument: 362 saveDocumentAs: 363 revertDocumentToSaved: 364 runToolbarCustomizationPalette: 365 toggleToolbarShown: 366 hide: 367 hideOtherApplications: 368 unhideAllApplications: 370 newDocument: 373 openDocument: 374 addFontTrait: 421 addFontTrait: 422 modifyFont: 423 orderFrontFontPanel: 424 modifyFont: 425 raiseBaseline: 426 lowerBaseline: 427 copyFont: 428 subscript: 429 superscript: 430 tightenKerning: 431 underline: 432 orderFrontColorPanel: 433 useAllLigatures: 434 loosenKerning: 435 pasteFont: 436 unscript: 437 useStandardKerning: 438 useStandardLigatures: 439 turnOffLigatures: 440 turnOffKerning: 441 alignLeft: 442 alignJustified: 443 copyRuler: 444 alignCenter: 445 toggleRuler: 446 alignRight: 447 pasteRuler: 448 terminate: 449 delegate 541 dataSource 542 dataSource 554 delegate 555 _stickyRowTableView 556 _iPhoneTableView 557 YES 0 -2 File's Owner -1 First Responder -3 Application 29 YES MainMenu 19 YES 56 YES 103 YES 1 217 YES 83 YES 81 YES 75 3 80 8 78 6 72 82 9 124 YES 77 5 73 1 79 7 112 10 74 2 125 YES 126 205 YES 202 198 207 214 199 203 197 206 215 218 YES 216 YES 200 YES 219 201 204 220 YES 213 210 221 208 209 106 YES 2 111 57 YES 58 134 150 136 1111 144 129 121 143 236 131 YES 149 145 130 24 YES 92 5 239 23 295 YES 296 YES 297 298 211 YES 212 YES 195 196 346 348 YES 349 YES 350 351 354 371 YES NoodleStickyRowTableViewWindow 372 YES 375 YES 376 YES 377 YES 378 YES 379 YES 380 381 382 383 384 385 386 387 388 YES 389 390 391 392 393 394 395 396 397 YES 398 YES 399 YES 400 401 402 403 404 405 YES 406 407 408 409 410 411 YES 412 413 414 415 YES 416 417 418 419 420 450 YES 451 452 453 YES 455 YES 458 459 527 YES NoodleIPhoneTableViewWindow 528 YES 529 YES 533 YES 534 535 537 YES 538 YES YES -3.IBPluginDependency 103.IBPluginDependency 103.ImportedFromIB2 106.IBPluginDependency 106.ImportedFromIB2 106.editorWindowContentRectSynchronizationRect 111.IBPluginDependency 111.ImportedFromIB2 112.IBPluginDependency 112.ImportedFromIB2 124.IBPluginDependency 124.ImportedFromIB2 125.IBPluginDependency 125.ImportedFromIB2 125.editorWindowContentRectSynchronizationRect 126.IBPluginDependency 126.ImportedFromIB2 129.IBPluginDependency 129.ImportedFromIB2 130.IBPluginDependency 130.ImportedFromIB2 130.editorWindowContentRectSynchronizationRect 131.IBPluginDependency 131.ImportedFromIB2 134.IBPluginDependency 134.ImportedFromIB2 136.IBPluginDependency 136.ImportedFromIB2 143.IBPluginDependency 143.ImportedFromIB2 144.IBPluginDependency 144.ImportedFromIB2 145.IBPluginDependency 145.ImportedFromIB2 149.IBPluginDependency 149.ImportedFromIB2 150.IBPluginDependency 150.ImportedFromIB2 19.IBPluginDependency 19.ImportedFromIB2 195.IBPluginDependency 195.ImportedFromIB2 196.IBPluginDependency 196.ImportedFromIB2 197.IBPluginDependency 197.ImportedFromIB2 198.IBPluginDependency 198.ImportedFromIB2 199.IBPluginDependency 199.ImportedFromIB2 200.IBPluginDependency 200.ImportedFromIB2 200.editorWindowContentRectSynchronizationRect 201.IBPluginDependency 201.ImportedFromIB2 202.IBPluginDependency 202.ImportedFromIB2 203.IBPluginDependency 203.ImportedFromIB2 204.IBPluginDependency 204.ImportedFromIB2 205.IBPluginDependency 205.ImportedFromIB2 205.editorWindowContentRectSynchronizationRect 206.IBPluginDependency 206.ImportedFromIB2 207.IBPluginDependency 207.ImportedFromIB2 208.IBPluginDependency 208.ImportedFromIB2 209.IBPluginDependency 209.ImportedFromIB2 210.IBPluginDependency 210.ImportedFromIB2 211.IBPluginDependency 211.ImportedFromIB2 212.IBPluginDependency 212.ImportedFromIB2 212.editorWindowContentRectSynchronizationRect 213.IBPluginDependency 213.ImportedFromIB2 214.IBPluginDependency 214.ImportedFromIB2 215.IBPluginDependency 215.ImportedFromIB2 216.IBPluginDependency 216.ImportedFromIB2 217.IBPluginDependency 217.ImportedFromIB2 218.IBPluginDependency 218.ImportedFromIB2 219.IBPluginDependency 219.ImportedFromIB2 220.IBPluginDependency 220.ImportedFromIB2 220.editorWindowContentRectSynchronizationRect 221.IBPluginDependency 221.ImportedFromIB2 23.IBPluginDependency 23.ImportedFromIB2 236.IBPluginDependency 236.ImportedFromIB2 239.IBPluginDependency 239.ImportedFromIB2 24.IBPluginDependency 24.ImportedFromIB2 24.editorWindowContentRectSynchronizationRect 29.IBEditorWindowLastContentRect 29.IBPluginDependency 29.ImportedFromIB2 29.WindowOrigin 29.editorWindowContentRectSynchronizationRect 295.IBPluginDependency 296.IBPluginDependency 296.editorWindowContentRectSynchronizationRect 297.IBPluginDependency 298.IBPluginDependency 346.IBPluginDependency 346.ImportedFromIB2 348.IBPluginDependency 348.ImportedFromIB2 349.IBPluginDependency 349.ImportedFromIB2 349.editorWindowContentRectSynchronizationRect 350.IBPluginDependency 350.ImportedFromIB2 351.IBPluginDependency 351.ImportedFromIB2 354.IBPluginDependency 354.ImportedFromIB2 371.IBEditorWindowLastContentRect 371.IBPluginDependency 371.IBWindowTemplateEditedContentRect 371.NSWindowTemplate.visibleAtLaunch 371.editorWindowContentRectSynchronizationRect 371.windowTemplate.maxSize 372.IBPluginDependency 375.IBPluginDependency 376.IBEditorWindowLastContentRect 376.IBPluginDependency 377.IBPluginDependency 378.IBPluginDependency 379.IBPluginDependency 380.IBPluginDependency 381.IBPluginDependency 382.IBPluginDependency 383.IBPluginDependency 384.IBPluginDependency 385.IBPluginDependency 386.IBPluginDependency 387.IBPluginDependency 388.IBEditorWindowLastContentRect 388.IBPluginDependency 389.IBPluginDependency 390.IBPluginDependency 391.IBPluginDependency 392.IBPluginDependency 393.IBPluginDependency 394.IBPluginDependency 395.IBPluginDependency 396.IBPluginDependency 397.IBPluginDependency 398.IBPluginDependency 399.IBPluginDependency 400.IBPluginDependency 401.IBPluginDependency 402.IBPluginDependency 403.IBPluginDependency 404.IBPluginDependency 405.IBPluginDependency 406.IBPluginDependency 407.IBPluginDependency 408.IBPluginDependency 409.IBPluginDependency 410.IBPluginDependency 411.IBPluginDependency 412.IBPluginDependency 413.IBPluginDependency 414.IBPluginDependency 415.IBPluginDependency 416.IBPluginDependency 417.IBPluginDependency 418.IBPluginDependency 419.IBPluginDependency 450.IBPluginDependency 451.IBPluginDependency 452.IBPluginDependency 453.CustomClassName 453.IBPluginDependency 455.IBPluginDependency 458.IBPluginDependency 5.IBPluginDependency 5.ImportedFromIB2 527.IBEditorWindowLastContentRect 527.IBPluginDependency 527.IBWindowTemplateEditedContentRect 527.NSWindowTemplate.visibleAtLaunch 527.editorWindowContentRectSynchronizationRect 527.windowTemplate.maxSize 528.IBPluginDependency 529.IBPluginDependency 533.CustomClassName 533.IBPluginDependency 534.IBPluginDependency 535.IBPluginDependency 537.IBPluginDependency 538.IBPluginDependency 56.IBPluginDependency 56.ImportedFromIB2 57.IBEditorWindowLastContentRect 57.IBPluginDependency 57.ImportedFromIB2 57.editorWindowContentRectSynchronizationRect 58.IBPluginDependency 58.ImportedFromIB2 72.IBPluginDependency 72.ImportedFromIB2 73.IBPluginDependency 73.ImportedFromIB2 74.IBPluginDependency 74.ImportedFromIB2 75.IBPluginDependency 75.ImportedFromIB2 77.IBPluginDependency 77.ImportedFromIB2 78.IBPluginDependency 78.ImportedFromIB2 79.IBPluginDependency 79.ImportedFromIB2 80.IBPluginDependency 80.ImportedFromIB2 81.IBPluginDependency 81.ImportedFromIB2 81.editorWindowContentRectSynchronizationRect 82.IBPluginDependency 82.ImportedFromIB2 83.IBPluginDependency 83.ImportedFromIB2 92.IBPluginDependency 92.ImportedFromIB2 YES com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{596, 852}, {216, 23}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{522, 812}, {146, 23}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{436, 809}, {64, 6}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{608, 612}, {275, 83}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{187, 434}, {243, 243}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{608, 612}, {167, 43}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{608, 612}, {241, 103}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{525, 802}, {197, 73}} {{207, 285}, {599, 20}} com.apple.InterfaceBuilder.CocoaPlugin {74, 862} {{6, 978}, {478, 20}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{475, 832}, {234, 43}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{608, 612}, {215, 63}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{237, 530}, {286, 358}} com.apple.InterfaceBuilder.CocoaPlugin {{237, 530}, {286, 358}} {{33, 99}, {480, 360}} {3.40282e+38, 3.40282e+38} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{437, 242}, {86, 43}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{523, 2}, {178, 283}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin NoodleTableView com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{542, 532}, {286, 358}} com.apple.InterfaceBuilder.CocoaPlugin {{542, 532}, {286, 358}} {{33, 99}, {480, 360}} {3.40282e+38, 3.40282e+38} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin NoodleIPhoneTableView com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{219, 102}, {350, 183}} com.apple.InterfaceBuilder.CocoaPlugin {{23, 794}, {245, 183}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{145, 474}, {199, 203}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin YES YES YES YES 557 YES Controller NSObject YES YES scriptView scrollView YES NSTextView NSScrollView IBProjectSource Examples/LineNumberView/Controller.h Controller NSObject YES YES doModal: doSheet: YES id id YES YES alert field window YES id id id IBProjectSource Examples/ModalResponder/Controller.h Controller NSObject YES YES _iPhoneTableView _stickyRowTableView YES NSTableView NSTableView IBProjectSource Examples/StickyRowTableView Revue/Controller.h Controller NSObject toggleWindow: id _window id IBProjectSource Examples/Window Effects/Controller.h Controller NSObject _tableView NoodleTableView IBProjectSource Examples/iToonz/Controller.h NSObject IBProjectSource NSObject-NoodlePerformWhenIdle.h NSObject IBProjectSource NSTableView-NoodleExtensions.h NSObject IBProjectSource NoodleStickyRowTableView.h NSResponder YES YES cancelModal: confirmModal: YES id id IBProjectSource NSResponder-NoodleModalExtensions.h NSTableColumn NSTableView scrollToStickyRow: id NSTableView scrollToStickyRow: id NSWindow YES YES cancelModal: confirmModal: YES id id NSWindow IBProjectSource NSWindow-NoodleEffects.h NoodleIPhoneTableView NSTableView IBProjectSource NoodleIPhoneTableView.h NoodleTableView NSTableView IBProjectSource NoodleTableView.h YES NSActionCell NSCell IBFrameworkSource AppKit.framework/Headers/NSActionCell.h NSApplication NSResponder IBFrameworkSource AppKit.framework/Headers/NSApplication.h NSApplication IBFrameworkSource AppKit.framework/Headers/NSApplicationScripting.h NSApplication IBFrameworkSource AppKit.framework/Headers/NSColorPanel.h NSApplication IBFrameworkSource AppKit.framework/Headers/NSHelpManager.h NSApplication IBFrameworkSource AppKit.framework/Headers/NSPageLayout.h NSApplication IBFrameworkSource AppKit.framework/Headers/NSUserInterfaceItemSearching.h NSBrowser NSControl IBFrameworkSource AppKit.framework/Headers/NSBrowser.h NSCell NSObject IBFrameworkSource AppKit.framework/Headers/NSCell.h NSControl NSView IBFrameworkSource AppKit.framework/Headers/NSControl.h NSDocument NSObject YES YES printDocument: revertDocumentToSaved: runPageLayout: saveDocument: saveDocumentAs: saveDocumentTo: YES id id id id id id IBFrameworkSource AppKit.framework/Headers/NSDocument.h NSDocument IBFrameworkSource AppKit.framework/Headers/NSDocumentScripting.h NSDocumentController NSObject YES YES clearRecentDocuments: newDocument: openDocument: saveAllDocuments: YES id id id id IBFrameworkSource AppKit.framework/Headers/NSDocumentController.h NSFontManager NSObject IBFrameworkSource AppKit.framework/Headers/NSFontManager.h NSFormatter NSObject IBFrameworkSource Foundation.framework/Headers/NSFormatter.h NSMatrix NSControl IBFrameworkSource AppKit.framework/Headers/NSMatrix.h NSMenu NSObject IBFrameworkSource AppKit.framework/Headers/NSMenu.h NSMenuItem NSObject IBFrameworkSource AppKit.framework/Headers/NSMenuItem.h NSMovieView NSView IBFrameworkSource AppKit.framework/Headers/NSMovieView.h NSObject IBFrameworkSource AppKit.framework/Headers/NSAccessibility.h NSObject NSObject NSObject NSObject NSObject IBFrameworkSource AppKit.framework/Headers/NSDictionaryController.h NSObject IBFrameworkSource AppKit.framework/Headers/NSDragging.h NSObject NSObject IBFrameworkSource AppKit.framework/Headers/NSFontPanel.h NSObject IBFrameworkSource AppKit.framework/Headers/NSKeyValueBinding.h NSObject NSObject IBFrameworkSource AppKit.framework/Headers/NSNibLoading.h NSObject IBFrameworkSource AppKit.framework/Headers/NSOutlineView.h NSObject IBFrameworkSource AppKit.framework/Headers/NSPasteboard.h NSObject IBFrameworkSource AppKit.framework/Headers/NSSavePanel.h NSObject IBFrameworkSource AppKit.framework/Headers/NSTableView.h NSObject IBFrameworkSource AppKit.framework/Headers/NSToolbarItem.h NSObject IBFrameworkSource AppKit.framework/Headers/NSView.h NSObject IBFrameworkSource Foundation.framework/Headers/NSArchiver.h NSObject IBFrameworkSource Foundation.framework/Headers/NSClassDescription.h NSObject IBFrameworkSource Foundation.framework/Headers/NSError.h NSObject IBFrameworkSource Foundation.framework/Headers/NSFileManager.h NSObject IBFrameworkSource Foundation.framework/Headers/NSKeyValueCoding.h NSObject IBFrameworkSource Foundation.framework/Headers/NSKeyValueObserving.h NSObject IBFrameworkSource Foundation.framework/Headers/NSKeyedArchiver.h NSObject IBFrameworkSource Foundation.framework/Headers/NSObject.h NSObject IBFrameworkSource Foundation.framework/Headers/NSObjectScripting.h NSObject IBFrameworkSource Foundation.framework/Headers/NSPortCoder.h NSObject IBFrameworkSource Foundation.framework/Headers/NSRunLoop.h NSObject IBFrameworkSource Foundation.framework/Headers/NSScriptClassDescription.h NSObject IBFrameworkSource Foundation.framework/Headers/NSScriptKeyValueCoding.h NSObject IBFrameworkSource Foundation.framework/Headers/NSScriptObjectSpecifiers.h NSObject IBFrameworkSource Foundation.framework/Headers/NSScriptWhoseTests.h NSObject IBFrameworkSource Foundation.framework/Headers/NSThread.h NSObject IBFrameworkSource Foundation.framework/Headers/NSURL.h NSObject IBFrameworkSource Foundation.framework/Headers/NSURLConnection.h NSObject IBFrameworkSource Foundation.framework/Headers/NSURLDownload.h NSResponder IBFrameworkSource AppKit.framework/Headers/NSInterfaceStyle.h NSResponder NSObject IBFrameworkSource AppKit.framework/Headers/NSResponder.h NSScrollView NSView IBFrameworkSource AppKit.framework/Headers/NSScrollView.h NSScroller NSControl IBFrameworkSource AppKit.framework/Headers/NSScroller.h NSTableColumn NSObject IBFrameworkSource AppKit.framework/Headers/NSTableColumn.h NSTableView NSControl NSText NSView IBFrameworkSource AppKit.framework/Headers/NSText.h NSTextFieldCell NSActionCell IBFrameworkSource AppKit.framework/Headers/NSTextFieldCell.h NSTextView NSText IBFrameworkSource AppKit.framework/Headers/NSTextView.h NSView IBFrameworkSource AppKit.framework/Headers/NSClipView.h NSView NSView IBFrameworkSource AppKit.framework/Headers/NSRulerView.h NSView NSResponder NSWindow IBFrameworkSource AppKit.framework/Headers/NSDrawer.h NSWindow NSResponder IBFrameworkSource AppKit.framework/Headers/NSWindow.h NSWindow IBFrameworkSource AppKit.framework/Headers/NSWindowScripting.h 0 com.apple.InterfaceBuilder.CocoaPlugin.macosx com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3 YES ../../../NoodleKit.xcodeproj 3 ================================================ FILE: Examples/StickyRowTableView Revue/Read Me.rtf ================================================ {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf110 {\fonttbl\f0\fswiss\fcharset0 Helvetica;\f1\fnil\fcharset0 Monaco;} {\colortbl;\red255\green255\blue255;} {\*\listtable{\list\listtemplateid1\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid1\'01\uc0\u8226 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listname ;}\listid1} {\list\listtemplateid2\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid101\'01\uc0\u8226 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listname ;}\listid2} {\list\listtemplateid3\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid201\'01\uc0\u8226 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listname ;}\listid3} {\list\listtemplateid4\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid301\'01\uc0\u8226 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listname ;}\listid4} {\list\listtemplateid5\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid401\'01\uc0\u8226 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listname ;}\listid5}} {\*\listoverridetable{\listoverride\listid1\listoverridecount0\ls1}{\listoverride\listid2\listoverridecount0\ls2}{\listoverride\listid3\listoverridecount0\ls3}{\listoverride\listid4\listoverridecount0\ls4}{\listoverride\listid5\listoverridecount0\ls5}} \margl1440\margr1440\vieww19360\viewh17460\viewkind0 \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural \f0\b\fs24 \cf0 NoodleStickyRowTableView Test \b0 \ version 0.18369\ \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural\pardirnatural \cf0 \ This is a sample project and test harness for the sticky row header feature of NoodleTableView.\ \ NoodleTableView is an NSTableView subclass where group rows (this can be overridden) will "stick" to the top of the view when they scroll off. This is like how section headers will stick to the top in UITableViews on the iPhone.\ \ Almost all of it is accomplished via an NSTableView category. The reason it was done this way was so that (a) you could integrate it into your own NSTableView subclass easily and (b) you could gain the functionality in NSOutlineView and its subclasses as well. To get the basic functionality, all you need to do is subclass \f1 -drawRect: \f0 and call \f1 -drawStickyRowHeader \f0 after your call to \f1 super \f0 . Look at the NoodleTableView class for details.\ \ This project also includes NoodleIPhoneTableView which overrides a bit more to simulate the look and feel of UITableView.\ \ A blog post on this can be found at: {\field{\*\fldinst{HYPERLINK "http://www.noodlesoft.com/blog/2009/09/25/sticky-section-headers-in-nstableview"}}{\fldrslt http://www.noodlesoft.com/blog/2009/09/25/sticky-section-headers-in-nstableview}}\ \ \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural\pardirnatural \b \cf0 Notes \b0 \ \ \pard\tx220\tx720\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\li720\fi-720\ql\qnatural\pardirnatural \ls1\ilvl0\cf0 {\listtext \'95 }As noted in the article linked above, limitations in being able to get a visual cache of a group row forced me to compromise and use a custom look for the sticky rows in the default implementation. As shown in the NoodleIPhoneTableView class, you can override all the drawing but it requires a bit more work.\ {\listtext \'95 }The sticky row header is implemented using an NSButton. The row is drawn into an image that is set on the button. The button is adjusted as needed, including whether it is enabled and therefore able to accept mouse clicks.\ {\listtext \'95 }To keep things in a category, the auxiliary button is put in the view hierarchy. It is tagged so that it can be retrieved later. This is further exploited where, for optimization purposes, the alternate image property of NSButton, which would otherwise go unused, is used as a cache.\ \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural\pardirnatural \cf0 \ \ \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural\pardirnatural \b \cf0 Possible Improvements\ \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural\pardirnatural \b0 \cf0 \ \pard\tx220\tx720\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\li720\fi-720\ql\qnatural\pardirnatural \ls2\ilvl0\cf0 {\listtext \'95 }You can keep track of the last sticky row that was cached and reuse its image if it hasn't changed. I had actually implemented this but the performance gains were actually very minimal. For purposes of clarity, I took the code out but you can implement this if you need to eek out the last bit of performance.\ {\listtext \'95 }The fade-in transition is position based (it fades in as you scroll down). It might be better to make it time-based.\ \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural\pardirnatural \cf0 \ \ \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural\pardirnatural \b \cf0 Contact \b0 \ \ Just go {\field{\*\fldinst{HYPERLINK "http://www.noodlesoft.com/about.php"}}{\fldrslt www.noodlesoft.com}} and shoot me an email. Or visit the blog article linked above and leave a comment. Bugs, suggestions and other feedback appreciated.\ \ \ \b License \b0 \ \ I am releasing this under the MIT license.\ \ ____________________________________\ \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural\pardirnatural \f1 \cf0 Copyright (c) 2009 Noodlesoft, LLC. All Rights Reserved.\ \ Permission is hereby granted, free of charge, to any person\ obtaining a copy of this software and associated documentation\ files (the "Software"), to deal in the Software without\ restriction, including without limitation the rights to use,\ copy, modify, merge, publish, distribute, sublicense, and/or sell\ copies of the Software, and to permit persons to whom the\ Software is furnished to do so, subject to the following\ conditions:\ \ The above copyright notice and this permission notice shall be\ included in all copies or substantial portions of the Software.\ \ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\ OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\ OTHER DEALINGS IN THE SOFTWARE.\ \pard\tx220\tx720\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\li720\fi-720\ql\qnatural\pardirnatural \ls3\ilvl0 \f0\b \cf0 \ \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural\pardirnatural \cf0 \ Changelog \b0 \ \pard\tx220\tx720\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\li720\fi-720\ql\qnatural\pardirnatural \ls4\ilvl0\cf0 \ \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural\pardirnatural \cf0 \ 0.18369:\ \pard\tx220\tx720\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\li720\fi-720\ql\qnatural\pardirnatural \ls5\ilvl0\cf0 {\listtext \'95 }Initial public release\ \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural\pardirnatural \cf0 \ } ================================================ FILE: Examples/StickyRowTableView Revue/StickyRowTableView Revue-Info.plist ================================================ CFBundleDevelopmentRegion English CFBundleExecutable ${EXECUTABLE_NAME} CFBundleIdentifier com.noodlesoft.${PRODUCT_NAME:rfc1034identifier} CFBundleInfoDictionaryVersion 6.0 CFBundlePackageType APPL CFBundleShortVersionString 1.0 CFBundleSignature ???? CFBundleVersion 1 LSMinimumSystemVersion ${MACOSX_DEPLOYMENT_TARGET} NSMainNibFile MainMenu NSPrincipalClass NSApplication ================================================ FILE: Examples/StickyRowTableView Revue/main.m ================================================ // // main.m // NoodleStickyRowTableViewTest // // Created by Paul Kim on 8/23/09. // Copyright Noodlesoft, LLC 2009. All rights reserved. // #import int main(int argc, char *argv[]) { return NSApplicationMain(argc, (const char **) argv); } ================================================ FILE: Examples/TimerLab/English.lproj/MainMenu.xib ================================================ 1050 10F569 762 1038.29 461.00 com.apple.InterfaceBuilder.CocoaPlugin 762 YES YES com.apple.InterfaceBuilder.CocoaPlugin YES YES YES YES NSApplication FirstResponder NSApplication AMainMenu YES TimeLab 1048576 2147483647 NSImage NSMenuCheckmark NSImage NSMenuMixedState submenuAction: TimeLab YES About TimeLab 2147483647 YES YES 1048576 2147483647 Preferences… , 1048576 2147483647 YES YES 1048576 2147483647 Services 1048576 2147483647 submenuAction: Services YES _NSServicesMenu YES YES 1048576 2147483647 Hide TimeLab h 1048576 2147483647 Hide Others h 1572864 2147483647 Show All 1048576 2147483647 YES YES 1048576 2147483647 Quit TimeLab q 1048576 2147483647 _NSAppleMenu File 1048576 2147483647 submenuAction: File YES New n 1048576 2147483647 Open… o 1048576 2147483647 Open Recent 1048576 2147483647 submenuAction: Open Recent YES Clear Menu 1048576 2147483647 _NSRecentDocumentsMenu YES YES 1048576 2147483647 Close w 1048576 2147483647 Save s 1048576 2147483647 Save As… S 1179648 2147483647 Revert to Saved 2147483647 YES YES 1048576 2147483647 Page Setup... P 1179648 2147483647 Print… p 1048576 2147483647 Edit 1048576 2147483647 submenuAction: Edit YES Undo z 1048576 2147483647 Redo Z 1179648 2147483647 YES YES 1048576 2147483647 Cut x 1048576 2147483647 Copy c 1048576 2147483647 Paste v 1048576 2147483647 Paste and Match Style V 1572864 2147483647 Delete 1048576 2147483647 Select All a 1048576 2147483647 YES YES 1048576 2147483647 Find 1048576 2147483647 submenuAction: Find YES Find… f 1048576 2147483647 1 Find Next g 1048576 2147483647 2 Find Previous G 1179648 2147483647 3 Use Selection for Find e 1048576 2147483647 7 Jump to Selection j 1048576 2147483647 Spelling and Grammar 1048576 2147483647 submenuAction: Spelling and Grammar YES Show Spelling and Grammar : 1048576 2147483647 Check Document Now ; 1048576 2147483647 YES YES 2147483647 Check Spelling While Typing 1048576 2147483647 Check Grammar With Spelling 1048576 2147483647 Correct Spelling Automatically 2147483647 Substitutions 1048576 2147483647 submenuAction: Substitutions YES Show Substitutions 2147483647 YES YES 2147483647 Smart Copy/Paste f 1048576 2147483647 1 Smart Quotes g 1048576 2147483647 2 Smart Dashes 2147483647 Smart Links G 1179648 2147483647 3 Text Replacement 2147483647 Transformations 2147483647 submenuAction: Transformations YES Make Upper Case 2147483647 Make Lower Case 2147483647 Capitalize 2147483647 Speech 1048576 2147483647 submenuAction: Speech YES Start Speaking 1048576 2147483647 Stop Speaking 1048576 2147483647 Format 2147483647 submenuAction: Format YES Font 2147483647 submenuAction: Font YES Show Fonts t 1048576 2147483647 Bold b 1048576 2147483647 2 Italic i 1048576 2147483647 1 Underline u 1048576 2147483647 YES YES 2147483647 Bigger + 1048576 2147483647 3 Smaller - 1048576 2147483647 4 YES YES 2147483647 Kern 2147483647 submenuAction: Kern YES Use Default 2147483647 Use None 2147483647 Tighten 2147483647 Loosen 2147483647 Ligature 2147483647 submenuAction: Ligature YES Use Default 2147483647 Use None 2147483647 Use All 2147483647 Baseline 2147483647 submenuAction: Baseline YES Use Default 2147483647 Superscript 2147483647 Subscript 2147483647 Raise 2147483647 Lower 2147483647 YES YES 2147483647 Show Colors C 1048576 2147483647 YES YES 2147483647 Copy Style c 1572864 2147483647 Paste Style v 1572864 2147483647 _NSFontMenu Text 2147483647 submenuAction: Text YES Align Left { 1048576 2147483647 Center | 1048576 2147483647 Justify 2147483647 Align Right } 1048576 2147483647 YES YES 2147483647 Writing Direction 2147483647 submenuAction: Writing Direction YES YES Paragraph 2147483647 CURlZmF1bHQ 2147483647 CUxlZnQgdG8gUmlnaHQ 2147483647 CVJpZ2h0IHRvIExlZnQ 2147483647 YES YES 2147483647 YES Selection 2147483647 CURlZmF1bHQ 2147483647 CUxlZnQgdG8gUmlnaHQ 2147483647 CVJpZ2h0IHRvIExlZnQ 2147483647 YES YES 2147483647 Show Ruler 2147483647 Copy Ruler c 1310720 2147483647 Paste Ruler v 1310720 2147483647 View 1048576 2147483647 submenuAction: View YES Show Toolbar t 1572864 2147483647 Customize Toolbar… 1048576 2147483647 Window 1048576 2147483647 submenuAction: Window YES Minimize m 1048576 2147483647 Zoom 1048576 2147483647 YES YES 1048576 2147483647 Bring All to Front 1048576 2147483647 _NSWindowsMenu Help 2147483647 submenuAction: Help YES TimeLab Help ? 1048576 2147483647 _NSHelpMenu _NSMainMenu 7 2 {{335, 315}, {583, 435}} 1954021376 Timer Test NSWindow {1.79769e+308, 1.79769e+308} 256 YES 268 {{73, 236}, {278, 148}} YES 71433728 0 -595929600 US/Pacific VFppZgAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABAAAAAAAAAC5AAAABAAAABCepkign7sVkKCGKqChmveQ y4kaoNIj9HDSYSYQ1v50INiArZDa/tGg28CQENzes6DdqayQ3r6VoN+JjpDgnneg4WlwkOJ+WaDjSVKQ 5F47oOUpNJDmR1gg5xJREOgnOiDo8jMQ6gccIOrSFRDr5v4g7LH3EO3G4CDukdkQ76/8oPBxuxDxj96g 8n/BkPNvwKD0X6OQ9U+ioPY/hZD3L4Sg+CiiEPkPZqD6CIQQ+viDIPvoZhD82GUg/chIEP64RyD/qCoQ AJgpIAGIDBACeAsgA3EokARhJ6AFUQqQBkEJoAcw7JAHjUOgCRDOkAmtvyAK8LCQC+CvoAzZzRANwJGg DrmvEA+priAQmZEQEYmQIBJ5cxATaXIgFFlVEBVJVCAWOTcQFyk2IBgiU5AZCRggGgI1kBryNKAb4heQ HNIWoB3B+ZAesfigH6HbkCB2KyAhgb2QIlYNICNq2hAkNe8gJUq8ECYV0SAnKp4QJ/7toCkKgBAp3s+g KupiECu+saAs036QLZ6ToC6zYJAvfnWgMJNCkDFnkiAycySQM0d0IDRTBpA1J1YgNjLokDcHOCA4HAUQ OOcaIDn75xA6xvwgO9vJEDywGKA9u6sQPo/6oD+bjRBAb9ygQYSpkEJPvqBDZIuQRC+goEVEbZBF89Mg Ry2KEEfTtSBJDWwQSbOXIErtThBLnLOgTNZqkE18laBOtkyQT1x3oFCWLpBRPFmgUnYQkFMcO6BUVfKQ VPwdoFY11JBW5TogWB7xEFjFHCBZ/tMQWqT+IFvetRBchOAgXb6XEF5kwiBfnnkQYE3eoGGHlZBiLcCg Y2d3kGQNoqBlR1mQZe2EoGcnO5BnzWagaQcdkGmtSKBq5v+Qa5ZlIGzQHBBtdkcgbq/+EG9WKSBwj+AQ cTYLIHJvwhBzFe0gdE+kEHT/CaB2OMCQdt7roHgYopB4vs2gefiEkHqer6B72GaQfH6RoH24SJB+XnOg f5gqkAABAAECAwEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEA AQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEA AQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEA AQABAAEAAQAB//+dkAEA//+PgAAE//+dkAEI//+dkAEMUERUAFBTVABQV1QAUFBUAAAAAAEAAAABA %Y-%m-%d %H:%M:%S %z LucidaGrande 13 1044 0.0 238 1 6 System controlBackgroundColor 3 MC42NjY2NjY2NjY3AA 6 System controlTextColor 3 MAA 268 {{241, 393}, {104, 27}} YES 71433728 0 -595929600 US/Pacific VFppZgAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABAAAAAAAAAC5AAAABAAAABCepkign7sVkKCGKqChmveQ y4kaoNIj9HDSYSYQ1v50INiArZDa/tGg28CQENzes6DdqayQ3r6VoN+JjpDgnneg4WlwkOJ+WaDjSVKQ 5F47oOUpNJDmR1gg5xJREOgnOiDo8jMQ6gccIOrSFRDr5v4g7LH3EO3G4CDukdkQ76/8oPBxuxDxj96g 8n/BkPNvwKD0X6OQ9U+ioPY/hZD3L4Sg+CiiEPkPZqD6CIQQ+viDIPvoZhD82GUg/chIEP64RyD/qCoQ AJgpIAGIDBACeAsgA3EokARhJ6AFUQqQBkEJoAcw7JAHjUOgCRDOkAmtvyAK8LCQC+CvoAzZzRANwJGg DrmvEA+priAQmZEQEYmQIBJ5cxATaXIgFFlVEBVJVCAWOTcQFyk2IBgiU5AZCRggGgI1kBryNKAb4heQ HNIWoB3B+ZAesfigH6HbkCB2KyAhgb2QIlYNICNq2hAkNe8gJUq8ECYV0SAnKp4QJ/7toCkKgBAp3s+g KupiECu+saAs036QLZ6ToC6zYJAvfnWgMJNCkDFnkiAycySQM0d0IDRTBpA1J1YgNjLokDcHOCA4HAUQ OOcaIDn75xA6xvwgO9vJEDywGKA9u6sQPo/6oD+bjRBAb9ygQYSpkEJPvqBDZIuQRC+goEVEbZBF89Mg Ry2KEEfTtSBJDWwQSbOXIErtThBLnLOgTNZqkE18laBOtkyQT1x3oFCWLpBRPFmgUnYQkFMcO6BUVfKQ VPwdoFY11JBW5TogWB7xEFjFHCBZ/tMQWqT+IFvetRBchOAgXb6XEF5kwiBfnnkQYE3eoGGHlZBiLcCg Y2d3kGQNoqBlR1mQZe2EoGcnO5BnzWagaQcdkGmtSKBq5v+Qa5ZlIGzQHBBtdkcgbq/+EG9WKSBwj+AQ cTYLIHJvwhBzFe0gdE+kEHT/CaB2OMCQdt7roHgYopB4vs2gefiEkHqer6B72GaQfH6RoH24SJB+XnOg f5gqkAABAAECAwEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEA AQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEA AQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEA AQABAAEAAQAB//+dkAEA//+PgAAE//+dkAEI//+dkAEMUERUAFBTVABQV1QAUFBUAAAAAAEAAAABA %Y-%m-%d %H:%M:%S %z 0.0 14 268 {{94, 393}, {104, 27}} YES 71433728 0 -595929600 US/Pacific VFppZgAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABAAAAAAAAAC5AAAABAAAABCepkign7sVkKCGKqChmveQ y4kaoNIj9HDSYSYQ1v50INiArZDa/tGg28CQENzes6DdqayQ3r6VoN+JjpDgnneg4WlwkOJ+WaDjSVKQ 5F47oOUpNJDmR1gg5xJREOgnOiDo8jMQ6gccIOrSFRDr5v4g7LH3EO3G4CDukdkQ76/8oPBxuxDxj96g 8n/BkPNvwKD0X6OQ9U+ioPY/hZD3L4Sg+CiiEPkPZqD6CIQQ+viDIPvoZhD82GUg/chIEP64RyD/qCoQ AJgpIAGIDBACeAsgA3EokARhJ6AFUQqQBkEJoAcw7JAHjUOgCRDOkAmtvyAK8LCQC+CvoAzZzRANwJGg DrmvEA+priAQmZEQEYmQIBJ5cxATaXIgFFlVEBVJVCAWOTcQFyk2IBgiU5AZCRggGgI1kBryNKAb4heQ HNIWoB3B+ZAesfigH6HbkCB2KyAhgb2QIlYNICNq2hAkNe8gJUq8ECYV0SAnKp4QJ/7toCkKgBAp3s+g KupiECu+saAs036QLZ6ToC6zYJAvfnWgMJNCkDFnkiAycySQM0d0IDRTBpA1J1YgNjLokDcHOCA4HAUQ OOcaIDn75xA6xvwgO9vJEDywGKA9u6sQPo/6oD+bjRBAb9ygQYSpkEJPvqBDZIuQRC+goEVEbZBF89Mg Ry2KEEfTtSBJDWwQSbOXIErtThBLnLOgTNZqkE18laBOtkyQT1x3oFCWLpBRPFmgUnYQkFMcO6BUVfKQ VPwdoFY11JBW5TogWB7xEFjFHCBZ/tMQWqT+IFvetRBchOAgXb6XEF5kwiBfnnkQYE3eoGGHlZBiLcCg Y2d3kGQNoqBlR1mQZe2EoGcnO5BnzWagaQcdkGmtSKBq5v+Qa5ZlIGzQHBBtdkcgbq/+EG9WKSBwj+AQ cTYLIHJvwhBzFe0gdE+kEHT/CaB2OMCQdt7roHgYopB4vs2gefiEkHqer6B72GaQfH6RoH24SJB+XnOg f5gqkAABAAECAwEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEA AQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEA AQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEA AQABAAEAAQAB//+dkAEA//+PgAAE//+dkAEI//+dkAEMUERUAFBTVABQV1QAUFBUAAAAAAEAAAABA %Y-%m-%d %H:%M:%S %z 0.0 224 268 {{17, 154}, {135, 17}} YES 68288064 71304192 Date when timer set: 6 System controlColor 268 {{17, 129}, {135, 17}} YES 68288064 71304192 Initial fire date: 268 {{17, 104}, {135, 17}} YES 68288064 71304192 Current fire date: 268 {{17, 79}, {135, 17}} YES 68288064 71304192 Actual fire date: 268 {{393, 292}, {107, 32}} YES 67239424 134217728 Start timer -2038284033 129 200 25 268 {{238, 12}, {107, 32}} YES 67239424 134217728 Refresh -2038284033 129 200 25 268 {{384, 154}, {182, 17}} YES 68288064 -2009070592 YES YES dateStyle formatterBehavior timeStyle YES MMM d, yyyy h:mm:ss a NO 268 {{384, 129}, {182, 17}} YES 68288064 -2009070592 YES YES dateStyle formatterBehavior timeStyle YES MMM d, yyyy h:mm:ss a NO 268 {{384, 104}, {182, 17}} YES 68288064 -2009070592 YES YES dateStyle formatterBehavior timeStyle YES MMM d, yyyy h:mm:ss a NO 268 {{384, 79}, {182, 17}} YES 68288064 -2009070592 YES YES dateStyle formatterBehavior timeStyle YES MMM d, yyyy h:mm:ss a NO 268 {{171, 154}, {182, 17}} YES 68288064 -2009070592 YES YES dateStyle formatterBehavior timeStyle YES MMM d, yyyy h:mm:ss a NO 268 {{171, 129}, {182, 17}} YES 68288064 -2009070592 YES YES dateStyle formatterBehavior timeStyle YES MMM d, yyyy h:mm:ss a NO 268 {{171, 104}, {182, 17}} YES 68288064 -2009070592 YES YES dateStyle formatterBehavior timeStyle YES MMM d, yyyy h:mm:ss a NO 268 {{171, 79}, {182, 17}} YES 68288064 -2009070592 YES YES dateStyle formatterBehavior timeStyle YES MMM d, yyyy h:mm:ss a NO 268 {{216, 179}, {91, 17}} YES 68288064 272630784 Normal Timer 268 {{424, 179}, {101, 17}} YES 68288064 272630784 Absolute Timer 12 {{20, 215}, {543, 5}} {0, 0} 67239424 0 Box 6 System textBackgroundColor 3 MQA 3 MCAwLjgwMDAwMDAxMTkAA 3 2 0 NO {583, 435} {{0, 0}, {1920, 1178}} {1.79769e+308, 1.79769e+308} TimerLabAppDelegate NSFontManager YES performMiniaturize: 37 arrangeInFront: 39 print: 86 runPageLayout: 87 clearRecentDocuments: 127 orderFrontStandardAboutPanel: 142 performClose: 193 toggleContinuousSpellChecking: 222 undo: 223 copy: 224 checkSpelling: 225 paste: 226 stopSpeaking: 227 cut: 228 showGuessPanel: 230 redo: 231 selectAll: 232 startSpeaking: 233 delete: 235 performZoom: 240 performFindPanelAction: 241 centerSelectionInVisibleArea: 245 toggleGrammarChecking: 347 toggleSmartInsertDelete: 355 toggleAutomaticQuoteSubstitution: 356 toggleAutomaticLinkDetection: 357 saveDocument: 362 saveDocumentAs: 363 revertDocumentToSaved: 364 runToolbarCustomizationPalette: 365 toggleToolbarShown: 366 hide: 367 hideOtherApplications: 368 unhideAllApplications: 370 newDocument: 373 openDocument: 374 addFontTrait: 421 addFontTrait: 422 modifyFont: 423 orderFrontFontPanel: 424 modifyFont: 425 raiseBaseline: 426 lowerBaseline: 427 copyFont: 428 subscript: 429 superscript: 430 tightenKerning: 431 underline: 432 orderFrontColorPanel: 433 useAllLigatures: 434 loosenKerning: 435 pasteFont: 436 unscript: 437 useStandardKerning: 438 useStandardLigatures: 439 turnOffLigatures: 440 turnOffKerning: 441 terminate: 449 toggleAutomaticSpellingCorrection: 456 orderFrontSubstitutionsPanel: 458 toggleAutomaticDashSubstitution: 461 toggleAutomaticTextReplacement: 463 uppercaseWord: 464 capitalizeWord: 467 lowercaseWord: 468 pasteAsPlainText: 486 performFindPanelAction: 487 performFindPanelAction: 488 performFindPanelAction: 489 showHelp: 493 delegate 495 alignCenter: 518 pasteRuler: 519 toggleRuler: 520 alignRight: 521 copyRuler: 522 alignJustified: 523 alignLeft: 524 makeBaseWritingDirectionNatural: 525 makeBaseWritingDirectionLeftToRight: 526 makeBaseWritingDirectionRightToLeft: 527 makeTextWritingDirectionNatural: 528 makeTextWritingDirectionLeftToRight: 529 makeTextWritingDirectionRightToLeft: 530 _window 533 _initialDateField 558 _picker 562 startTimer: 563 _timePicker 577 _datePicker 578 _initialFireDateField 607 _regularInitialDateField 611 _regularInitialFireDateField 612 _regularCurrentFireDateField 613 _regularFireDateField 614 _currentFireDateField 615 _fireDateField 616 refresh: 617 syncPickers: 618 syncPickers: 619 syncPickers: 620 YES 0 -2 File's Owner -1 First Responder -3 Application 29 YES 19 YES 56 YES 217 YES 83 YES 81 YES 75 80 78 72 82 124 YES 77 73 79 112 74 125 YES 126 205 YES 202 198 207 214 199 203 197 206 215 218 YES 216 YES 200 YES 219 201 204 220 YES 213 210 221 208 209 57 YES 58 134 150 136 144 129 143 236 131 YES 149 145 130 24 YES 92 5 239 23 295 YES 296 YES 297 298 211 YES 212 YES 195 196 346 348 YES 349 YES 350 351 354 371 YES 372 YES 375 YES 376 YES 377 YES 388 YES 389 390 391 392 393 394 395 396 397 YES 398 YES 399 YES 400 401 402 403 404 405 YES 406 407 408 409 410 411 YES 412 413 414 415 YES 416 417 418 419 420 450 YES 451 YES 452 453 454 457 459 460 462 465 466 485 490 YES 491 YES 492 494 496 YES 497 YES 498 499 500 501 502 503 YES 504 505 506 507 508 YES 509 510 511 512 513 514 515 516 517 534 YES 535 536 YES 537 538 YES 539 540 YES 541 542 YES 543 544 YES 545 546 YES 547 548 YES 549 550 YES 551 YES 564 565 YES 566 YES 567 568 YES 569 YES 570 571 YES 572 YES 573 591 YES 592 593 YES 594 YES 595 YES 596 YES 597 YES 598 599 YES 600 601 YES 602 603 YES 604 605 YES 606 608 YES 609 621 YES YES -3.IBPluginDependency 112.IBPluginDependency 112.ImportedFromIB2 124.IBPluginDependency 124.ImportedFromIB2 125.IBPluginDependency 125.ImportedFromIB2 125.editorWindowContentRectSynchronizationRect 126.IBPluginDependency 126.ImportedFromIB2 129.IBPluginDependency 129.ImportedFromIB2 130.IBPluginDependency 130.ImportedFromIB2 130.editorWindowContentRectSynchronizationRect 131.IBPluginDependency 131.ImportedFromIB2 134.IBPluginDependency 134.ImportedFromIB2 136.IBPluginDependency 136.ImportedFromIB2 143.IBPluginDependency 143.ImportedFromIB2 144.IBPluginDependency 144.ImportedFromIB2 145.IBPluginDependency 145.ImportedFromIB2 149.IBPluginDependency 149.ImportedFromIB2 150.IBPluginDependency 150.ImportedFromIB2 19.IBPluginDependency 19.ImportedFromIB2 195.IBPluginDependency 195.ImportedFromIB2 196.IBPluginDependency 196.ImportedFromIB2 197.IBPluginDependency 197.ImportedFromIB2 198.IBPluginDependency 198.ImportedFromIB2 199.IBPluginDependency 199.ImportedFromIB2 200.IBEditorWindowLastContentRect 200.IBPluginDependency 200.ImportedFromIB2 200.editorWindowContentRectSynchronizationRect 201.IBPluginDependency 201.ImportedFromIB2 202.IBPluginDependency 202.ImportedFromIB2 203.IBPluginDependency 203.ImportedFromIB2 204.IBPluginDependency 204.ImportedFromIB2 205.IBEditorWindowLastContentRect 205.IBPluginDependency 205.ImportedFromIB2 205.editorWindowContentRectSynchronizationRect 206.IBPluginDependency 206.ImportedFromIB2 207.IBPluginDependency 207.ImportedFromIB2 208.IBPluginDependency 208.ImportedFromIB2 209.IBPluginDependency 209.ImportedFromIB2 210.IBPluginDependency 210.ImportedFromIB2 211.IBPluginDependency 211.ImportedFromIB2 212.IBPluginDependency 212.ImportedFromIB2 212.editorWindowContentRectSynchronizationRect 213.IBPluginDependency 213.ImportedFromIB2 214.IBPluginDependency 214.ImportedFromIB2 215.IBPluginDependency 215.ImportedFromIB2 216.IBPluginDependency 216.ImportedFromIB2 217.IBPluginDependency 217.ImportedFromIB2 218.IBPluginDependency 218.ImportedFromIB2 219.IBPluginDependency 219.ImportedFromIB2 220.IBEditorWindowLastContentRect 220.IBPluginDependency 220.ImportedFromIB2 220.editorWindowContentRectSynchronizationRect 221.IBPluginDependency 221.ImportedFromIB2 23.IBPluginDependency 23.ImportedFromIB2 236.IBPluginDependency 236.ImportedFromIB2 239.IBPluginDependency 239.ImportedFromIB2 24.IBEditorWindowLastContentRect 24.IBPluginDependency 24.ImportedFromIB2 24.editorWindowContentRectSynchronizationRect 29.IBEditorWindowLastContentRect 29.IBPluginDependency 29.ImportedFromIB2 29.WindowOrigin 29.editorWindowContentRectSynchronizationRect 295.IBPluginDependency 296.IBEditorWindowLastContentRect 296.IBPluginDependency 296.editorWindowContentRectSynchronizationRect 297.IBPluginDependency 298.IBPluginDependency 346.IBPluginDependency 346.ImportedFromIB2 348.IBPluginDependency 348.ImportedFromIB2 349.IBEditorWindowLastContentRect 349.IBPluginDependency 349.ImportedFromIB2 349.editorWindowContentRectSynchronizationRect 350.IBPluginDependency 350.ImportedFromIB2 351.IBPluginDependency 351.ImportedFromIB2 354.IBPluginDependency 354.ImportedFromIB2 371.IBEditorWindowLastContentRect 371.IBPluginDependency 371.IBWindowTemplateEditedContentRect 371.NSWindowTemplate.visibleAtLaunch 371.editorWindowContentRectSynchronizationRect 371.windowTemplate.maxSize 372.IBPluginDependency 375.IBPluginDependency 376.IBEditorWindowLastContentRect 376.IBPluginDependency 377.IBPluginDependency 388.IBEditorWindowLastContentRect 388.IBPluginDependency 389.IBPluginDependency 390.IBPluginDependency 391.IBPluginDependency 392.IBPluginDependency 393.IBPluginDependency 394.IBPluginDependency 395.IBPluginDependency 396.IBPluginDependency 397.IBPluginDependency 398.IBPluginDependency 399.IBPluginDependency 400.IBPluginDependency 401.IBPluginDependency 402.IBPluginDependency 403.IBPluginDependency 404.IBPluginDependency 405.IBPluginDependency 406.IBPluginDependency 407.IBPluginDependency 408.IBPluginDependency 409.IBPluginDependency 410.IBPluginDependency 411.IBPluginDependency 412.IBPluginDependency 413.IBPluginDependency 414.IBPluginDependency 415.IBPluginDependency 416.IBPluginDependency 417.IBPluginDependency 418.IBPluginDependency 419.IBPluginDependency 450.IBPluginDependency 451.IBEditorWindowLastContentRect 451.IBPluginDependency 452.IBPluginDependency 453.IBPluginDependency 454.IBPluginDependency 457.IBPluginDependency 459.IBPluginDependency 460.IBPluginDependency 462.IBPluginDependency 465.IBPluginDependency 466.IBPluginDependency 485.IBPluginDependency 490.IBPluginDependency 491.IBEditorWindowLastContentRect 491.IBPluginDependency 492.IBPluginDependency 496.IBPluginDependency 497.IBEditorWindowLastContentRect 497.IBPluginDependency 498.IBPluginDependency 499.IBPluginDependency 5.IBPluginDependency 5.ImportedFromIB2 500.IBPluginDependency 501.IBPluginDependency 502.IBPluginDependency 503.IBPluginDependency 504.IBPluginDependency 505.IBPluginDependency 506.IBPluginDependency 507.IBPluginDependency 508.IBEditorWindowLastContentRect 508.IBPluginDependency 509.IBPluginDependency 510.IBPluginDependency 511.IBPluginDependency 512.IBPluginDependency 513.IBPluginDependency 514.IBPluginDependency 515.IBPluginDependency 516.IBPluginDependency 517.IBPluginDependency 534.IBPluginDependency 535.IBPluginDependency 536.IBPluginDependency 537.IBPluginDependency 538.IBPluginDependency 539.IBPluginDependency 540.IBAttributePlaceholdersKey 540.IBPluginDependency 541.IBPluginDependency 542.IBAttributePlaceholdersKey 542.IBPluginDependency 543.IBPluginDependency 544.IBAttributePlaceholdersKey 544.IBPluginDependency 545.IBPluginDependency 546.IBAttributePlaceholdersKey 546.IBPluginDependency 547.IBPluginDependency 548.IBAttributePlaceholdersKey 548.IBPluginDependency 549.IBPluginDependency 550.IBPluginDependency 551.IBPluginDependency 56.IBPluginDependency 56.ImportedFromIB2 564.IBDateFormatterBehaviorMetadataKey 564.IBPluginDependency 565.IBPluginDependency 566.IBPluginDependency 567.IBDateFormatterBehaviorMetadataKey 567.IBPluginDependency 568.IBPluginDependency 569.IBPluginDependency 57.IBEditorWindowLastContentRect 57.IBPluginDependency 57.ImportedFromIB2 57.editorWindowContentRectSynchronizationRect 570.IBDateFormatterBehaviorMetadataKey 570.IBPluginDependency 571.IBPluginDependency 572.IBPluginDependency 573.IBDateFormatterBehaviorMetadataKey 573.IBPluginDependency 58.IBPluginDependency 58.ImportedFromIB2 591.IBPluginDependency 592.IBPluginDependency 593.IBPluginDependency 594.IBPluginDependency 595.IBPluginDependency 596.IBPluginDependency 597.IBPluginDependency 598.IBDateFormatterBehaviorMetadataKey 598.IBPluginDependency 599.IBPluginDependency 600.IBDateFormatterBehaviorMetadataKey 600.IBPluginDependency 601.IBPluginDependency 602.IBDateFormatterBehaviorMetadataKey 602.IBPluginDependency 603.IBPluginDependency 604.IBDateFormatterBehaviorMetadataKey 604.IBPluginDependency 605.IBPluginDependency 606.IBPluginDependency 608.IBAttributePlaceholdersKey 608.IBPluginDependency 609.IBPluginDependency 621.IBPluginDependency 72.IBPluginDependency 72.ImportedFromIB2 73.IBPluginDependency 73.ImportedFromIB2 74.IBPluginDependency 74.ImportedFromIB2 75.IBPluginDependency 75.ImportedFromIB2 77.IBPluginDependency 77.ImportedFromIB2 78.IBPluginDependency 78.ImportedFromIB2 79.IBPluginDependency 79.ImportedFromIB2 80.IBPluginDependency 80.ImportedFromIB2 81.IBEditorWindowLastContentRect 81.IBPluginDependency 81.ImportedFromIB2 81.editorWindowContentRectSynchronizationRect 82.IBPluginDependency 82.ImportedFromIB2 83.IBPluginDependency 83.ImportedFromIB2 92.IBPluginDependency 92.ImportedFromIB2 YES com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{522, 812}, {146, 23}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{436, 809}, {64, 6}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{753, 187}, {275, 113}} com.apple.InterfaceBuilder.CocoaPlugin {{608, 612}, {275, 83}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{547, 180}, {254, 283}} com.apple.InterfaceBuilder.CocoaPlugin {{187, 434}, {243, 243}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{608, 612}, {167, 43}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{753, 217}, {238, 103}} com.apple.InterfaceBuilder.CocoaPlugin {{608, 612}, {241, 103}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{654, 239}, {194, 73}} com.apple.InterfaceBuilder.CocoaPlugin {{525, 802}, {197, 73}} {{380, 836}, {426, 20}} com.apple.InterfaceBuilder.CocoaPlugin {74, 862} {{6, 978}, {478, 20}} com.apple.InterfaceBuilder.CocoaPlugin {{604, 269}, {231, 43}} com.apple.InterfaceBuilder.CocoaPlugin {{475, 832}, {234, 43}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{746, 287}, {220, 133}} com.apple.InterfaceBuilder.CocoaPlugin {{608, 612}, {215, 63}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{324, 529}, {583, 435}} com.apple.InterfaceBuilder.CocoaPlugin {{324, 529}, {583, 435}} {{33, 99}, {480, 360}} {3.40282e+38, 3.40282e+38} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{591, 420}, {83, 43}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{523, 2}, {178, 283}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{753, 197}, {170, 63}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{725, 289}, {246, 23}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{674, 260}, {204, 183}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{878, 180}, {164, 173}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Date when you started the timer com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip The initial date that was set for the timer to fire com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip What the timer currently considers to be its fire time com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip The date the timer actually fires com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Start a timer using the time indicated on the left. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{286, 129}, {275, 183}} com.apple.InterfaceBuilder.CocoaPlugin {{23, 794}, {245, 183}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin ToolTip ToolTip Click to refresh the current fire date. Should normally update itself after time-changing events but you can do it manually here. com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{452, 109}, {196, 203}} com.apple.InterfaceBuilder.CocoaPlugin {{145, 474}, {199, 203}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin YES YES YES YES 621 YES NSObject IBProjectSource NSObject-NoodlePerformWhenIdle.h NSObject IBProjectSource NSTableView-NoodleExtensions.h NSResponder YES YES cancelModal: confirmModal: YES id id IBProjectSource NSResponder-NoodleModalExtensions.h NSTableView scrollToStickyRow: id NSWindow YES YES cancelModal: confirmModal: YES id id NSWindow IBProjectSource NSWindow-NoodleEffects.h TimerLabAppDelegate NSObject YES YES refresh: startTimer: syncPickers: YES id id id YES YES _currentFireDateField _datePicker _fireDateField _initialDateField _initialFireDateField _picker _regularCurrentFireDateField _regularFireDateField _regularInitialDateField _regularInitialFireDateField _timePicker _window window YES NSTextField NSDatePicker NSTextField NSTextField NSTextField NSDatePicker NSTextField NSTextField NSTextField NSTextField NSDatePicker NSWindow NSWindow IBProjectSource Examples/TimerLab/TimerLabAppDelegate.h YES NSActionCell NSCell IBFrameworkSource AppKit.framework/Headers/NSActionCell.h NSApplication NSResponder IBFrameworkSource AppKit.framework/Headers/NSApplication.h NSApplication IBFrameworkSource AppKit.framework/Headers/NSApplicationScripting.h NSApplication IBFrameworkSource AppKit.framework/Headers/NSColorPanel.h NSApplication IBFrameworkSource AppKit.framework/Headers/NSHelpManager.h NSApplication IBFrameworkSource AppKit.framework/Headers/NSPageLayout.h NSApplication IBFrameworkSource AppKit.framework/Headers/NSUserInterfaceItemSearching.h NSBox NSView IBFrameworkSource AppKit.framework/Headers/NSBox.h NSBrowser NSControl IBFrameworkSource AppKit.framework/Headers/NSBrowser.h NSButton NSControl IBFrameworkSource AppKit.framework/Headers/NSButton.h NSButtonCell NSActionCell IBFrameworkSource AppKit.framework/Headers/NSButtonCell.h NSCell NSObject IBFrameworkSource AppKit.framework/Headers/NSCell.h NSControl NSView IBFrameworkSource AppKit.framework/Headers/NSControl.h NSDateFormatter NSFormatter IBFrameworkSource Foundation.framework/Headers/NSDateFormatter.h NSDatePicker NSControl IBFrameworkSource AppKit.framework/Headers/NSDatePicker.h NSDatePickerCell NSActionCell IBFrameworkSource AppKit.framework/Headers/NSDatePickerCell.h NSDocument NSObject YES YES printDocument: revertDocumentToSaved: runPageLayout: saveDocument: saveDocumentAs: saveDocumentTo: YES id id id id id id IBFrameworkSource AppKit.framework/Headers/NSDocument.h NSDocument IBFrameworkSource AppKit.framework/Headers/NSDocumentScripting.h NSDocumentController NSObject YES YES clearRecentDocuments: newDocument: openDocument: saveAllDocuments: YES id id id id IBFrameworkSource AppKit.framework/Headers/NSDocumentController.h NSFontManager NSObject IBFrameworkSource AppKit.framework/Headers/NSFontManager.h NSFormatter NSObject IBFrameworkSource Foundation.framework/Headers/NSFormatter.h NSMatrix NSControl IBFrameworkSource AppKit.framework/Headers/NSMatrix.h NSMenu NSObject IBFrameworkSource AppKit.framework/Headers/NSMenu.h NSMenuItem NSObject IBFrameworkSource AppKit.framework/Headers/NSMenuItem.h NSMovieView NSView IBFrameworkSource AppKit.framework/Headers/NSMovieView.h NSObject IBFrameworkSource AppKit.framework/Headers/NSAccessibility.h NSObject NSObject NSObject NSObject NSObject IBFrameworkSource AppKit.framework/Headers/NSDictionaryController.h NSObject IBFrameworkSource AppKit.framework/Headers/NSDragging.h NSObject NSObject IBFrameworkSource AppKit.framework/Headers/NSFontPanel.h NSObject IBFrameworkSource AppKit.framework/Headers/NSKeyValueBinding.h NSObject NSObject IBFrameworkSource AppKit.framework/Headers/NSNibLoading.h NSObject IBFrameworkSource AppKit.framework/Headers/NSOutlineView.h NSObject IBFrameworkSource AppKit.framework/Headers/NSPasteboard.h NSObject IBFrameworkSource AppKit.framework/Headers/NSSavePanel.h NSObject IBFrameworkSource AppKit.framework/Headers/NSTableView.h NSObject IBFrameworkSource AppKit.framework/Headers/NSToolbarItem.h NSObject IBFrameworkSource AppKit.framework/Headers/NSView.h NSObject IBFrameworkSource Foundation.framework/Headers/NSArchiver.h NSObject IBFrameworkSource Foundation.framework/Headers/NSClassDescription.h NSObject IBFrameworkSource Foundation.framework/Headers/NSError.h NSObject IBFrameworkSource Foundation.framework/Headers/NSFileManager.h NSObject IBFrameworkSource Foundation.framework/Headers/NSKeyValueCoding.h NSObject IBFrameworkSource Foundation.framework/Headers/NSKeyValueObserving.h NSObject IBFrameworkSource Foundation.framework/Headers/NSKeyedArchiver.h NSObject IBFrameworkSource Foundation.framework/Headers/NSObject.h NSObject IBFrameworkSource Foundation.framework/Headers/NSObjectScripting.h NSObject IBFrameworkSource Foundation.framework/Headers/NSPortCoder.h NSObject IBFrameworkSource Foundation.framework/Headers/NSRunLoop.h NSObject IBFrameworkSource Foundation.framework/Headers/NSScriptClassDescription.h NSObject IBFrameworkSource Foundation.framework/Headers/NSScriptKeyValueCoding.h NSObject IBFrameworkSource Foundation.framework/Headers/NSScriptObjectSpecifiers.h NSObject IBFrameworkSource Foundation.framework/Headers/NSScriptWhoseTests.h NSObject IBFrameworkSource Foundation.framework/Headers/NSThread.h NSObject IBFrameworkSource Foundation.framework/Headers/NSURL.h NSObject IBFrameworkSource Foundation.framework/Headers/NSURLConnection.h NSObject IBFrameworkSource Foundation.framework/Headers/NSURLDownload.h NSResponder IBFrameworkSource AppKit.framework/Headers/NSInterfaceStyle.h NSResponder NSObject IBFrameworkSource AppKit.framework/Headers/NSResponder.h NSTableView NSControl NSText NSView IBFrameworkSource AppKit.framework/Headers/NSText.h NSTextField NSControl IBFrameworkSource AppKit.framework/Headers/NSTextField.h NSTextFieldCell NSActionCell IBFrameworkSource AppKit.framework/Headers/NSTextFieldCell.h NSTextView NSText IBFrameworkSource AppKit.framework/Headers/NSTextView.h NSView IBFrameworkSource AppKit.framework/Headers/NSClipView.h NSView NSView IBFrameworkSource AppKit.framework/Headers/NSRulerView.h NSView NSResponder NSWindow IBFrameworkSource AppKit.framework/Headers/NSDrawer.h NSWindow NSResponder IBFrameworkSource AppKit.framework/Headers/NSWindow.h NSWindow IBFrameworkSource AppKit.framework/Headers/NSWindowScripting.h 0 IBCocoaFramework com.apple.InterfaceBuilder.CocoaPlugin.macosx com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3 YES ../../../NoodleKit.xcodeproj 3 YES YES NSMenuCheckmark NSMenuMixedState YES {9, 8} {7, 2} ================================================ FILE: Examples/TimerLab/Read Me.rtf ================================================ {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf320 {\fonttbl\f0\fswiss\fcharset0 Helvetica;\f1\fnil\fcharset0 Monaco;} {\colortbl;\red255\green255\blue255;} {\*\listtable{\list\listtemplateid1\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid1\'01\uc0\u8226 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listname ;}\listid1} {\list\listtemplateid2\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid101\'01\uc0\u8226 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listname ;}\listid2} {\list\listtemplateid3\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid201\'01\uc0\u8226 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listname ;}\listid3}} {\*\listoverridetable{\listoverride\listid1\listoverridecount0\ls1}{\listoverride\listid2\listoverridecount0\ls2}{\listoverride\listid3\listoverridecount0\ls3}} \margl1440\margr1440\vieww19360\viewh17460\viewkind0 \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural \f0\b\fs24 \cf0 TimerLab \b0 \ \ \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural\pardirnatural \cf0 \ This is a sample project and test harness for the my NSTimer category.\ \ Normally, if you create an NSTimer and time is suspended (putting the machine to sleep) or changed (setting the system clock), NSTimer will try and compensate. In a sense, the time given to NSTimer is relative. The problem with this is that sometimes when you tell a timer to fire on a specific date at a specific time, you want it to fire on that specific date at that specific time. Thus, this category was created.\ \ The basic approach is to store the original fire date of the timer and re-set it whenever the machine wakes or the system clock is changed. Since at least one new instance variable is needed, it makes sense to do an NSTimer subclass. Unfortunately, NSRunLoop doesn't seem to work with anything but NSTimer directly. I suspect it's calling some private methods on NSTimer that I'm not privy to.\ \ So instead, it's done as a category. By using Snow Leopard's "associative references" ({\field{\*\fldinst{HYPERLINK "http://developer.apple.com/mac/library/documentation/cocoa/conceptual/objectivec/articles/ocAssociativeReferences.html"}}{\fldrslt http://developer.apple.com/mac/library/documentation/cocoa/conceptual/objectivec/articles/ocAssociativeReferences.html}}), I can add the equivalent of instance variables to NSTimer. And since, I was mucking with NSTimer, I also went ahead and added support for blocks.\ \ The test program allows you to test the regular behavior and the newer "absolute" behavior side by side. Set a time and click "Start timer". Now, put your machine to sleep or mess with the system clock. You'll see the regular timer adjust while the "absolute" timer will stay put.\ \ A blog post on this can be found at: {\field{\*\fldinst{HYPERLINK "http://www.noodlesoft.com/blog/2010/07/01/playing-with-nstimer/"}}{\fldrslt http://www.noodlesoft.com/blog/2010/07/01/playing-with-nstimer/}}\ \ \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural\pardirnatural \b \cf0 Notes \b0 \ \ \pard\tx220\tx720\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\li720\fi-720\ql\qnatural\pardirnatural \ls1\ilvl0\cf0 {\listtext \'95 }Because of technical limitations of being a category, once you create an "absolute" timer, calling -setFireDate: may not work like how you'd want. If you need to change the fire date, create a new timer.\ \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural\pardirnatural \cf0 \ \ \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural\pardirnatural \b \cf0 Possible Improvements\ \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural\pardirnatural \b0 \cf0 \ \pard\tx220\tx720\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\li720\fi-720\ql\qnatural\pardirnatural \ls2\ilvl0\cf0 {\listtext \'95 }Add support for repeating timers.\ \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural\pardirnatural \cf0 \ \ \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural\pardirnatural \b \cf0 Contact \b0 \ \ Just go {\field{\*\fldinst{HYPERLINK "http://www.noodlesoft.com/about.php"}}{\fldrslt www.noodlesoft.com}} and shoot me an email. Or visit the blog article linked above and leave a comment. Bugs, suggestions and other feedback appreciated.\ \ \ \b License \b0 \ \ I am releasing this under the MIT license.\ \ ____________________________________\ \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural\pardirnatural \f1 \cf0 Copyright (c) 2010 Noodlesoft, LLC. All Rights Reserved.\ \ Permission is hereby granted, free of charge, to any person\ obtaining a copy of this software and associated documentation\ files (the "Software"), to deal in the Software without\ restriction, including without limitation the rights to use,\ copy, modify, merge, publish, distribute, sublicense, and/or sell\ copies of the Software, and to permit persons to whom the\ Software is furnished to do so, subject to the following\ conditions:\ \ The above copyright notice and this permission notice shall be\ included in all copies or substantial portions of the Software.\ \ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\ OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\ OTHER DEALINGS IN THE SOFTWARE.\ \pard\tx220\tx720\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\li720\fi-720\ql\qnatural\pardirnatural \ls3\ilvl0 \f0\b \cf0 \ } ================================================ FILE: Examples/TimerLab/TimerLab-Info.plist ================================================ CFBundleDevelopmentRegion English CFBundleExecutable ${EXECUTABLE_NAME} CFBundleIdentifier com.yourcompany.${PRODUCT_NAME:rfc1034identifier} CFBundleInfoDictionaryVersion 6.0 CFBundlePackageType APPL CFBundleShortVersionString 1.0 CFBundleSignature ???? CFBundleVersion 1 LSMinimumSystemVersion ${MACOSX_DEPLOYMENT_TARGET} NSMainNibFile MainMenu NSPrincipalClass NSApplication ================================================ FILE: Examples/TimerLab/TimerLabAppDelegate.h ================================================ // // TimeLabAppDelegate.h // NoodleKit // // Created by Paul Kim on 6/30/10. // Copyright 2010 Noodlesoft, LLC. All rights reserved. // // Permission is hereby granted, free of charge, to any person // obtaining a copy of this software and associated documentation // files (the "Software"), to deal in the Software without // restriction, including without limitation the rights to use, // copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the // Software is furnished to do so, subject to the following // conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #import @interface TimerLabAppDelegate : NSObject { IBOutlet NSWindow *_window; IBOutlet NSDatePicker *_picker; IBOutlet NSDatePicker *_datePicker; IBOutlet NSDatePicker *_timePicker; IBOutlet NSTextField *_initialDateField; IBOutlet NSTextField *_initialFireDateField; IBOutlet NSTextField *_currentFireDateField; IBOutlet NSTextField *_fireDateField; IBOutlet NSTextField *_regularInitialDateField; IBOutlet NSTextField *_regularInitialFireDateField; IBOutlet NSTextField *_regularCurrentFireDateField; IBOutlet NSTextField *_regularFireDateField; NSTimer *_absoluteTimer; NSTimer *_regularTimer; } @property (assign) IBOutlet NSWindow *window; - (IBAction)startTimer:(id)sender; - (IBAction)syncPickers:(id)sender; - (IBAction)refresh:(id)sender; @end ================================================ FILE: Examples/TimerLab/TimerLabAppDelegate.m ================================================ // // TimeLabAppDelegate.m // TimerLab // // Created by Paul Kim on 6/30/10. // Copyright 2010 Noodlesoft, LLC. All rights reserved. // // Permission is hereby granted, free of charge, to any person // obtaining a copy of this software and associated documentation // files (the "Software"), to deal in the Software without // restriction, including without limitation the rights to use, // copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the // Software is furnished to do so, subject to the following // conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #import "TimerLabAppDelegate.h" #import @implementation TimerLabAppDelegate @synthesize window = _window; - (void)applicationDidFinishLaunching:(NSNotification *)aNotification { [_picker setObjectValue:[NSDate date]]; [self syncPickers:_picker]; // We use -delayedRefresh: here instead of refresh: because NSTimer will be watching for these same notifications // and we can't guarantee the order in which the observers are notified (we want the refresh to happen after // the timer adjusts). [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(delayedRefresh:) name:NSSystemTimeZoneDidChangeNotification object:nil]; [[[NSWorkspace sharedWorkspace] notificationCenter] addObserver:self selector:@selector(delayedRefresh:) name:NSWorkspaceDidWakeNotification object:nil]; } - (IBAction)startTimer:(id)sender { NSDate *date; date = [NSDate date]; [_initialDateField setObjectValue:date]; [_regularInitialDateField setObjectValue:date]; date = [_picker objectValue]; [_initialFireDateField setObjectValue:date]; [_regularInitialFireDateField setObjectValue:date]; [_absoluteTimer invalidate]; [_absoluteTimer release]; _absoluteTimer = [[NSTimer alloc] initWithAbsoluteFireDate:date block: ^ (NSTimer *timer) { [_fireDateField setObjectValue:[NSDate date]]; }]; [_fireDateField setObjectValue:nil]; [_currentFireDateField setObjectValue:[_absoluteTimer fireDate]]; [[NSRunLoop currentRunLoop] addTimer:_absoluteTimer forMode:NSDefaultRunLoopMode]; [_regularTimer invalidate]; [_regularTimer release]; _regularTimer = [[NSTimer alloc] initWithFireDate:date interval:0 repeats:NO block: ^ (NSTimer *timer) { [_regularFireDateField setObjectValue:[NSDate date]]; }]; [_regularFireDateField setObjectValue:nil]; [_regularCurrentFireDateField setObjectValue:[_regularTimer fireDate]]; [[NSRunLoop currentRunLoop] addTimer:_regularTimer forMode:NSDefaultRunLoopMode]; } - (IBAction)syncPickers:(id)sender { NSDate *date; date = [sender objectValue]; [_picker setObjectValue:date]; [_datePicker setObjectValue:date]; [_timePicker setObjectValue:date]; } - (IBAction)refresh:(id)sender { [_currentFireDateField setObjectValue:[_absoluteTimer fireDate]]; [_regularCurrentFireDateField setObjectValue:[_regularTimer fireDate]]; } - (IBAction)delayedRefresh:(id)sender { [self performSelector:@selector(refresh:) withObject:nil afterDelay:1.0]; } @end ================================================ FILE: Examples/TimerLab/main.m ================================================ // // main.m // TimerLab // // Created by Paul Kim on 6/30/10. // Copyright 2010 Noodlesoft, LLC. All rights reserved. // #import int main(int argc, char *argv[]) { return NSApplicationMain(argc, (const char **) argv); } ================================================ FILE: Examples/Window Effects/Controller.h ================================================ /* Controller */ #import @interface Controller : NSObject { IBOutlet id _window; } - (IBAction)toggleWindow:sender; @end ================================================ FILE: Examples/Window Effects/Controller.m ================================================ #import "Controller.h" #import "NSWindow-NoodleEffects.h" @implementation Controller - (IBAction)toggleWindow:sender { NSRect rect; rect = [sender convertRect:[sender bounds] toView:nil]; rect.origin = [[sender window] convertBaseToScreen:rect.origin]; if ([_window isVisible]) { [_window zoomOffToRect:rect]; } else { [_window zoomOnFromRect:rect]; } } @end ================================================ FILE: Examples/Window Effects/English.lproj/MainMenu.xib ================================================ 1050 10B504 732 1038.2 437.00 com.apple.InterfaceBuilder.CocoaPlugin 732 YES YES com.apple.InterfaceBuilder.CocoaPlugin YES YES YES YES NSApplication FirstResponder NSApplication 31 2 {{286, 641}, {214, 130}} -1065877504 Window NSWindow View {1.79769e+308, 1.79769e+308} {213, 107} 256 YES 256 {{51, 52}, {112, 32}} YES 67239424 134217728 Zoom! LucidaGrande 13 1044 -2038284033 1 200 25 {214, 130} {{0, 0}, {1920, 1178}} {213, 129} {1.79769e+308, 1.79769e+308} MainMenu YES NewApplication 1048576 2147483647 NSImage NSMenuCheckmark NSImage NSMenuMixedState submenuAction: NewApplication YES About NewApplication 2147483647 YES YES 1048576 2147483647 Preferences… , 1048576 2147483647 YES YES 1048576 2147483647 Services 1048576 2147483647 submenuAction: Services YES _NSServicesMenu YES YES 1048576 2147483647 Hide NewApplication h 1048576 2147483647 Hide Others h 1572864 2147483647 Show All 1048576 2147483647 YES YES 1048576 2147483647 Quit NewApplication q 1048576 2147483647 _NSAppleMenu File 1048576 2147483647 submenuAction: File YES New n 1048576 2147483647 Open... o 1048576 2147483647 Open Recent 1048576 2147483647 submenuAction: Open Recent YES Clear Menu 1048576 2147483647 _NSRecentDocumentsMenu YES YES 1048576 2147483647 Close w 1048576 2147483647 Save s 1048576 2147483647 Save As… S 1048576 2147483647 Revert 2147483647 YES YES 1048576 2147483647 Page Setup… P 1048576 2147483647 Print… p 1048576 2147483647 Edit 1048576 2147483647 submenuAction: Edit YES Undo z 1048576 2147483647 Redo Z 1048576 2147483647 YES YES 1048576 2147483647 Cut x 1048576 2147483647 Copy c 1048576 2147483647 Paste v 1048576 2147483647 Paste and Match Style V 1572864 2147483647 Delete 1048576 2147483647 Select All a 1048576 2147483647 YES YES 1048576 2147483647 Find 1048576 2147483647 submenuAction: Find YES Find… f 1048576 2147483647 1 Find Next g 1048576 2147483647 2 Find Previous G 1048576 2147483647 3 Use Selection for Find e 1048576 2147483647 7 Jump to Selection j 1048576 2147483647 Spelling 1048576 2147483647 submenuAction: Spelling YES Spelling… : 1048576 2147483647 Check Spelling ; 1048576 2147483647 Check Spelling as You Type 1048576 2147483647 Window 1048576 2147483647 submenuAction: Window YES Minimize m 1048576 2147483647 Zoom 1048576 2147483647 YES YES 1048576 2147483647 Bring All to Front 1048576 2147483647 _NSWindowsMenu Help 1048576 2147483647 submenuAction: Help YES NewApplication Help ? 1048576 2147483647 _NSMainMenu Controller 8223 2 {{235, 324}, {374, 235}} 611844096 Window NSPanel {1.79769e+308, 1.79769e+308} 256 YES 268 {{17, 88}, {340, 64}} YES 67239424 138412032 hi! LucidaGrande 48 16 6 System controlColor 3 MC42NjY2NjY2NjY3AA 3 MQA 2 {374, 235} {{0, 0}, {1920, 1178}} {1.79769e+308, 1.79769e+308} YES performMiniaturize: 37 arrangeInFront: 39 print: 86 runPageLayout: 87 showHelp: 122 clearRecentDocuments: 127 terminate: 139 orderFrontStandardAboutPanel: 142 hideOtherApplications: 146 hide: 152 unhideAllApplications: 153 cut: 175 paste: 176 redo: 178 selectAll: 179 undo: 180 copy: 181 showGuessPanel: 188 checkSpelling: 190 toggleContinuousSpellChecking: 192 performClose: 193 delete: 195 performZoom: 198 performFindPanelAction: 199 performFindPanelAction: 200 performFindPanelAction: 201 performFindPanelAction: 202 centerSelectionInVisibleArea: 203 pasteAsPlainText: 205 toggleWindow: 232 _window 251 YES 0 -2 File's Owner -1 First Responder 21 YES Window 2 YES 206 YES 29 YES MainMenu 19 YES 24 YES 5 23 92 197 56 YES 57 YES 58 129 131 YES 130 134 136 143 144 145 149 150 196 83 YES 81 YES 72 73 74 75 77 78 79 80 82 112 124 YES 125 YES 126 103 YES 106 YES 111 163 YES 169 YES 156 157 158 160 164 168 YES 159 YES 154 155 161 162 167 171 172 173 174 184 YES 185 YES 187 189 191 204 227 Controller 238 -3 Application 248 YES 249 YES 254 YES 255 YES YES -3.IBPluginDependency 103.IBPluginDependency 103.ImportedFromIB2 106.IBPluginDependency 106.ImportedFromIB2 111.IBPluginDependency 111.ImportedFromIB2 112.IBPluginDependency 112.ImportedFromIB2 124.IBPluginDependency 124.ImportedFromIB2 125.IBPluginDependency 125.ImportedFromIB2 126.IBPluginDependency 126.ImportedFromIB2 129.IBPluginDependency 129.ImportedFromIB2 130.IBPluginDependency 130.ImportedFromIB2 131.IBPluginDependency 131.ImportedFromIB2 134.IBPluginDependency 134.ImportedFromIB2 136.IBPluginDependency 136.ImportedFromIB2 143.IBPluginDependency 143.ImportedFromIB2 144.IBPluginDependency 144.ImportedFromIB2 145.IBPluginDependency 145.ImportedFromIB2 149.IBPluginDependency 149.ImportedFromIB2 150.IBPluginDependency 150.ImportedFromIB2 154.IBPluginDependency 154.ImportedFromIB2 155.IBPluginDependency 155.ImportedFromIB2 156.IBPluginDependency 156.ImportedFromIB2 157.IBPluginDependency 157.ImportedFromIB2 158.IBPluginDependency 158.ImportedFromIB2 159.IBPluginDependency 159.ImportedFromIB2 160.IBPluginDependency 160.ImportedFromIB2 161.IBPluginDependency 161.ImportedFromIB2 162.IBPluginDependency 162.ImportedFromIB2 163.IBPluginDependency 163.ImportedFromIB2 164.IBPluginDependency 164.ImportedFromIB2 167.IBPluginDependency 167.ImportedFromIB2 168.IBPluginDependency 168.ImportedFromIB2 169.IBPluginDependency 169.ImportedFromIB2 171.IBPluginDependency 171.ImportedFromIB2 172.IBPluginDependency 172.ImportedFromIB2 173.IBPluginDependency 173.ImportedFromIB2 174.IBPluginDependency 174.ImportedFromIB2 184.IBPluginDependency 184.ImportedFromIB2 185.IBPluginDependency 185.ImportedFromIB2 187.IBPluginDependency 187.ImportedFromIB2 189.IBPluginDependency 189.ImportedFromIB2 19.IBPluginDependency 19.ImportedFromIB2 191.IBPluginDependency 191.ImportedFromIB2 196.IBPluginDependency 196.ImportedFromIB2 197.IBPluginDependency 197.ImportedFromIB2 2.IBPluginDependency 2.ImportedFromIB2 204.IBPluginDependency 204.ImportedFromIB2 206.IBPluginDependency 206.ImportedFromIB2 21.IBEditorWindowLastContentRect 21.IBPluginDependency 21.IBWindowTemplateEditedContentRect 21.ImportedFromIB2 21.NSWindowTemplate.visibleAtLaunch 21.windowTemplate.hasMinSize 21.windowTemplate.minSize 227.ImportedFromIB2 23.IBPluginDependency 23.ImportedFromIB2 238.IBPluginDependency 24.IBPluginDependency 24.ImportedFromIB2 248.IBEditorWindowLastContentRect 248.IBPluginDependency 248.IBWindowTemplateEditedContentRect 248.NSWindowTemplate.visibleAtLaunch 249.IBPluginDependency 254.IBPluginDependency 255.IBPluginDependency 29.IBEditorWindowLastContentRect 29.IBPluginDependency 29.ImportedFromIB2 5.IBPluginDependency 5.ImportedFromIB2 56.IBPluginDependency 56.ImportedFromIB2 57.IBPluginDependency 57.ImportedFromIB2 58.IBPluginDependency 58.ImportedFromIB2 72.IBPluginDependency 72.ImportedFromIB2 73.IBPluginDependency 73.ImportedFromIB2 74.IBPluginDependency 74.ImportedFromIB2 75.IBPluginDependency 75.ImportedFromIB2 77.IBPluginDependency 77.ImportedFromIB2 78.IBPluginDependency 78.ImportedFromIB2 79.IBPluginDependency 79.ImportedFromIB2 80.IBPluginDependency 80.ImportedFromIB2 81.IBPluginDependency 81.ImportedFromIB2 82.IBPluginDependency 82.ImportedFromIB2 83.IBPluginDependency 83.ImportedFromIB2 92.IBPluginDependency 92.ImportedFromIB2 YES com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{84, 912}, {214, 130}} com.apple.InterfaceBuilder.CocoaPlugin {{84, 912}, {214, 130}} {213, 107} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{119, 699}, {374, 235}} com.apple.InterfaceBuilder.CocoaPlugin {{119, 699}, {374, 235}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{42, 1057}, {362, 20}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin YES YES YES YES 255 YES Controller NSObject YES YES scriptView scrollView YES NSTextView NSScrollView IBProjectSource Examples/LineNumberView/Controller.h Controller NSObject YES YES doModal: doSheet: YES id id YES YES alert field window YES id id id IBProjectSource Examples/ModalResponder/Controller.h Controller NSObject YES YES _iPhoneTableView _stickyRowTableView YES NSTableView NSTableView IBProjectSource Examples/StickyRowTableView Revue/Controller.h Controller NSObject toggleWindow: id _window id IBProjectSource Examples/Window Effects/Controller.h Controller NSObject YES YES zoom: zoomOff: YES id id IBUserSource FirstResponder NSObject IBUserSource NSObject IBProjectSource NSObject-NoodlePerformWhenIdle.h NSObject IBProjectSource NoodleStickyRowTableView.h NSResponder YES YES cancelModal: confirmModal: YES id id IBProjectSource NSResponder-NoodleModalExtensions.h NSTableView scrollToStickyRow: id NSWindow YES YES cancelModal: confirmModal: YES id id NSWindow IBProjectSource NSWindow-NoodleEffects.h YES NSActionCell NSCell IBFrameworkSource AppKit.framework/Headers/NSActionCell.h NSApplication NSResponder IBFrameworkSource AppKit.framework/Headers/NSApplication.h NSApplication IBFrameworkSource AppKit.framework/Headers/NSApplicationScripting.h NSApplication IBFrameworkSource AppKit.framework/Headers/NSColorPanel.h NSApplication IBFrameworkSource AppKit.framework/Headers/NSHelpManager.h NSApplication IBFrameworkSource AppKit.framework/Headers/NSPageLayout.h NSApplication IBFrameworkSource AppKit.framework/Headers/NSUserInterfaceItemSearching.h NSBrowser NSControl IBFrameworkSource AppKit.framework/Headers/NSBrowser.h NSButton NSControl IBFrameworkSource AppKit.framework/Headers/NSButton.h NSButtonCell NSActionCell IBFrameworkSource AppKit.framework/Headers/NSButtonCell.h NSCell NSObject IBFrameworkSource AppKit.framework/Headers/NSCell.h NSControl NSView IBFrameworkSource AppKit.framework/Headers/NSControl.h NSDocument NSObject YES YES printDocument: revertDocumentToSaved: runPageLayout: saveDocument: saveDocumentAs: saveDocumentTo: YES id id id id id id IBFrameworkSource AppKit.framework/Headers/NSDocument.h NSDocument IBFrameworkSource AppKit.framework/Headers/NSDocumentScripting.h NSDocumentController NSObject YES YES clearRecentDocuments: newDocument: openDocument: saveAllDocuments: YES id id id id IBFrameworkSource AppKit.framework/Headers/NSDocumentController.h NSFormatter NSObject IBFrameworkSource Foundation.framework/Headers/NSFormatter.h NSMatrix NSControl IBFrameworkSource AppKit.framework/Headers/NSMatrix.h NSMenu NSObject IBFrameworkSource AppKit.framework/Headers/NSMenu.h NSMenuItem NSObject IBFrameworkSource AppKit.framework/Headers/NSMenuItem.h NSMovieView NSView IBFrameworkSource AppKit.framework/Headers/NSMovieView.h NSObject IBFrameworkSource AppKit.framework/Headers/NSAccessibility.h NSObject NSObject NSObject NSObject NSObject IBFrameworkSource AppKit.framework/Headers/NSDictionaryController.h NSObject IBFrameworkSource AppKit.framework/Headers/NSDragging.h NSObject IBFrameworkSource AppKit.framework/Headers/NSFontManager.h NSObject IBFrameworkSource AppKit.framework/Headers/NSFontPanel.h NSObject IBFrameworkSource AppKit.framework/Headers/NSKeyValueBinding.h NSObject NSObject IBFrameworkSource AppKit.framework/Headers/NSNibLoading.h NSObject IBFrameworkSource AppKit.framework/Headers/NSOutlineView.h NSObject IBFrameworkSource AppKit.framework/Headers/NSPasteboard.h NSObject IBFrameworkSource AppKit.framework/Headers/NSSavePanel.h NSObject IBFrameworkSource AppKit.framework/Headers/NSTableView.h NSObject IBFrameworkSource AppKit.framework/Headers/NSToolbarItem.h NSObject IBFrameworkSource AppKit.framework/Headers/NSView.h NSObject IBFrameworkSource Foundation.framework/Headers/NSArchiver.h NSObject IBFrameworkSource Foundation.framework/Headers/NSClassDescription.h NSObject IBFrameworkSource Foundation.framework/Headers/NSError.h NSObject IBFrameworkSource Foundation.framework/Headers/NSFileManager.h NSObject IBFrameworkSource Foundation.framework/Headers/NSKeyValueCoding.h NSObject IBFrameworkSource Foundation.framework/Headers/NSKeyValueObserving.h NSObject IBFrameworkSource Foundation.framework/Headers/NSKeyedArchiver.h NSObject IBFrameworkSource Foundation.framework/Headers/NSObject.h NSObject IBFrameworkSource Foundation.framework/Headers/NSObjectScripting.h NSObject IBFrameworkSource Foundation.framework/Headers/NSPortCoder.h NSObject IBFrameworkSource Foundation.framework/Headers/NSRunLoop.h NSObject IBFrameworkSource Foundation.framework/Headers/NSScriptClassDescription.h NSObject IBFrameworkSource Foundation.framework/Headers/NSScriptKeyValueCoding.h NSObject IBFrameworkSource Foundation.framework/Headers/NSScriptObjectSpecifiers.h NSObject IBFrameworkSource Foundation.framework/Headers/NSScriptWhoseTests.h NSObject IBFrameworkSource Foundation.framework/Headers/NSThread.h NSObject IBFrameworkSource Foundation.framework/Headers/NSURL.h NSObject IBFrameworkSource Foundation.framework/Headers/NSURLConnection.h NSObject IBFrameworkSource Foundation.framework/Headers/NSURLDownload.h NSPanel NSWindow IBFrameworkSource AppKit.framework/Headers/NSPanel.h NSResponder IBFrameworkSource AppKit.framework/Headers/NSInterfaceStyle.h NSResponder NSObject IBFrameworkSource AppKit.framework/Headers/NSResponder.h NSScrollView NSView IBFrameworkSource AppKit.framework/Headers/NSScrollView.h NSTableView NSControl NSText NSView IBFrameworkSource AppKit.framework/Headers/NSText.h NSTextField NSControl IBFrameworkSource AppKit.framework/Headers/NSTextField.h NSTextFieldCell NSActionCell IBFrameworkSource AppKit.framework/Headers/NSTextFieldCell.h NSTextView NSText IBFrameworkSource AppKit.framework/Headers/NSTextView.h NSView IBFrameworkSource AppKit.framework/Headers/NSClipView.h NSView NSView IBFrameworkSource AppKit.framework/Headers/NSRulerView.h NSView NSResponder NSWindow IBFrameworkSource AppKit.framework/Headers/NSDrawer.h NSWindow NSResponder IBFrameworkSource AppKit.framework/Headers/NSWindow.h NSWindow IBFrameworkSource AppKit.framework/Headers/NSWindowScripting.h 0 com.apple.InterfaceBuilder.CocoaPlugin.macosx com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3 YES ../../../NoodleKit.xcodeproj 3 ================================================ FILE: Examples/Window Effects/Window Effects-Info.plist ================================================ CFBundleDevelopmentRegion English CFBundleExecutable ${EXECUTABLE_NAME} CFBundleIdentifier com.noodlesoft.${PRODUCT_NAME:rfc1034identifier} CFBundleInfoDictionaryVersion 6.0 CFBundlePackageType APPL CFBundleShortVersionString 1.0 CFBundleSignature ???? CFBundleVersion 1 LSMinimumSystemVersion ${MACOSX_DEPLOYMENT_TARGET} NSMainNibFile MainMenu NSPrincipalClass NSApplication ================================================ FILE: Examples/Window Effects/main.m ================================================ // // main.m // WindowZoom // // Created by Paul Kim on 6/18/07. // Copyright __MyCompanyName__ 2007. All rights reserved. // #import int main(int argc, char *argv[]) { return NSApplicationMain(argc, (const char **) argv); } ================================================ FILE: Examples/iToonz/Controller.h ================================================ // // Controller.h // NoodleKit // // Created by Paul Kim on 10/21/09. // Copyright 2009 Noodlesoft, LLC. All rights reserved. // // Permission is hereby granted, free of charge, to any person // obtaining a copy of this software and associated documentation // files (the "Software"), to deal in the Software without // restriction, including without limitation the rights to use, // copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the // Software is furnished to do so, subject to the following // conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #import @class NoodleTableView; @interface Controller : NSObject { IBOutlet NoodleTableView *_tableView; NSArray *_entries; id _number; } @property (readonly) NSArray *entries; @end ================================================ FILE: Examples/iToonz/Controller.m ================================================ // // Controller.m // NoodleKit // // Created by Paul Kim on 10/21/09. // Copyright 2009 Noodlesoft, LLC. All rights reserved. // // Created by Paul Kim on 10/20/09. // Copyright 2009 Noodlesoft, LLC. All rights reserved. // // Permission is hereby granted, free of charge, to any person // obtaining a copy of this software and associated documentation // files (the "Software"), to deal in the Software without // restriction, including without limitation the rights to use, // copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the // Software is furnished to do so, subject to the following // conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #import "Controller.h" #import "NoodleTableView.h" #define ARTIST_KEY @"artist" #define ARTWORK_KEY @"artwork" #define ALBUM_KEY @"album" #define SONGCOUNT_KEY @"songCount" @implementation Controller //@synthesize window; @synthesize entries = _entries; - (void)awakeFromNib { [_tableView setIntercellSpacing:NSMakeSize(0.0, 0.0)]; [_tableView setShowsStickyRowHeader:YES]; [_tableView setRowSpanningEnabledForCapableColumns:YES]; _number = [NSNumber numberWithInt:5]; } - (void)applicationDidFinishLaunching:(NSNotification *)aNotification { _entries = [[NSArray alloc] initWithObjects: [NSDictionary dictionaryWithObjectsAndKeys: @"Mr Disco", ARTIST_KEY, [NSImage imageNamed:NSImageNameFolderBurnable], ARTWORK_KEY, @"Burn Baby Burn", ALBUM_KEY, [NSNumber numberWithInteger:9], SONGCOUNT_KEY, nil], [NSDictionary dictionaryWithObjectsAndKeys: @"Pierre LeMac", ARTIST_KEY, [NSImage imageNamed:NSImageNameBonjour], ARTWORK_KEY, @"Bonjour Ma Cherie", ALBUM_KEY, [NSNumber numberWithInteger:13], SONGCOUNT_KEY, nil], [NSDictionary dictionaryWithObjectsAndKeys: @"M.C. Mac", ARTIST_KEY, [NSImage imageNamed:NSImageNameDotMac], ARTWORK_KEY, @"Dot Mackin'", ALBUM_KEY, [NSNumber numberWithInteger:7], SONGCOUNT_KEY, nil], [NSDictionary dictionaryWithObjectsAndKeys: @"M.C. Mac", ARTIST_KEY, [NSImage imageNamed:NSImageNameFolderSmart], ARTWORK_KEY, @"You Think You're So Smart", ALBUM_KEY, [NSNumber numberWithInteger:14], SONGCOUNT_KEY, nil], [NSDictionary dictionaryWithObjectsAndKeys: @"ComputerHead", ARTIST_KEY, [NSImage imageNamed:NSImageNameComputer], ARTWORK_KEY, @"Cancel Computer", ALBUM_KEY, [NSNumber numberWithInteger:12], SONGCOUNT_KEY, nil], nil]; [(NoodleTableColumn *)[_tableView tableColumnWithIdentifier:@"Album"] setRowSpanningEnabled:NO]; [_tableView reloadData]; } - (NSInteger)numberOfRowsInTableView:(NSTableView *)aTableView { return [[_entries valueForKeyPath:@"@sum.songCount"] integerValue]; } - (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex { NSInteger tally, songCount; id identifier; tally = 0; identifier = [aTableColumn identifier]; for (NSDictionary *dict in _entries) { songCount = [[dict objectForKey:SONGCOUNT_KEY] integerValue]; if (rowIndex < tally + songCount) { if ([identifier isEqual:@"Artwork"]) { return [dict objectForKey:ARTWORK_KEY]; } else if ([identifier isEqual:@"Album"]) { return [dict objectForKey:ALBUM_KEY]; } else if ([identifier isEqual:@"Artist"]) { return [dict objectForKey:ARTIST_KEY]; } else if ([identifier isEqual:@"Song"]) { return [NSString stringWithFormat:@"Song #%d", rowIndex - tally + 1]; } } tally += songCount; } return nil; } - (void)tableView:(NSTableView *)tableView didClickTableColumn:(NSTableColumn *)tableColumn { if ([[tableColumn identifier] isEqual:@"Album"]) { [(NoodleTableColumn *)tableColumn setRowSpanningEnabled:![(NoodleTableColumn *)tableColumn isRowSpanningEnabled]]; [_tableView reloadData]; } } - (BOOL)tableView:(NSTableView *)tableView isStickyRow:(NSInteger)row { id value, newValue; NSTableColumn *column; column = [tableView tableColumnWithIdentifier:@"Artist"]; value = [self tableView:tableView objectValueForTableColumn:column row:row]; if (row > 0) { newValue = [self tableView:tableView objectValueForTableColumn:column row:row - 1]; if (![value isEqual:newValue]) { return YES; } return NO; } return YES; } - (BOOL)tableView:(NSTableView *)tableView shouldDisplayCellInStickyRowHeaderForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)rowIndex { return [[tableColumn identifier] isEqual:@"Artist"]; } @end ================================================ FILE: Examples/iToonz/English.lproj/MainMenu.xib ================================================ 1050 10B504 740 1038.2 437.00 com.apple.InterfaceBuilder.CocoaPlugin 740 YES YES com.apple.InterfaceBuilder.CocoaPlugin YES YES YES YES NSApplication FirstResponder NSApplication AMainMenu YES iToonz 1048576 2147483647 NSImage NSMenuCheckmark NSImage NSMenuMixedState submenuAction: iToonz YES About iToonz 2147483647 YES YES 1048576 2147483647 Preferences… , 1048576 2147483647 YES YES 1048576 2147483647 Services 1048576 2147483647 submenuAction: Services YES _NSServicesMenu YES YES 1048576 2147483647 Hide iToonz h 1048576 2147483647 Hide Others h 1572864 2147483647 Show All 1048576 2147483647 YES YES 1048576 2147483647 Quit iToonz q 1048576 2147483647 _NSAppleMenu File 1048576 2147483647 submenuAction: File YES New n 1048576 2147483647 Open… o 1048576 2147483647 Open Recent 1048576 2147483647 submenuAction: Open Recent YES Clear Menu 1048576 2147483647 _NSRecentDocumentsMenu YES YES 1048576 2147483647 Close w 1048576 2147483647 Save s 1048576 2147483647 Save As… S 1179648 2147483647 Revert to Saved 2147483647 YES YES 1048576 2147483647 Page Setup... P 1179648 2147483647 Print… p 1048576 2147483647 Edit 1048576 2147483647 submenuAction: Edit YES Undo z 1048576 2147483647 Redo Z 1179648 2147483647 YES YES 1048576 2147483647 Cut x 1048576 2147483647 Copy c 1048576 2147483647 Paste v 1048576 2147483647 Paste and Match Style V 1572864 2147483647 Delete 1048576 2147483647 Select All a 1048576 2147483647 YES YES 1048576 2147483647 Find 1048576 2147483647 submenuAction: Find YES Find… f 1048576 2147483647 1 Find Next g 1048576 2147483647 2 Find Previous G 1179648 2147483647 3 Use Selection for Find e 1048576 2147483647 7 Jump to Selection j 1048576 2147483647 Spelling and Grammar 1048576 2147483647 submenuAction: Spelling and Grammar YES Show Spelling and Grammar : 1048576 2147483647 Check Document Now ; 1048576 2147483647 YES YES 2147483647 Check Spelling While Typing 1048576 2147483647 Check Grammar With Spelling 1048576 2147483647 Correct Spelling Automatically 2147483647 Substitutions 1048576 2147483647 submenuAction: Substitutions YES Show Substitutions 2147483647 YES YES 2147483647 Smart Copy/Paste f 1048576 2147483647 1 Smart Quotes g 1048576 2147483647 2 Smart Dashes 2147483647 Smart Links G 1179648 2147483647 3 Text Replacement 2147483647 Transformations 2147483647 submenuAction: Transformations YES Make Upper Case 2147483647 Make Lower Case 2147483647 Capitalize 2147483647 Speech 1048576 2147483647 submenuAction: Speech YES Start Speaking 1048576 2147483647 Stop Speaking 1048576 2147483647 Format 2147483647 submenuAction: Format YES Font 2147483647 submenuAction: Font YES Show Fonts t 1048576 2147483647 Bold b 1048576 2147483647 2 Italic i 1048576 2147483647 1 Underline u 1048576 2147483647 YES YES 2147483647 Bigger + 1048576 2147483647 3 Smaller - 1048576 2147483647 4 YES YES 2147483647 Kern 2147483647 submenuAction: Kern YES Use Default 2147483647 Use None 2147483647 Tighten 2147483647 Loosen 2147483647 Ligature 2147483647 submenuAction: Ligature YES Use Default 2147483647 Use None 2147483647 Use All 2147483647 Baseline 2147483647 submenuAction: Baseline YES Use Default 2147483647 Superscript 2147483647 Subscript 2147483647 Raise 2147483647 Lower 2147483647 YES YES 2147483647 Show Colors C 1048576 2147483647 YES YES 2147483647 Copy Style c 1572864 2147483647 Paste Style v 1572864 2147483647 _NSFontMenu Text 2147483647 submenuAction: Text YES Align Left { 1048576 2147483647 Center | 1048576 2147483647 Justify 2147483647 Align Right } 1048576 2147483647 YES YES 2147483647 Writing Direction 2147483647 submenuAction: Writing Direction YES YES Paragraph 2147483647 CURlZmF1bHQ 2147483647 CUxlZnQgdG8gUmlnaHQ 2147483647 CVJpZ2h0IHRvIExlZnQ 2147483647 YES YES 2147483647 YES Selection 2147483647 CURlZmF1bHQ 2147483647 CUxlZnQgdG8gUmlnaHQ 2147483647 CVJpZ2h0IHRvIExlZnQ 2147483647 YES YES 2147483647 Show Ruler 2147483647 Copy Ruler c 1310720 2147483647 Paste Ruler v 1310720 2147483647 View 1048576 2147483647 submenuAction: View YES Show Toolbar t 1572864 2147483647 Customize Toolbar… 1048576 2147483647 Window 1048576 2147483647 submenuAction: Window YES Minimize m 1048576 2147483647 Zoom 1048576 2147483647 YES YES 1048576 2147483647 Bring All to Front 1048576 2147483647 _NSWindowsMenu Help 2147483647 submenuAction: Help YES iToonz Help ? 1048576 2147483647 _NSHelpMenu _NSMainMenu 15 2 {{335, 388}, {558, 362}} 1954021376 iToonz NSWindow {1.79769e+308, 1.79769e+308} 256 YES 274 YES 2304 YES 256 {516, 304} YES 256 {516, 17} -2147483392 {{555, 0}, {16, 17}} YES Artist 122 10 3.4028234663852886e+38 75628096 2048 Artist LucidaGrande 11 3100 6 System headerColor 3 MQA 6 System headerTextColor 3 MAA 67239488 272630784 Text LucidaGrande 13 1044 6 System controlColor 3 MC42NjY2NjY2NjY3AA 6 System controlTextColor 3 YES YES Artwork 101 40 1000 75628096 2048 Artwork 3 MC4zMzMzMzI5ODU2AA 67239424 33554432 1 0 0 NO 3 YES YES Album 134 40 1000 75628096 2048 Album 337772096 2048 Text Cell 6 System controlBackgroundColor 3 YES YES Song 147 10 3.4028234663852886e+38 75628096 2048 Song 337772096 2048 Text Cell 3 YES YES 3 2 6 System gridColor 3 MC41AA 20 -155189248 3 4 15 0 YES 0 {{1, 17}, {516, 304}} 4 -2147483392 {{555, 17}, {15, 289}} _doScroller: 0.95065789473684215 -2147483392 {{1, 306}, {569, 15}} 1 _doScroller: 0.89610389610389607 0.88080495356037147 2304 YES {{1, 0}, {516, 17}} 4 {{20, 20}, {518, 322}} 562 QSAAAEEgAABBsAAAQbAAAA {558, 362} {{0, 0}, {1920, 1178}} {1.79769e+308, 1.79769e+308} Controller NSFontManager YES performMiniaturize: 37 arrangeInFront: 39 print: 86 runPageLayout: 87 clearRecentDocuments: 127 orderFrontStandardAboutPanel: 142 performClose: 193 toggleContinuousSpellChecking: 222 undo: 223 copy: 224 checkSpelling: 225 paste: 226 stopSpeaking: 227 cut: 228 showGuessPanel: 230 redo: 231 selectAll: 232 startSpeaking: 233 delete: 235 performZoom: 240 performFindPanelAction: 241 centerSelectionInVisibleArea: 245 toggleGrammarChecking: 347 toggleSmartInsertDelete: 355 toggleAutomaticQuoteSubstitution: 356 toggleAutomaticLinkDetection: 357 saveDocument: 362 saveDocumentAs: 363 revertDocumentToSaved: 364 runToolbarCustomizationPalette: 365 toggleToolbarShown: 366 hide: 367 hideOtherApplications: 368 unhideAllApplications: 370 newDocument: 373 openDocument: 374 addFontTrait: 421 addFontTrait: 422 modifyFont: 423 orderFrontFontPanel: 424 modifyFont: 425 raiseBaseline: 426 lowerBaseline: 427 copyFont: 428 subscript: 429 superscript: 430 tightenKerning: 431 underline: 432 orderFrontColorPanel: 433 useAllLigatures: 434 loosenKerning: 435 pasteFont: 436 unscript: 437 useStandardKerning: 438 useStandardLigatures: 439 turnOffLigatures: 440 turnOffKerning: 441 terminate: 449 toggleAutomaticSpellingCorrection: 456 orderFrontSubstitutionsPanel: 458 toggleAutomaticDashSubstitution: 461 toggleAutomaticTextReplacement: 463 uppercaseWord: 464 capitalizeWord: 467 lowercaseWord: 468 pasteAsPlainText: 486 performFindPanelAction: 487 performFindPanelAction: 488 performFindPanelAction: 489 showHelp: 493 delegate 495 alignCenter: 518 pasteRuler: 519 toggleRuler: 520 alignRight: 521 copyRuler: 522 alignJustified: 523 alignLeft: 524 makeBaseWritingDirectionNatural: 525 makeBaseWritingDirectionLeftToRight: 526 makeBaseWritingDirectionRightToLeft: 527 makeTextWritingDirectionNatural: 528 makeTextWritingDirectionLeftToRight: 529 makeTextWritingDirectionRightToLeft: 530 window 532 dataSource 542 _tableView 544 delegate 548 YES 0 -2 File's Owner -1 First Responder -3 Application 29 YES 19 YES 56 YES 217 YES 83 YES 81 YES 75 80 78 72 82 124 YES 77 73 79 112 74 125 YES 126 205 YES 202 198 207 214 199 203 197 206 215 218 YES 216 YES 200 YES 219 201 204 220 YES 213 210 221 208 209 57 YES 58 134 150 136 144 129 143 236 131 YES 149 145 130 24 YES 92 5 239 23 295 YES 296 YES 297 298 211 YES 212 YES 195 196 346 348 YES 349 YES 350 351 354 371 YES 372 YES 375 YES 376 YES 377 YES 388 YES 389 390 391 392 393 394 395 396 397 YES 398 YES 399 YES 400 401 402 403 404 405 YES 406 407 408 409 410 411 YES 412 413 414 415 YES 416 417 418 419 420 450 YES 451 YES 452 453 454 457 459 460 462 465 466 485 490 YES 491 YES 492 494 496 YES 497 YES 498 499 500 501 502 503 YES 504 505 506 507 508 YES 509 510 511 512 513 514 515 516 517 533 YES 534 535 536 YES 537 538 YES 539 YES 540 543 546 YES 547 549 YES 554 YES YES -3.IBPluginDependency 112.IBPluginDependency 112.ImportedFromIB2 124.IBPluginDependency 124.ImportedFromIB2 125.IBPluginDependency 125.ImportedFromIB2 125.editorWindowContentRectSynchronizationRect 126.IBPluginDependency 126.ImportedFromIB2 129.IBPluginDependency 129.ImportedFromIB2 130.IBPluginDependency 130.ImportedFromIB2 130.editorWindowContentRectSynchronizationRect 131.IBPluginDependency 131.ImportedFromIB2 134.IBPluginDependency 134.ImportedFromIB2 136.IBPluginDependency 136.ImportedFromIB2 143.IBPluginDependency 143.ImportedFromIB2 144.IBPluginDependency 144.ImportedFromIB2 145.IBPluginDependency 145.ImportedFromIB2 149.IBPluginDependency 149.ImportedFromIB2 150.IBPluginDependency 150.ImportedFromIB2 19.IBPluginDependency 19.ImportedFromIB2 195.IBPluginDependency 195.ImportedFromIB2 196.IBPluginDependency 196.ImportedFromIB2 197.IBPluginDependency 197.ImportedFromIB2 198.IBPluginDependency 198.ImportedFromIB2 199.IBPluginDependency 199.ImportedFromIB2 200.IBEditorWindowLastContentRect 200.IBPluginDependency 200.ImportedFromIB2 200.editorWindowContentRectSynchronizationRect 201.IBPluginDependency 201.ImportedFromIB2 202.IBPluginDependency 202.ImportedFromIB2 203.IBPluginDependency 203.ImportedFromIB2 204.IBPluginDependency 204.ImportedFromIB2 205.IBEditorWindowLastContentRect 205.IBPluginDependency 205.ImportedFromIB2 205.editorWindowContentRectSynchronizationRect 206.IBPluginDependency 206.ImportedFromIB2 207.IBPluginDependency 207.ImportedFromIB2 208.IBPluginDependency 208.ImportedFromIB2 209.IBPluginDependency 209.ImportedFromIB2 210.IBPluginDependency 210.ImportedFromIB2 211.IBPluginDependency 211.ImportedFromIB2 212.IBPluginDependency 212.ImportedFromIB2 212.editorWindowContentRectSynchronizationRect 213.IBPluginDependency 213.ImportedFromIB2 214.IBPluginDependency 214.ImportedFromIB2 215.IBPluginDependency 215.ImportedFromIB2 216.IBPluginDependency 216.ImportedFromIB2 217.IBPluginDependency 217.ImportedFromIB2 218.IBPluginDependency 218.ImportedFromIB2 219.IBPluginDependency 219.ImportedFromIB2 220.IBEditorWindowLastContentRect 220.IBPluginDependency 220.ImportedFromIB2 220.editorWindowContentRectSynchronizationRect 221.IBPluginDependency 221.ImportedFromIB2 23.IBPluginDependency 23.ImportedFromIB2 236.IBPluginDependency 236.ImportedFromIB2 239.IBPluginDependency 239.ImportedFromIB2 24.IBEditorWindowLastContentRect 24.IBPluginDependency 24.ImportedFromIB2 24.editorWindowContentRectSynchronizationRect 29.IBEditorWindowLastContentRect 29.IBPluginDependency 29.ImportedFromIB2 29.WindowOrigin 29.editorWindowContentRectSynchronizationRect 295.IBPluginDependency 296.IBEditorWindowLastContentRect 296.IBPluginDependency 296.editorWindowContentRectSynchronizationRect 297.IBPluginDependency 298.IBPluginDependency 346.IBPluginDependency 346.ImportedFromIB2 348.IBPluginDependency 348.ImportedFromIB2 349.IBEditorWindowLastContentRect 349.IBPluginDependency 349.ImportedFromIB2 349.editorWindowContentRectSynchronizationRect 350.IBPluginDependency 350.ImportedFromIB2 351.IBPluginDependency 351.ImportedFromIB2 354.IBPluginDependency 354.ImportedFromIB2 371.IBEditorWindowLastContentRect 371.IBPluginDependency 371.IBWindowTemplateEditedContentRect 371.NSWindowTemplate.visibleAtLaunch 371.editorWindowContentRectSynchronizationRect 371.windowTemplate.maxSize 372.IBPluginDependency 375.IBPluginDependency 376.IBEditorWindowLastContentRect 376.IBPluginDependency 377.IBPluginDependency 388.IBEditorWindowLastContentRect 388.IBPluginDependency 389.IBPluginDependency 390.IBPluginDependency 391.IBPluginDependency 392.IBPluginDependency 393.IBPluginDependency 394.IBPluginDependency 395.IBPluginDependency 396.IBPluginDependency 397.IBPluginDependency 398.IBPluginDependency 399.IBPluginDependency 400.IBPluginDependency 401.IBPluginDependency 402.IBPluginDependency 403.IBPluginDependency 404.IBPluginDependency 405.IBPluginDependency 406.IBPluginDependency 407.IBPluginDependency 408.IBPluginDependency 409.IBPluginDependency 410.IBPluginDependency 411.IBPluginDependency 412.IBPluginDependency 413.IBPluginDependency 414.IBPluginDependency 415.IBPluginDependency 416.IBPluginDependency 417.IBPluginDependency 418.IBPluginDependency 419.IBPluginDependency 450.IBPluginDependency 451.IBEditorWindowLastContentRect 451.IBPluginDependency 452.IBPluginDependency 453.IBPluginDependency 454.IBPluginDependency 457.IBPluginDependency 459.IBPluginDependency 460.IBPluginDependency 462.IBPluginDependency 465.IBPluginDependency 466.IBPluginDependency 485.IBPluginDependency 490.IBPluginDependency 491.IBEditorWindowLastContentRect 491.IBPluginDependency 492.IBPluginDependency 496.IBPluginDependency 497.IBEditorWindowLastContentRect 497.IBPluginDependency 498.IBPluginDependency 499.IBPluginDependency 5.IBPluginDependency 5.ImportedFromIB2 500.IBPluginDependency 501.IBPluginDependency 502.IBPluginDependency 503.IBPluginDependency 504.IBPluginDependency 505.IBPluginDependency 506.IBPluginDependency 507.IBPluginDependency 508.IBEditorWindowLastContentRect 508.IBPluginDependency 509.IBPluginDependency 510.IBPluginDependency 511.IBPluginDependency 512.IBPluginDependency 513.IBPluginDependency 514.IBPluginDependency 515.IBPluginDependency 516.IBPluginDependency 517.IBPluginDependency 533.IBPluginDependency 534.IBPluginDependency 535.IBPluginDependency 536.CustomClassName 536.IBPluginDependency 537.IBPluginDependency 538.CustomClassName 538.IBPluginDependency 539.CustomClassName 539.IBPluginDependency 540.IBPluginDependency 543.IBPluginDependency 546.IBPluginDependency 547.IBPluginDependency 549.CustomClassName 549.IBAttributePlaceholdersKey 549.IBPluginDependency 554.IBPluginDependency 56.IBPluginDependency 56.ImportedFromIB2 57.IBEditorWindowLastContentRect 57.IBPluginDependency 57.ImportedFromIB2 57.editorWindowContentRectSynchronizationRect 58.IBPluginDependency 58.ImportedFromIB2 72.IBPluginDependency 72.ImportedFromIB2 73.IBPluginDependency 73.ImportedFromIB2 74.IBPluginDependency 74.ImportedFromIB2 75.IBPluginDependency 75.ImportedFromIB2 77.IBPluginDependency 77.ImportedFromIB2 78.IBPluginDependency 78.ImportedFromIB2 79.IBPluginDependency 79.ImportedFromIB2 80.IBPluginDependency 80.ImportedFromIB2 81.IBEditorWindowLastContentRect 81.IBPluginDependency 81.ImportedFromIB2 81.editorWindowContentRectSynchronizationRect 82.IBPluginDependency 82.ImportedFromIB2 83.IBPluginDependency 83.ImportedFromIB2 92.IBPluginDependency 92.ImportedFromIB2 YES com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{522, 812}, {146, 23}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{436, 809}, {64, 6}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{753, 187}, {275, 113}} com.apple.InterfaceBuilder.CocoaPlugin {{608, 612}, {275, 83}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{547, 180}, {254, 283}} com.apple.InterfaceBuilder.CocoaPlugin {{187, 434}, {243, 243}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{608, 612}, {167, 43}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{753, 217}, {238, 103}} com.apple.InterfaceBuilder.CocoaPlugin {{608, 612}, {241, 103}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{654, 239}, {194, 73}} com.apple.InterfaceBuilder.CocoaPlugin {{525, 802}, {197, 73}} {{380, 836}, {414, 20}} com.apple.InterfaceBuilder.CocoaPlugin {74, 862} {{6, 978}, {478, 20}} com.apple.InterfaceBuilder.CocoaPlugin {{604, 269}, {231, 43}} com.apple.InterfaceBuilder.CocoaPlugin {{475, 832}, {234, 43}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{746, 287}, {220, 133}} com.apple.InterfaceBuilder.CocoaPlugin {{608, 612}, {215, 63}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{219, 455}, {558, 362}} com.apple.InterfaceBuilder.CocoaPlugin {{219, 455}, {558, 362}} {{33, 99}, {480, 360}} {3.40282e+38, 3.40282e+38} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{591, 420}, {83, 43}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{523, 2}, {178, 283}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{753, 197}, {170, 63}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{733, 813}, {154, 23}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{674, 260}, {204, 183}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{878, 180}, {164, 173}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin NoodleTableView com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin NoodleTableColumn com.apple.InterfaceBuilder.CocoaPlugin NoodleTableColumn com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin NoodleTableColumn YES YES com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{392, 653}, {183, 183}} com.apple.InterfaceBuilder.CocoaPlugin {{23, 794}, {245, 183}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{452, 109}, {196, 203}} com.apple.InterfaceBuilder.CocoaPlugin {{145, 474}, {199, 203}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin YES YES YES YES 562 YES Controller NSObject YES YES scriptView scrollView YES NSTextView NSScrollView IBProjectSource Examples/LineNumberView/Controller.h Controller NSObject YES YES doModal: doSheet: YES id id YES YES alert field window YES id id id IBProjectSource Examples/ModalResponder/Controller.h Controller NSObject YES YES _iPhoneTableView _stickyRowTableView YES NSTableView NSTableView IBProjectSource Examples/StickyRowTableView Revue/Controller.h Controller NSObject toggleWindow: id _window id IBProjectSource Examples/Window Effects/Controller.h Controller NSObject _tableView NoodleTableView IBProjectSource Examples/iToonz/Controller.h NSObject IBProjectSource NSObject-NoodlePerformWhenIdle.h NSObject IBProjectSource NSTableView-NoodleExtensions.h NSObject IBProjectSource NoodleStickyRowTableView.h NSResponder YES YES cancelModal: confirmModal: YES id id IBProjectSource NSResponder-NoodleModalExtensions.h NSTableColumn NSTableView scrollToStickyRow: id NSTableView scrollToStickyRow: id NSWindow YES YES cancelModal: confirmModal: YES id id NSWindow IBProjectSource NSWindow-NoodleEffects.h NoodleTableColumn NSTableColumn IBProjectSource NoodleTableView.h NoodleTableView NSTableView NoodleTableView NSTableView IBUserSource YES NSActionCell NSCell IBFrameworkSource AppKit.framework/Headers/NSActionCell.h NSApplication NSResponder IBFrameworkSource AppKit.framework/Headers/NSApplication.h NSApplication IBFrameworkSource AppKit.framework/Headers/NSApplicationScripting.h NSApplication IBFrameworkSource AppKit.framework/Headers/NSColorPanel.h NSApplication IBFrameworkSource AppKit.framework/Headers/NSHelpManager.h NSApplication IBFrameworkSource AppKit.framework/Headers/NSPageLayout.h NSApplication IBFrameworkSource AppKit.framework/Headers/NSUserInterfaceItemSearching.h NSBrowser NSControl IBFrameworkSource AppKit.framework/Headers/NSBrowser.h NSCell NSObject IBFrameworkSource AppKit.framework/Headers/NSCell.h NSControl NSView IBFrameworkSource AppKit.framework/Headers/NSControl.h NSDocument NSObject YES YES printDocument: revertDocumentToSaved: runPageLayout: saveDocument: saveDocumentAs: saveDocumentTo: YES id id id id id id IBFrameworkSource AppKit.framework/Headers/NSDocument.h NSDocument IBFrameworkSource AppKit.framework/Headers/NSDocumentScripting.h NSDocumentController NSObject YES YES clearRecentDocuments: newDocument: openDocument: saveAllDocuments: YES id id id id IBFrameworkSource AppKit.framework/Headers/NSDocumentController.h NSFontManager NSObject IBFrameworkSource AppKit.framework/Headers/NSFontManager.h NSFormatter NSObject IBFrameworkSource Foundation.framework/Headers/NSFormatter.h NSImageCell NSCell IBFrameworkSource AppKit.framework/Headers/NSImageCell.h NSMatrix NSControl IBFrameworkSource AppKit.framework/Headers/NSMatrix.h NSMenu NSObject IBFrameworkSource AppKit.framework/Headers/NSMenu.h NSMenuItem NSObject IBFrameworkSource AppKit.framework/Headers/NSMenuItem.h NSMovieView NSView IBFrameworkSource AppKit.framework/Headers/NSMovieView.h NSObject IBFrameworkSource AppKit.framework/Headers/NSAccessibility.h NSObject NSObject NSObject NSObject NSObject IBFrameworkSource AppKit.framework/Headers/NSDictionaryController.h NSObject IBFrameworkSource AppKit.framework/Headers/NSDragging.h NSObject NSObject IBFrameworkSource AppKit.framework/Headers/NSFontPanel.h NSObject IBFrameworkSource AppKit.framework/Headers/NSKeyValueBinding.h NSObject NSObject IBFrameworkSource AppKit.framework/Headers/NSNibLoading.h NSObject IBFrameworkSource AppKit.framework/Headers/NSOutlineView.h NSObject IBFrameworkSource AppKit.framework/Headers/NSPasteboard.h NSObject IBFrameworkSource AppKit.framework/Headers/NSSavePanel.h NSObject IBFrameworkSource AppKit.framework/Headers/NSTableView.h NSObject IBFrameworkSource AppKit.framework/Headers/NSToolbarItem.h NSObject IBFrameworkSource AppKit.framework/Headers/NSView.h NSObject IBFrameworkSource Foundation.framework/Headers/NSArchiver.h NSObject IBFrameworkSource Foundation.framework/Headers/NSClassDescription.h NSObject IBFrameworkSource Foundation.framework/Headers/NSError.h NSObject IBFrameworkSource Foundation.framework/Headers/NSFileManager.h NSObject IBFrameworkSource Foundation.framework/Headers/NSKeyValueCoding.h NSObject IBFrameworkSource Foundation.framework/Headers/NSKeyValueObserving.h NSObject IBFrameworkSource Foundation.framework/Headers/NSKeyedArchiver.h NSObject IBFrameworkSource Foundation.framework/Headers/NSObject.h NSObject IBFrameworkSource Foundation.framework/Headers/NSObjectScripting.h NSObject IBFrameworkSource Foundation.framework/Headers/NSPortCoder.h NSObject IBFrameworkSource Foundation.framework/Headers/NSRunLoop.h NSObject IBFrameworkSource Foundation.framework/Headers/NSScriptClassDescription.h NSObject IBFrameworkSource Foundation.framework/Headers/NSScriptKeyValueCoding.h NSObject IBFrameworkSource Foundation.framework/Headers/NSScriptObjectSpecifiers.h NSObject IBFrameworkSource Foundation.framework/Headers/NSScriptWhoseTests.h NSObject IBFrameworkSource Foundation.framework/Headers/NSThread.h NSObject IBFrameworkSource Foundation.framework/Headers/NSURL.h NSObject IBFrameworkSource Foundation.framework/Headers/NSURLConnection.h NSObject IBFrameworkSource Foundation.framework/Headers/NSURLDownload.h NSResponder IBFrameworkSource AppKit.framework/Headers/NSInterfaceStyle.h NSResponder NSObject IBFrameworkSource AppKit.framework/Headers/NSResponder.h NSScrollView NSView IBFrameworkSource AppKit.framework/Headers/NSScrollView.h NSScroller NSControl IBFrameworkSource AppKit.framework/Headers/NSScroller.h NSTableColumn NSObject IBFrameworkSource AppKit.framework/Headers/NSTableColumn.h NSTableHeaderView NSView IBFrameworkSource AppKit.framework/Headers/NSTableHeaderView.h NSTableView NSControl NSText NSView IBFrameworkSource AppKit.framework/Headers/NSText.h NSTextFieldCell NSActionCell IBFrameworkSource AppKit.framework/Headers/NSTextFieldCell.h NSTextView NSText IBFrameworkSource AppKit.framework/Headers/NSTextView.h NSView IBFrameworkSource AppKit.framework/Headers/NSClipView.h NSView NSView IBFrameworkSource AppKit.framework/Headers/NSRulerView.h NSView NSResponder NSWindow IBFrameworkSource AppKit.framework/Headers/NSDrawer.h NSWindow NSResponder IBFrameworkSource AppKit.framework/Headers/NSWindow.h NSWindow IBFrameworkSource AppKit.framework/Headers/NSWindowScripting.h 0 com.apple.InterfaceBuilder.CocoaPlugin.macosx com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3 YES ../../../NoodleKit.xcodeproj 3 ================================================ FILE: Examples/iToonz/Read Me.rtf ================================================ {\rtf1\ansi\ansicpg1252\cocoartf1038\cocoasubrtf110 {\fonttbl\f0\fswiss\fcharset0 Helvetica;\f1\fnil\fcharset0 Monaco;} {\colortbl;\red255\green255\blue255;} {\*\listtable{\list\listtemplateid1\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid1\'01\uc0\u8226 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listname ;}\listid1} {\list\listtemplateid2\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid101\'01\uc0\u8226 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listname ;}\listid2} {\list\listtemplateid3\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid201\'01\uc0\u8226 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listname ;}\listid3} {\list\listtemplateid4\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid301\'01\uc0\u8226 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listname ;}\listid4} {\list\listtemplateid5\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid401\'01\uc0\u8226 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listname ;}\listid5} {\list\listtemplateid6\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid501\'01\uc0\u8226 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listname ;}\listid6} {\list\listtemplateid7\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid601\'01\uc0\u8226 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listname ;}\listid7}} {\*\listoverridetable{\listoverride\listid1\listoverridecount0\ls1}{\listoverride\listid2\listoverridecount0\ls2}{\listoverride\listid3\listoverridecount0\ls3}{\listoverride\listid4\listoverridecount0\ls4}{\listoverride\listid5\listoverridecount0\ls5}{\listoverride\listid6\listoverridecount0\ls6}{\listoverride\listid7\listoverridecount0\ls7}} \margl1440\margr1440\vieww19360\viewh17460\viewkind0 \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural \f0\b\fs24 \cf0 iToonz \b0 \ version 0.68\ \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural\pardirnatural \cf0 \ This is a sample project and test harness for the row spanning feature of NoodleTableView.\ \ The row spanning feature allows a tableview to have cells span multiple rows. An example of this can be seen in iTune's "Artwork" column.\ \ This all started from a blog post by Jesper here: {\field{\*\fldinst{HYPERLINK "http://waffle.wootest.net/2009/10/04/artwork-column-in-cocoa/"}}{\fldrslt http://waffle.wootest.net/2009/10/04/artwork-column-in-cocoa/}}\ \ This was followed by Jacob Xiao's post here: {\field{\*\fldinst{HYPERLINK "http://likethought.com/lockfocus/2009/10/another-way-to-mimic-the-artwork-column-in-cocoa/"}}{\fldrslt http://likethought.com/lockfocus/2009/10/another-way-to-mimic-the-artwork-column-in-cocoa/}}\ \ These posts inspired me to implement a generalized version that should work with any type of cell. It was Jacob's approach that I ended up using in my version. Thanks to both Jesper and Jacob for the inspiration for this.\ \ You can view my post here: {\field{\*\fldinst{HYPERLINK "http://www.noodlesoft.com/blog/2009/10/20/yet-another-way-to-mimic-the-artwork-column-in-cocoa"}}{\fldrslt http://www.noodlesoft.com/blog/2009/10/20/yet-another-way-to-mimic-the-artwork-column-in-cocoa}}\ \ Note that the original class in the blog post has been merged with the NoodleStickyRowTableView into NoodleTableView. As a result, both features can be used concurrently. This project also demonstrates how to specify via a delegate method which indicates which cells will be displayed in the sticky row header.\ \ \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural\pardirnatural \b \cf0 Notes \b0 \ \ \pard\tx220\tx720\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\li720\fi-720\ql\qnatural\pardirnatural \ls1\ilvl0\cf0 {\listtext \'95 }As mentioned above, you can use any NSCell subclass.\ {\listtext \'95 }"Spans" are determined by contiguous ranges of rows with the same object value for a particular column. It is assumed that the same object value will result in the same visual output for a particular column cell.\ {\listtext \'95 }Internally, a special cell is used. It renders the full cell and then draws out each row's slice into the tableview. This also allows for an optimization to only do the full render once instead of for every row slice.\ {\listtext \'95 }If the first column is set to span rows, horizontal grid lines will only be drawn for the last row in a span.\ {\listtext \'95 }Span cells will not highlight.\ {\listtext \'95 }Clicking on span cells will do nothing.\ \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural\pardirnatural \cf0 \ To integrate this functionality, first off, you need to use NoodleTableView. For any column that you want to have row spanning, make that column be an instance of NoodleTableColumn. You can then either set the rowSpanningEnabled property or call -setRowSpanningEnabledForCapableColumns: which will enable it for every NoodleTableColumn in the tableview.\ \ \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural\pardirnatural \b \cf0 Possible Improvements\ \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural\pardirnatural \b0 \cf0 \ \pard\tx220\tx720\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\li720\fi-720\ql\qnatural\pardirnatural \ls2\ilvl0\cf0 {\listtext \'95 }Provide delegate hooks for determining the range of a span.\ {\listtext \'95 }Have mouse clicks on span cells select the first row in the span. This is how iTunes works though it only does it if you click the artwork itself, not the cell in general. Possibly something left up to the application to implement.\ \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural\pardirnatural \cf0 \ \ \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural\pardirnatural \b \cf0 Contact \b0 \ \ Just go {\field{\*\fldinst{HYPERLINK "http://www.noodlesoft.com/about.php"}}{\fldrslt www.noodlesoft.com}} and shoot me an email. Or visit the blog article linked above and leave a comment. Bugs, suggestions and other feedback appreciated.\ \ \ \b License \b0 \ \ I am releasing this under the MIT license.\ \ ____________________________________\ \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural\pardirnatural \f1 \cf0 Copyright (c) 2009 Noodlesoft, LLC. All Rights Reserved.\ \ Permission is hereby granted, free of charge, to any person\ obtaining a copy of this software and associated documentation\ files (the "Software"), to deal in the Software without\ restriction, including without limitation the rights to use,\ copy, modify, merge, publish, distribute, sublicense, and/or sell\ copies of the Software, and to permit persons to whom the\ Software is furnished to do so, subject to the following\ conditions:\ \ The above copyright notice and this permission notice shall be\ included in all copies or substantial portions of the Software.\ \ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\ OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\ OTHER DEALINGS IN THE SOFTWARE.\ \pard\tx220\tx720\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\li720\fi-720\ql\qnatural\pardirnatural \ls3\ilvl0 \f0\b \cf0 \ \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural\pardirnatural \cf0 \ Changelog \b0 \ \pard\tx220\tx720\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\li720\fi-720\ql\qnatural\pardirnatural \ls4\ilvl0\cf0 \ \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural\pardirnatural \cf0 0.68:\ \pard\tx220\tx720\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\li720\fi-720\ql\qnatural\pardirnatural \ls5\ilvl0\cf0 {\listtext \'95 }Fixed crash when clicking on a non-span cell and dragging to a span cell.\ {\listtext \'95 }Fixed highlighting behavior. Span cells should no longer highlight.\ \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural\pardirnatural \cf0 \ 0.37:\ \pard\tx220\tx720\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\li720\fi-720\ql\qnatural\pardirnatural \ls6\ilvl0\cf0 {\listtext \'95 }Fixed drawing loop causing high CPU usage.\ {\listtext \'95 }Revamped grid code.\ \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural\pardirnatural \cf0 \ 0.04:\ \pard\tx220\tx720\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\li720\fi-720\ql\qnatural\pardirnatural \ls7\ilvl0\cf0 {\listtext \'95 }Initial public release\ \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural\pardirnatural \cf0 \ } ================================================ FILE: Examples/iToonz/iToonz-Info.plist ================================================ CFBundleDevelopmentRegion English CFBundleExecutable ${EXECUTABLE_NAME} CFBundleIdentifier com.yourcompany.${PRODUCT_NAME:rfc1034identifier} CFBundleInfoDictionaryVersion 6.0 CFBundlePackageType APPL CFBundleShortVersionString 1.0 CFBundleSignature ???? CFBundleVersion 1 LSMinimumSystemVersion ${MACOSX_DEPLOYMENT_TARGET} NSMainNibFile MainMenu NSPrincipalClass NSApplication ================================================ FILE: Examples/iToonz/main.m ================================================ // // main.m // NoodleStickyRowTableViewTest // // Created by Paul Kim on 8/23/09. // Copyright Noodlesoft, LLC 2009. All rights reserved. // #import int main(int argc, char *argv[]) { return NSApplicationMain(argc, (const char **) argv); } ================================================ FILE: Info.plist ================================================ CFBundleDevelopmentRegion English CFBundleExecutable ${EXECUTABLE_NAME} CFBundleName ${PRODUCT_NAME} CFBundleIconFile CFBundleIdentifier com.noodlesoft.${PRODUCT_NAME:rfc1034Identifier} CFBundleInfoDictionaryVersion 6.0 CFBundlePackageType FMWK CFBundleSignature ???? CFBundleVersion 1 CFBundleShortVersionString 1.0 NSPrincipalClass ================================================ FILE: NSImage-NoodleExtensions.h ================================================ // // NSImage-NoodleExtensions.h // NoodleKit // // Created by Paul Kim on 3/24/07. // Copyright 2007-2009 Noodlesoft, LLC. All rights reserved. // // Permission is hereby granted, free of charge, to any person // obtaining a copy of this software and associated documentation // files (the "Software"), to deal in the Software without // restriction, including without limitation the rights to use, // copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the // Software is furnished to do so, subject to the following // conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #import /* This category provides methods for dealing with flipped images. These should draw images correctly regardless of whether the current context or the current image are flipped. Unless you know what you are doing, these should be used in lieu of the normal NSImage drawing/compositing methods. For more details, check out the related blog post at http://www.noodlesoft.com/blog/2009/02/02/understanding-flipped-coordinate-systems/ */ @interface NSImage (NoodleExtensions) /*! @method drawAdjustedAtPoint:fromRect:operation:fraction: @abstract Draws all or part of the image at the specified point in the current coordinate system. Unlike other methods in NSImage, this will orient the image properly in flipped coordinate systems. @param point The location in the current coordinate system at which to draw the image. @param srcRect The source rectangle specifying the portion of the image you want to draw. The coordinates of this rectangle are specified in the image's own coordinate system. If you pass in NSZeroRect, the entire image is drawn. @param op The compositing operation to use when drawing the image. See the NSCompositingOperation constants. @param delta The opacity of the image, specified as a value from 0.0 to 1.0. Specifying a value of 0.0 draws the image as fully transparent while a value of 1.0 draws the image as fully opaque. Values greater than 1.0 are interpreted as 1.0. @discussion The image content is drawn at its current resolution and is not scaled unless the CTM of the current coordinate system itself contains a scaling factor. The image is otherwise positioned and oriented using the current coordinate system, except that it takes the flipped status into account, drawing right-side-up in a such a case. Unlike the compositeToPoint:fromRect:operation: and compositeToPoint:fromRect:operation:fraction: methods, this method checks the rectangle you pass to the srcRect parameter and makes sure it does not lie outside the image bounds. */ - (void)drawAdjustedAtPoint:(NSPoint)aPoint fromRect:(NSRect)srcRect operation:(NSCompositingOperation)op fraction:(CGFloat)delta; /*! @method drawAdjustedInRect:fromRect:operation:fraction: @abstract Draws all or part of the image in the specified rectangle in the current coordinate system. Unlike other methods in NSImage, this will orient the image properly in flipped coordinate systems. @param dstRect The rectangle in which to draw the image, specified in the current coordinate system. @param srcRect The source rectangle specifying the portion of the image you want to draw. The coordinates of this rectangle must be specified using the image's own coordinate system. If you pass in NSZeroRect, the entire image is drawn. @param op The compositing operation to use when drawing the image. See the NSCompositingOperation constants. @param delta The opacity of the image, specified as a value from 0.0 to 1.0. Specifying a value of 0.0 draws the image as fully transparent while a value of 1.0 draws the image as fully opaque. Values greater than 1.0 are interpreted as 1.0. @discussion If the srcRect and dstRect rectangles have different sizes, the source portion of the image is scaled to fit the specified destination rectangle. The image is otherwise positioned and oriented using the current coordinate system, except that it takes the flipped status into account, drawing right-side-up in a such a case. Unlike the compositeToPoint:fromRect:operation: and compositeToPoint:fromRect:operation:fraction: methods, this method checks the rectangle you pass to the srcRect parameter and makes sure it does not lie outside the image bounds. */ - (void)drawAdjustedInRect:(NSRect)dstRect fromRect:(NSRect)srcRect operation:(NSCompositingOperation)op fraction:(CGFloat)delta; /*! @method unflippedImage @abstract Returns a version of the receiver but unflipped. @discussion This does not actually flip the image but returns an image with the same orientation but with an unflipped coordinate system internally (isFlipped returns NO). If the image is already unflipped, this method returns self. */ - (NSImage *)unflippedImage; @end ================================================ FILE: NSImage-NoodleExtensions.m ================================================ // // NSImage-NoodleExtensions.m // NoodleKit // // Created by Paul Kim on 3/24/07. // Copyright 2007-2009 Noodlesoft, LLC. All rights reserved. // // Permission is hereby granted, free of charge, to any person // obtaining a copy of this software and associated documentation // files (the "Software"), to deal in the Software without // restriction, including without limitation the rights to use, // copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the // Software is furnished to do so, subject to the following // conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #import "NSImage-NoodleExtensions.h" @implementation NSImage (NoodleExtensions) - (void)drawAdjustedAtPoint:(NSPoint)aPoint fromRect:(NSRect)srcRect operation:(NSCompositingOperation)op fraction:(CGFloat)delta { NSSize size = [self size]; [self drawAdjustedInRect:NSMakeRect(aPoint.x, aPoint.y, size.width, size.height) fromRect:srcRect operation:op fraction:delta]; } - (void)drawAdjustedInRect:(NSRect)dstRect fromRect:(NSRect)srcRect operation:(NSCompositingOperation)op fraction:(CGFloat)delta { NSGraphicsContext *context; BOOL contextIsFlipped; context = [NSGraphicsContext currentContext]; contextIsFlipped = [context isFlipped]; if (contextIsFlipped) { NSAffineTransform *transform; [context saveGraphicsState]; // Flip the coordinate system back. transform = [NSAffineTransform transform]; [transform translateXBy:0 yBy:NSMaxY(dstRect)]; [transform scaleXBy:1 yBy:-1]; [transform concat]; // The transform above places the y-origin right where the image should be drawn. dstRect.origin.y = 0.0; } [self drawInRect:dstRect fromRect:srcRect operation:op fraction:delta]; if (contextIsFlipped) { [context restoreGraphicsState]; } } - (NSImage *)unflippedImage { if ([self isFlipped]) { NSImage *newImage; newImage = [[[NSImage alloc] initWithSize:[self size]] autorelease]; [newImage lockFocus]; [self drawAtPoint:NSZeroPoint fromRect:NSZeroRect operation:NSCompositeCopy fraction:1.0]; [newImage unlockFocus]; return newImage; } return self; } @end ================================================ FILE: NSIndexSet-NoodleExtensions.h ================================================ // // NSIndexSet-NoodleExtensions.h // NoodleRowSpanningTableViewTest // // Created by Paul Kim on 10/20/09. // Copyright 2009 Noodlesoft, LLC. All rights reserved. // // Permission is hereby granted, free of charge, to any person // obtaining a copy of this software and associated documentation // files (the "Software"), to deal in the Software without // restriction, including without limitation the rights to use, // copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the // Software is furnished to do so, subject to the following // conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #import @interface NoodleIndexSetEnumerator : NSObject { NSUInteger *_indexes; NSUInteger _count; NSUInteger _currentIndex; } // Returns NSNotFound when there are no more indexes. - (NSUInteger)nextIndex; @end @interface NSIndexSet (NoodleExtensions) - (NoodleIndexSetEnumerator *)indexEnumerator; @end ================================================ FILE: NSIndexSet-NoodleExtensions.m ================================================ // // NSIndexSet-NoodleExtensions.m // NoodleRowSpanningTableViewTest // // Created by Paul Kim on 10/20/09. // Copyright 2009 Noodlesoft, LLC. All rights reserved. // // Permission is hereby granted, free of charge, to any person // obtaining a copy of this software and associated documentation // files (the "Software"), to deal in the Software without // restriction, including without limitation the rights to use, // copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the // Software is furnished to do so, subject to the following // conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #import "NSIndexSet-NoodleExtensions.h" @interface NoodleIndexSetEnumerator () + enumeratorWithIndexSet:(NSIndexSet *)set; - initWithIndexSet:(NSIndexSet *)set; @end @implementation NoodleIndexSetEnumerator + enumeratorWithIndexSet:(NSIndexSet *)set { return [[[[self class] alloc] initWithIndexSet:set] autorelease]; } - initWithIndexSet:(NSIndexSet *)set { if ((self = [super init]) != nil) { _currentIndex = 0; _count = [set count]; _indexes = (NSUInteger *)malloc(sizeof(NSUInteger) * _count); [set getIndexes:_indexes maxCount:_count inIndexRange:nil]; } return self; } - (void)dealloc { free(_indexes); _indexes = NULL; [super dealloc]; } - (void)finalize { free(_indexes); [super finalize]; } - (NSUInteger)nextIndex { if (_currentIndex < _count) { NSUInteger i; i = _indexes[_currentIndex]; _currentIndex++; return i; } return NSNotFound; } @end @implementation NSIndexSet (NoodleExtensions) - (NoodleIndexSetEnumerator *)indexEnumerator { return [NoodleIndexSetEnumerator enumeratorWithIndexSet:self]; } @end ================================================ FILE: NSObject-NoodlePerformWhenIdle.h ================================================ // // NSObject-IdleExtensions.h // NoodleKit // // Created by Paul Kim on 12/30/07. // Copyright 2007 Noodlesoft, LLC. All rights reserved. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. #import @interface NSObject (NoodlePerformWhenIdle) - (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterSystemIdleTime:(NSTimeInterval)delay; - (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterSystemIdleTime:(NSTimeInterval)delay withinTimeLimit:(NSTimeInterval)maxTime; @end ================================================ FILE: NSObject-NoodlePerformWhenIdle.m ================================================ // // NSObject-IdleExtensions.m // NoodleKit // // Created by Paul Kim on 12/30/07. // Copyright 2007-2012 Noodlesoft, LLC. All rights reserved. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. #import "NSObject-NoodlePerformWhenIdle.h" #import @implementation NSObject (NoodlePerformWhenIdle) // Heard somewhere that this prototype may be missing in some cases so adding it here just in case. CG_EXTERN CFTimeInterval CGEventSourceSecondsSinceLastEventType( CGEventSourceStateID source, CGEventType eventType ) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER; // Semi-private method. Used by the public methods - (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterSystemIdleTime:(NSTimeInterval)delay withinTimeLimit:(NSTimeInterval)maxTime startTime:(NSTimeInterval)startTime { CFTimeInterval idleTime; NSTimeInterval timeSinceInitialCall; timeSinceInitialCall = [NSDate timeIntervalSinceReferenceDate] - startTime; if (maxTime > 0) { if (timeSinceInitialCall >= maxTime) { [self performSelector:aSelector withObject:anArgument]; return; } } idleTime = CGEventSourceSecondsSinceLastEventType(kCGEventSourceStateHIDSystemState, kCGAnyInputEventType); if (idleTime < delay) { NSTimeInterval fireTime; NSMethodSignature *signature; NSInvocation *invocation; signature = [self methodSignatureForSelector:@selector(performSelector:withObject:afterSystemIdleTime:withinTimeLimit:startTime:)]; invocation = [NSInvocation invocationWithMethodSignature:signature]; [invocation setSelector:@selector(performSelector:withObject:afterSystemIdleTime:withinTimeLimit:startTime:)]; [invocation setTarget:self]; [invocation setArgument:&aSelector atIndex:2]; [invocation setArgument:&anArgument atIndex:3]; [invocation setArgument:&delay atIndex:4]; [invocation setArgument:&maxTime atIndex:5]; [invocation setArgument:&startTime atIndex:6]; fireTime = delay - idleTime; if (maxTime > 0) { fireTime = MIN(fireTime, maxTime - timeSinceInitialCall); } // Not idle for long enough. Set a timer and check back later [NSTimer scheduledTimerWithTimeInterval:fireTime invocation:invocation repeats:NO]; } else { [self performSelector:aSelector withObject:anArgument]; } } - (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterSystemIdleTime:(NSTimeInterval)delay { [self performSelector:aSelector withObject:anArgument afterSystemIdleTime:delay withinTimeLimit:-1]; } - (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterSystemIdleTime:(NSTimeInterval)delay withinTimeLimit:(NSTimeInterval)maxTime { SInt32 version; // NOTE: Even though CGEventSourceSecondsSinceLastEventType exists on Tiger, // it appears to hang on some Tiger systems. For now, only enabling for Leopard or later. if ((Gestalt(gestaltSystemVersion, &version) == noErr) && (version >= 0x1050)) { NSTimeInterval startTime; startTime = [NSDate timeIntervalSinceReferenceDate]; [self performSelector:aSelector withObject:anArgument afterSystemIdleTime:delay withinTimeLimit:maxTime startTime:startTime]; } else { // For pre-10.5, just call it after a delay. Change this if you want to throw an exception // instead. [self performSelector:aSelector withObject:anArgument afterDelay:delay]; } } @end ================================================ FILE: NSResponder-NoodleModalExtensions.h ================================================ // // NSResponder-ModalExtensions.h // NoodleKit // // Created by Paul Kim on 3/6/08. // Copyright 2008-2009 Noodlesoft, LLC. All rights reserved. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. #import /* These categories provide simple methods to handle alert dialogs (window or sheet form). Hook your "OK" and "Cancel" buttons to these methods to the first responder in IB and you're done. The modal session will return NSOKButton or NSCancelButton. I'll leave it to you to figure out which one does what. For more details, check out the related blog post at http://www.noodlesoft.com/blog/2008/03/10/modal-glue/ */ @interface NSResponder (NoodleModalExtensions) - (void)confirmModal:(id)sender; - (void)cancelModal:(id)sender; @end @interface NSWindow (NoodleModalExtensions) - (void)confirmModal:(id)sender; - (void)cancelModal:(id)sender; @end ================================================ FILE: NSResponder-NoodleModalExtensions.m ================================================ // // NSResponder-ModalExtensions.m // NoodleKit // // Created by Paul Kim on 3/6/08. // Copyright 2008-2009 Noodlesoft, LLC. All rights reserved. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. #import "NSResponder-NoodleModalExtensions.h" @implementation NSResponder (NoodleModalExtensions) - (void)confirmModal:(id)sender { [[self nextResponder] confirmModal:sender]; } - (void)cancelModal:(id)sender { [[self nextResponder] cancelModal:sender]; } @end @implementation NSWindow (NoodleModalExtensions) - (BOOL)stopModalWindowOrSheetWithCode:(NSInteger)returnCode sender:(id)sender { if ([NSApp modalWindow] == self) { [self orderOut:sender]; [NSApp stopModalWithCode:returnCode]; return YES; } else if ([self isSheet]) { [self orderOut:sender]; [NSApp endSheet:self returnCode:returnCode]; return YES; } else if ([self attachedSheet] != nil) { NSWindow *sheet; sheet = [self attachedSheet]; [sheet orderOut:sender]; [NSApp endSheet:sheet returnCode:returnCode]; } return NO; } - (void)confirmModal:(id)sender { if (![self stopModalWindowOrSheetWithCode:NSOKButton sender:sender]) { [[self nextResponder] confirmModal:sender]; } } - (void)cancelModal:(id)sender { if (![self stopModalWindowOrSheetWithCode:NSCancelButton sender:sender]) { [[self nextResponder] cancelModal:self]; } } @end ================================================ FILE: NSTableView-NoodleExtensions.h ================================================ // // NSTableView-NoodleExtensions.h // NoodleKit // // Created by Paul Kim on 10/22/09. // Copyright 2009 Noodlesoft, LLC. All rights reserved. // // Permission is hereby granted, free of charge, to any person // obtaining a copy of this software and associated documentation // files (the "Software"), to deal in the Software without // restriction, including without limitation the rights to use, // copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the // Software is furnished to do so, subject to the following // conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #import typedef NSUInteger NoodleStickyRowTransition; enum { NoodleStickyRowTransitionNone, NoodleStickyRowTransitionFadeIn }; @interface NSTableView (NoodleExtensions) #pragma mark Sticky Row Header methods // Note: see NoodleTableView's -drawRect on how to hook in this functionality in a subclass /* Currently set to any groups rows (as dictated by the delegate). The delegate can implement -tableView:isStickyRow: to override this. */ - (BOOL)isRowSticky:(NSInteger)rowIndex; /* Does the actual drawing of the sticky row. Override if you want a custom look. You shouldn't invoke this directly. See -drawStickyRowHeader. */ - (void)drawStickyRow:(NSInteger)row clipRect:(NSRect)clipRect; /* Draws the sticky row at the top of the table. You have to override -drawRect and call this method, that being all you need to get the sticky row stuff to work in your subclass. Look at NoodleStickyRowTableView. Note that you shouldn't need to override this. To modify the look of the row, override -drawStickyRow: instead. */ - (void)drawStickyRowHeader; /* Returns the rect of the sticky view header. Will return NSZeroRect if there is no current sticky row. */ - (NSRect)stickyRowHeaderRect; /* Does an animated scroll to the current sticky row. Clicking on the sticky row header will trigger this. */ - (IBAction)scrollToStickyRow:(id)sender; /* Returns what kind of transition you want when the row becomes sticky. Fade-in is the default. */ - (NoodleStickyRowTransition)stickyRowHeaderTransition; #pragma mark Row Spanning methods /* Returns the range of the span at the given column and row indexes. The span is determined by a range of contiguous rows having the same object value. */ - (NSRange)rangeOfRowSpanAtColumn:(NSInteger)columnIndex row:(NSInteger)rowIndex; @end @class NoodleRowSpanningCell; @interface NSTableColumn (NoodleExtensions) #pragma mark Row Spanning methods /* Returns whether this column will try to consolidate rows into spans. */ - (BOOL)isRowSpanningEnabled; /* Returns the cell used to draw the spanning regions. Default implementation returns nil. */ - (NoodleRowSpanningCell *)spanningCell; @end @interface NSOutlineView (NoodleExtensions) #pragma mark Sticky Row Header methods /* Currently set to any groups rows (or as dictated by the delegate). The delegate can implement -outlineView:isStickyRow: to override this. */ - (BOOL)isRowSticky:(NSInteger)rowIndex; @end @interface NSObject (NoodleStickyRowDelegate) /* Allows the delegate to specify if a row is sticky. By default, group rows are sticky. The delegate can override that by implementing this method. */ - (BOOL)tableView:(NSTableView *)tableView isStickyRow:(NSInteger)rowIndex; /* Allows the delegate to specify whether a certain cell should be drawn in the sticky row header */ - (BOOL)tableView:(NSTableView *)tableView shouldDisplayCellInStickyRowHeaderForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)rowIndex; /* Same as above but for outline views. */ - (BOOL)outlineView:(NSOutlineView *)outlineView isStickyItem:(id)item; @end ================================================ FILE: NSTableView-NoodleExtensions.m ================================================ // // NSTableView-NoodleExtensions.m // NoodleKit // // Created by Paul Kim on 10/22/09. // Copyright 2009 Noodlesoft, LLC. All rights reserved. // // Permission is hereby granted, free of charge, to any person // obtaining a copy of this software and associated documentation // files (the "Software"), to deal in the Software without // restriction, including without limitation the rights to use, // copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the // Software is furnished to do so, subject to the following // conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #import "NSTableView-NoodleExtensions.h" #import "NSImage-NoodleExtensions.h" #define NOODLE_STICKY_ROW_VIEW_TAG 233931134 void NoodleClearRect(NSRect rect) { [[NSColor clearColor] set]; NSRectFill(rect); } @interface NSTableView (NoodlePrivate) #pragma mark Sticky Row Header methods // Returns index of the sticky row previous to the first visible row. - (NSInteger)_previousStickyRow; // Returns index of the sticky row after the first visible row. - (NSInteger)_nextStickyRow; - (void)_updateStickyRowHeaderImageWithRow:(NSInteger)row; // Returns the view used for the sticky row header - (id)_stickyRowHeaderView; @end @implementation NSTableView (NoodleExtensions) #pragma mark Sticky Row Header methods - (BOOL)isRowSticky:(NSInteger)rowIndex { id delegate; delegate = [self delegate]; if ([delegate respondsToSelector:@selector(tableView:isStickyRow:)]) { return [delegate tableView:self isStickyRow:rowIndex]; } else if ([delegate respondsToSelector:@selector(tableView:isGroupRow:)]) { return [delegate tableView:self isGroupRow:rowIndex]; } return NO; } - (void)drawStickyRowHeader { id stickyView; NSInteger row; stickyView = [self _stickyRowHeaderView]; row = [self _previousStickyRow]; if (row != -1) { [stickyView setFrame:[self stickyRowHeaderRect]]; [self _updateStickyRowHeaderImageWithRow:row]; } else { [stickyView setFrame:NSZeroRect]; } } - (IBAction)scrollToStickyRow:(id)sender { NSInteger row; row = [self _previousStickyRow]; if (row != -1) { [self scrollRowToVisible:row]; } } - (id)_stickyRowHeaderView { NSButton *view; view = [self viewWithTag:NOODLE_STICKY_ROW_VIEW_TAG]; if (view == nil) { view = [[NSButton alloc] initWithFrame:NSZeroRect]; [view setEnabled:YES]; [view setBordered:NO]; [view setImagePosition:NSImageOnly]; [view setTitle:nil]; [[view cell] setHighlightsBy:NSNoCellMask]; [[view cell] setShowsStateBy:NSNoCellMask]; [[view cell] setImageScaling:NSImageScaleNone]; [[view cell] setImageDimsWhenDisabled:NO]; [view setTag:NOODLE_STICKY_ROW_VIEW_TAG]; [view setTarget:self]; [view setAction:@selector(scrollToStickyRow:)]; [self addSubview:view]; [view release]; } return view; } - (void)drawStickyRow:(NSInteger)row clipRect:(NSRect)clipRect { NSRect rowRect, cellRect; NSCell *cell; NSInteger colIndex, count; id delegate; delegate = [self delegate]; if (![delegate respondsToSelector:@selector(tableView:shouldDisplayCellInStickyRowHeaderForTableColumn:row:)]) { delegate = nil; } rowRect = [self rectOfRow:row]; [[[self backgroundColor] highlightWithLevel:0.5] set]; NSRectFill(rowRect); // PENDING: -drawRow:clipRect: is too smart for its own good. If the row is not visible, // this method won't draw anything. Useless for row caching. // [self drawRow:row clipRect:rowRect]; count = [self numberOfColumns]; for (colIndex = 0; colIndex < count; colIndex++) { if ((delegate == nil) || [delegate tableView:self shouldDisplayCellInStickyRowHeaderForTableColumn:[[self tableColumns] objectAtIndex:colIndex] row:row]) { cell = [self preparedCellAtColumn:colIndex row:row]; cellRect = [self frameOfCellAtColumn:colIndex row:row]; [cell drawWithFrame:cellRect inView:self]; } } [[self gridColor] set]; [NSBezierPath strokeLineFromPoint:NSMakePoint(NSMinX(rowRect), NSMaxY(rowRect)) toPoint:NSMakePoint(NSMaxX(rowRect), NSMaxY(rowRect))]; } - (NoodleStickyRowTransition)stickyRowHeaderTransition { return NoodleStickyRowTransitionFadeIn; } - (void)_updateStickyRowHeaderImageWithRow:(NSInteger)row { NSImage *image; NSRect rowRect, visibleRect, imageRect; CGFloat offset, alpha; NSAffineTransform *transform; id stickyView; NoodleStickyRowTransition transition; BOOL isSelected; rowRect = [self rectOfRow:row]; imageRect = NSMakeRect(0.0, 0.0, NSWidth(rowRect), NSHeight(rowRect)); stickyView = [self _stickyRowHeaderView]; isSelected = [self isRowSelected:row]; if (isSelected) { [self deselectRow:row]; } // Optimization: instead of creating a new image each time (and since we can't // add ivars in a category), just use the image in the sticky view. We're going // to put it there in the end anyways, why not reuse it? image = [stickyView image]; if ((image == nil) || !NSEqualSizes(rowRect.size, [image size])) { image = [[NSImage alloc] initWithSize:rowRect.size]; [image setFlipped:[self isFlipped]]; [stickyView setImage:image]; [image release]; } visibleRect = [self visibleRect]; // Calculate a distance between the row header and the actual sticky row and normalize it // over the row height (plus some extra). We use this to do the fade in effect as you // scroll away from the sticky row. offset = (NSMinY(visibleRect) - NSMinY(rowRect)) / (NSHeight(rowRect) * 1.25); // When the button is disabled, it passes through to the view underneath. So, until the // original header view is mostly out of view, allow mouse events to pass through. After // that, the header is clickable. if (offset < 0.5) { [stickyView setEnabled:NO]; } else { [stickyView setEnabled:YES]; } // Row is drawn in tableview coord space. transform = [NSAffineTransform transform]; [transform translateXBy:-NSMinX(rowRect) yBy:-NSMinY(rowRect)]; transition = [self stickyRowHeaderTransition]; if (transition == NoodleStickyRowTransitionFadeIn) { // Since we want to adjust the transparency based on position, we draw the row into an // image which we then draw with alpha into the final image. NSImage *rowImage; // Optimization: Since this is a category and we can't add any ivars, we instead use // the unused alt image of the sticky view (which is a button) as a cache so we don't // have to keep creating images. Yes, a little hackish. rowImage = [stickyView alternateImage]; if ((rowImage == nil) || !NSEqualSizes(rowRect.size, [rowImage size])) { rowImage = [[NSImage alloc] initWithSize:rowRect.size]; [rowImage setFlipped:[self isFlipped]]; [stickyView setAlternateImage:rowImage]; [rowImage release]; } // Draw the original image [rowImage lockFocus]; NoodleClearRect(imageRect); [transform concat]; [self drawStickyRow:row clipRect:rowRect]; [rowImage unlockFocus]; alpha = MIN(offset, 0.9); // Draw it with transparency in the final image [image lockFocus]; NoodleClearRect(imageRect); [rowImage drawAdjustedAtPoint:NSZeroPoint fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:alpha]; [image unlockFocus]; } else if (transition == NoodleStickyRowTransitionNone) { [image lockFocus]; NoodleClearRect(imageRect); [transform concat]; [self drawStickyRow:row clipRect:rowRect]; [image unlockFocus]; } else { [image lockFocus]; NoodleClearRect(imageRect); [@"You returned a bad NoodleStickyRowTransition value. Tsk. Tsk." drawInRect:imageRect withAttributes:nil]; [image unlockFocus]; } if (isSelected) { [self selectRowIndexes:[NSIndexSet indexSetWithIndex:row] byExtendingSelection:YES]; } } - (NSInteger)_previousStickyRow { NSRect visibleRect; NSInteger row; visibleRect = [self visibleRect]; row = [self rowAtPoint:visibleRect.origin]; while (row >= 0) { if ([self isRowSticky:row]) { return row; } row--; } return -1; } - (NSInteger)_nextStickyRow { NSRect visibleRect; NSInteger row; NSInteger numberOfRows; visibleRect = [self visibleRect]; row = [self rowAtPoint:visibleRect.origin]; if (row != -1) { numberOfRows = [self numberOfRows]; while (++row < numberOfRows) { if ([self isRowSticky:row]) { return row; } } } return -1; } - (NSRect)stickyRowHeaderRect { NSInteger row; row = [self _previousStickyRow]; if (row != -1) { NSInteger nextGroupRow; NSRect visibleRect, rowRect; rowRect = [self rectOfRow:row]; visibleRect = [self visibleRect]; // Move it to the top of the visible area rowRect.origin.y = NSMinY(visibleRect); nextGroupRow = [self _nextStickyRow]; if (nextGroupRow != -1) { NSRect nextRect; // "Push" the row up if it's butting up against the next sticky row nextRect = [self rectOfRow:nextGroupRow]; if (NSMinY(nextRect) < NSMaxY(rowRect)) { rowRect.origin.y = NSMinY(nextRect) - NSHeight(rowRect); } } return rowRect; } return NSZeroRect; } #pragma mark Row Spanning methods - (NSRange)rangeOfRowSpanAtColumn:(NSInteger)columnIndex row:(NSInteger)rowIndex { id dataSource, objectValue, originalObjectValue; NSInteger i, start, end, count; NSTableColumn *column; dataSource = [self dataSource]; column = [[self tableColumns] objectAtIndex:columnIndex]; if ([column isRowSpanningEnabled]) { originalObjectValue = [dataSource tableView:self objectValueForTableColumn:column row:rowIndex]; // Figure out the span of this cell. We determine this by going up and down finding contiguous rows with // the same object value. i = rowIndex; while (i-- > 0) { objectValue = [dataSource tableView:self objectValueForTableColumn:column row:i]; if (![objectValue isEqual:originalObjectValue]) { break; } } start = i + 1; count = [self numberOfRows]; i = rowIndex + 1; while (i < count) { objectValue = [dataSource tableView:self objectValueForTableColumn:column row:i]; if (![objectValue isEqual:originalObjectValue]) { break; } i++; } end = i - 1; return NSMakeRange(start, end - start + 1); } return NSMakeRange(rowIndex, 1); } @end @implementation NSTableColumn (NoodleExtensions) #pragma mark Row Spanning methods - (BOOL)isRowSpanningEnabled { return NO; } - (NoodleRowSpanningCell *)spanningCell { return nil; } @end @implementation NSOutlineView (NoodleExtensions) #pragma mark Sticky Row Header methods - (BOOL)isRowSticky:(NSInteger)rowIndex { id delegate; delegate = [self delegate]; if ([delegate respondsToSelector:@selector(outlineView:isStickyItem:)]) { return [delegate outlineView:self isStickyItem:[self itemAtRow:rowIndex]]; } else if ([delegate respondsToSelector:@selector(outlineView:isGroupItem:)]) { return [delegate outlineView:self isGroupItem:[self itemAtRow:rowIndex]]; } return NO; } @end ================================================ FILE: NSTimer-NoodleExtensions.h ================================================ // // NSTimer-NoodleExtensions.h // NoodleKit // // Created by Paul Kim on 6/29/10. // Copyright 2010 Noodlesoft, LLC. All rights reserved. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. #import #if defined(NS_BLOCKS_AVAILABLE) && (NS_BLOCKS_AVAILABLE == 1) typedef void (^NoodleTimerBlock)(NSTimer *timer); @interface NSTimer (NoodleExtensions) /* Creates and schedules a timer which will *not* adjust its fire date when the machine is put to sleep or if the clock is changed. It will fire on the given date to the best of its abilities. If the time has somehow passed (the fire date occurred when the machine was asleep or the clock was suddenly set to a time past the fire time), the timer will fire immediately upon wake/clock change. Note that calling -setFireTime: may not work properly on this timer. A new timer should be created if you wish to have it fire at a different time after initial creation. For more details, check out the related blog post at http://www.noodlesoft.com/blog/2010/07/01/playing-with-nstimer/ */ + (NSTimer *)scheduledTimerWithAbsoluteFireDate:(NSDate *)fireDate target:(id)target selector:(SEL)aSelector userInfo:(id)userInfo; + (NSTimer *)scheduledTimerWithAbsoluteFireDate:(NSDate *)fireDate block:(NoodleTimerBlock)block; + (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)seconds repeats:(BOOL)repeats block:(NoodleTimerBlock)block; + (NSTimer *)timerWithTimeInterval:(NSTimeInterval)seconds repeats:(BOOL)repeats block:(NoodleTimerBlock)block; - (id)initWithAbsoluteFireDate:(NSDate *)date target:(id)target selector:(SEL)aSelector userInfo:(id)userInfo; - (id)initWithAbsoluteFireDate:(NSDate *)date block:(NoodleTimerBlock)block; - (id)initWithFireDate:(NSDate *)date interval:(NSTimeInterval)seconds repeats:(BOOL)repeats block:(NoodleTimerBlock)block; @end #endif ================================================ FILE: NSTimer-NoodleExtensions.m ================================================ // // NSTimer-NoodleExtensions.m // NoodleKit // // Created by Paul Kim on 6/29/10. // Copyright 2010 Noodlesoft, LLC. All rights reserved. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. #import "NSTimer-NoodleExtensions.h" #import #import "NoodleGlue.h" #if defined(NS_BLOCKS_AVAILABLE) && (NS_BLOCKS_AVAILABLE == 1) static char originalDateKey; static char observerKey; @implementation NSTimer (NoodleExtensions) + (NSTimer *)scheduledTimerWithAbsoluteFireDate:(NSDate *)fireDate target:(id)target selector:(SEL)aSelector userInfo:(id)userInfo { __block NSTimer *timer; timer = [[[NSTimer alloc] initWithAbsoluteFireDate:fireDate target:target selector:aSelector userInfo:userInfo] autorelease]; if (timer != nil) { [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode]; } return timer; } + (NSTimer *)scheduledTimerWithAbsoluteFireDate:(NSDate *)fireDate block:(NoodleTimerBlock)block { NoodleGlue *glue; glue = [NoodleGlue glueWithBlock: ^(NoodleGlue *blockGlue, id object) { block(object); }]; return [self scheduledTimerWithAbsoluteFireDate:fireDate target:glue selector:@selector(invoke:) userInfo:nil]; } + (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)seconds repeats:(BOOL)repeats block:(NoodleTimerBlock)block { NoodleGlue *glue; glue = [NoodleGlue glueWithBlock: ^(NoodleGlue *blockGlue, id object) { block(object); }]; return [self scheduledTimerWithTimeInterval:seconds target:glue selector:@selector(invoke:) userInfo:nil repeats:repeats]; } + (NSTimer *)timerWithTimeInterval:(NSTimeInterval)seconds repeats:(BOOL)repeats block:(NoodleTimerBlock)block { NoodleGlue *glue; glue = [NoodleGlue glueWithBlock: ^(NoodleGlue *blockGlue, id object) { block(object); }]; return [self timerWithTimeInterval:seconds target:glue selector:@selector(invoke:) userInfo:nil repeats:repeats]; } - (id)initWithAbsoluteFireDate:(NSDate *)date target:(id)target selector:(SEL)aSelector userInfo:(id)userInfo { self = [self initWithFireDate:date interval:0 target:target selector:aSelector userInfo:userInfo repeats:NO]; if (self != nil) { __block NSTimer *blockSelf; id observer; blockSelf = self; objc_setAssociatedObject(self, &originalDateKey, date, OBJC_ASSOCIATION_RETAIN); // We create a special observer object instead of using self. Since we are doing a category here, we can't // override -invalidate or -dealloc and do proper unregistering from notifications. Instead, we create an // intermediary observer that handles the notifications and unregisters itself when it is dealloced. We set // this observer as an associated object which is the only place where it is retained. // Note that the timer variable used is declared __block so that it is not retained by the block which would // result in a retain cycle. observer = [NoodleGlue glueWithBlock: ^(NoodleGlue *glue, id object) { [blockSelf setFireDate:(NSDate *)objc_getAssociatedObject(blockSelf, &originalDateKey)]; } cleanupBlock: ^(NoodleGlue *glue) { [[NSNotificationCenter defaultCenter] removeObserver:glue]; [[[NSWorkspace sharedWorkspace] notificationCenter] removeObserver:glue]; }]; objc_setAssociatedObject(self, &observerKey, observer, OBJC_ASSOCIATION_RETAIN); [[NSNotificationCenter defaultCenter] addObserver:observer selector:@selector(invoke:) name:NSSystemTimeZoneDidChangeNotification object:nil]; [[[NSWorkspace sharedWorkspace] notificationCenter] addObserver:observer selector:@selector(invoke:) name:NSWorkspaceDidWakeNotification object:nil]; } return self; } - (id)initWithAbsoluteFireDate:(NSDate *)date block:(NoodleTimerBlock)block { NoodleGlue *glue; glue = [NoodleGlue glueWithBlock: ^(NoodleGlue *blockGlue, id object) { block(object); }]; return [self initWithAbsoluteFireDate:date target:glue selector:@selector(invoke:) userInfo:nil]; } - (id)initWithFireDate:(NSDate *)date interval:(NSTimeInterval)seconds repeats:(BOOL)repeats block:(NoodleTimerBlock)block { NoodleGlue *glue; glue = [NoodleGlue glueWithBlock: ^(NoodleGlue *blockGlue, id object) { block(object); }]; return [self initWithFireDate:date interval:seconds target:glue selector:@selector(invoke:) userInfo:nil repeats:repeats]; } @end #endif ================================================ FILE: NSWindow-NoodleEffects.h ================================================ // // NSWindow-Zoom.h // NoodleKit // // Created by Paul Kim on 6/18/07. // Copyright 2007-2009 Noodlesoft, LLC. All rights reserved. // // Permission is hereby granted, free of charge, to any person // obtaining a copy of this software and associated documentation // files (the "Software"), to deal in the Software without // restriction, including without limitation the rights to use, // copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the // Software is furnished to do so, subject to the following // conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. // #import /* Provides a "zoom" animation for windows when ordering on and off screen. For more details, check out the related blog posts at http://www.noodlesoft.com/blog/2007/06/30/animation-in-the-time-of-tiger-part-1/ and http://www.noodlesoft.com/blog/2007/09/20/animation-in-the-time-of-tiger-part-3/ */ @interface NSWindow (NoodleEffects) - (void)animateToFrame:(NSRect)frameRect duration:(NSTimeInterval)duration; - (void)zoomOnFromRect:(NSRect)startRect; - (void)zoomOffToRect:(NSRect)endRect; @end ================================================ FILE: NSWindow-NoodleEffects.m ================================================ // // NSWindow-Zoom.m // NoodleKit // // Created by Paul Kim on 6/18/07. // Copyright 2007-2009 Noodlesoft, LLC. All rights reserved. // // Permission is hereby granted, free of charge, to any person // obtaining a copy of this software and associated documentation // files (the "Software"), to deal in the Software without // restriction, including without limitation the rights to use, // copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the // Software is furnished to do so, subject to the following // conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. // #import "NSWindow-NoodleEffects.h" #import @implementation NSWindow (NoodleEffects) - (void)animateToFrame:(NSRect)frameRect duration:(NSTimeInterval)duration { NSViewAnimation *animation; animation = [[NSViewAnimation alloc] initWithViewAnimations: [NSArray arrayWithObject:[NSDictionary dictionaryWithObjectsAndKeys: self, NSViewAnimationTargetKey, [NSValue valueWithRect:frameRect], NSViewAnimationEndFrameKey, nil]]]; [animation setDuration:duration]; [animation setAnimationBlockingMode:NSAnimationBlocking]; [animation setAnimationCurve:NSAnimationLinear]; [animation startAnimation]; [animation release]; } - (NSWindow *)_createZoomWindowWithRect:(NSRect)rect { NSWindow *zoomWindow; NSImageView *imageView; NSImage *image; NSRect frame; BOOL isOneShot; frame = [self frame]; isOneShot = [self isOneShot]; if (isOneShot) { [self setOneShot:NO]; } if ([self windowNumber] <= 0) { CGFloat alpha; // Force creation of window device by putting it on-screen. We make it transparent to minimize the chance of // visible flicker. alpha = [self alphaValue]; [self setAlphaValue:0.0]; [self orderBack:self]; [self orderOut:self]; [self setAlphaValue:alpha]; } image = [[NSImage alloc] initWithSize:frame.size]; [image lockFocus]; // Grab the window's pixels NSCopyBits([self gState], NSMakeRect(0.0, 0.0, frame.size.width, frame.size.height), NSZeroPoint); [image unlockFocus]; [image setDataRetained:YES]; [image setCacheMode:NSImageCacheNever]; zoomWindow = [[NSWindow alloc] initWithContentRect:rect styleMask:NSBorderlessWindowMask backing:NSBackingStoreBuffered defer:NO]; [zoomWindow setBackgroundColor:[NSColor colorWithDeviceWhite:0.0 alpha:0.0]]; [zoomWindow setHasShadow:[self hasShadow]]; [zoomWindow setLevel:[self level]]; [zoomWindow setOpaque:NO]; [zoomWindow setReleasedWhenClosed:YES]; [zoomWindow useOptimizedDrawing:YES]; imageView = [[NSImageView alloc] initWithFrame:[zoomWindow contentRectForFrameRect:frame]]; [imageView setImage:image]; [imageView setImageFrameStyle:NSImageFrameNone]; [imageView setImageScaling:NSScaleToFit]; [imageView setAutoresizingMask:NSViewWidthSizable|NSViewHeightSizable]; [zoomWindow setContentView:imageView]; [image release]; [imageView release]; // Reset one shot flag [self setOneShot:isOneShot]; return zoomWindow; } - (void)zoomOnFromRect:(NSRect)startRect { NSRect frame; NSWindow *zoomWindow; if ([self isVisible]) { return; } frame = [self frame]; zoomWindow = [self _createZoomWindowWithRect:startRect]; [zoomWindow orderFront:self]; [zoomWindow animateToFrame:frame duration:[zoomWindow animationResizeTime:frame] * 0.4]; [self makeKeyAndOrderFront:self]; [zoomWindow close]; } - (void)zoomOffToRect:(NSRect)endRect { NSRect frame; NSWindow *zoomWindow; frame = [self frame]; if (![self isVisible]) { return; } zoomWindow = [self _createZoomWindowWithRect:frame]; [zoomWindow orderFront:self]; [self orderOut:self]; [zoomWindow animateToFrame:endRect duration:[zoomWindow animationResizeTime:endRect] * 0.4]; [zoomWindow close]; } @end ================================================ FILE: NoodleCustomImageRep.h ================================================ // // NoodleCustomImageRep.h // NoodleKit // // Created by Paul Kim on 3/16/11. // Copyright 2011 Noodlesoft, LLC. All rights reserved. // // Permission is hereby granted, free of charge, to any person // obtaining a copy of this software and associated documentation // files (the "Software"), to deal in the Software without // restriction, including without limitation the rights to use, // copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the // Software is furnished to do so, subject to the following // conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #import @class NoodleCustomImageRep; /* This image rep just provides a way to specify the image drawing via a block. For more details, check out the related blog post at http://www.noodlesoft.com/blog/2011/04/15/the-proper-care-and-feeding-of-nsimage */ @interface NoodleCustomImageRep : NSImageRep { void (^_drawBlock)(NoodleCustomImageRep *); } @property (readwrite, copy) void (^drawBlock)(NoodleCustomImageRep *rep); + (id)imageRepWithDrawBlock:(void (^)(NoodleCustomImageRep *))block; - (id)initWithDrawBlock:(void (^)(NoodleCustomImageRep *))block; @end ================================================ FILE: NoodleCustomImageRep.m ================================================ // // NoodleCustomImageRep.m // ImageCacheTest // // Created by Paul Kim on 3/16/11. // Copyright 2011 Noodlesoft, LLC. All rights reserved. // #import "NoodleCustomImageRep.h" @implementation NoodleCustomImageRep @synthesize drawBlock = _drawBlock; + (id)imageRepWithDrawBlock:(void (^)(NoodleCustomImageRep *))block { return [[[[self class] alloc] initWithDrawBlock:block] autorelease]; } - (id)initWithDrawBlock:(void (^)(NoodleCustomImageRep *))block { if ((self = [super init]) != nil) { [self setDrawBlock:block]; } return self; } #pragma mark NSCopying method - (id)copyWithZone:(NSZone *)zone { NoodleCustomImageRep *copy; copy = [super copyWithZone:zone]; // NSImageRep uses NSCopyObject so we have to force a copy here copy->_drawBlock = [_drawBlock copy]; return copy; } - (void)dealloc { [self setDrawBlock:nil]; [super dealloc]; } #pragma mark NSImageRep methods - (BOOL)draw { if (_drawBlock != NULL) { _drawBlock(self); return YES; } return NO; } @end ================================================ FILE: NoodleGlue.h ================================================ // // NoodleBlockAction.h // NoodleKit // // Created by Paul Kim on 6/30/10. // Copyright 2010 Noodlesoft, LLC. All rights reserved. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. #import #if defined(NS_BLOCKS_AVAILABLE) && (NS_BLOCKS_AVAILABLE == 1) @class NoodleGlue; typedef void (^NoodleGlueBlock)(NoodleGlue *glue, id object); typedef void (^NoodleGlueCleanupBlock)(NoodleGlue *glue); /* In those cases where you need to pass some target object that will get some method called on it, instead of defining a new method or class to handle it, just use a block and stuff it into one of these objects and pass this object along instead. Common cases are for notifications (though blocks can be used there directly, you can provide a cleanup block here such that the object automatically unregisters itself from notifications when it is dealloc'ed/finalized). Can also be used with timers or other places that take a target/action. Things to be aware of: - Most of the time, you probably don't want this object retaining any objects it references (think about how much of the glue code you write operates). Use "__block" on any objects you don't want to be retained. - You still need to memory manage this object yourself. There's no magic about it. If you set it as a notification observer, you need to retain it somewhere because the notification center won't (or if using GC, keep a strong reference somewhere). For more details, check out the related blog post at http://www.noodlesoft.com/blog/2010/07/01/playing-with-nstimer/ */ @interface NoodleGlue : NSObject { NoodleGlueBlock _glueBlock; NoodleGlueCleanupBlock _cleanupBlock; } @property (readwrite, copy) NoodleGlueBlock glueBlock; @property (readwrite, copy) NoodleGlueCleanupBlock cleanupBlock; + (NoodleGlue *)glueWithBlock:(NoodleGlueBlock)glueBlock; + (NoodleGlue *)glueWithBlock:(NoodleGlueBlock)glueBlock cleanupBlock:(NoodleGlueCleanupBlock)cleanupBlock; // Initializes a glue object. glueBlock will be invoked when this object's -invoke: method is called with the argument // to -invoke: passed on as a parameter. cleanupBlock is invoked when this object is dealloc'ed/finalized with the // glue object being dealloc'ed sent in as a parameter. - (id)initWithBlock:(NoodleGlueBlock)glueBlock cleanupBlock:(NoodleGlueCleanupBlock)cleanupBlock; // Invokes the main block. When using this in a target/selector situation, use this as the selector. - (void)invoke:(id)object; @end /* NSObject category which, through the use of NoodleGlue and associative references, allows you to assign a block to be invoked when the object is deallocated. This code is more proof of concept than anything you'd want to use in production. For one, it's not threadsafe. For more details, check out the related blog post at http://www.noodlesoft.com/blog/2010/07/05/fun-with-glue/ */ @interface NSObject (NoodleCleanupGlue) // Sets a block to be invoked when the object is deallocated/collected. Will return an identifier that you can // use to remove the block later. Note that you need to retain this identifier if you intend to use it later. // Also, treat the identifier as an opaque object. Its actual type/formatting/structure may change in future // versions. - (id)addCleanupBlock:(void (^)(id object))block; // Removes the cleanup block using the identifier returned from a previous call to -addCleanupBlock: - (void)removeCleanupBlock:(id)identifier; @end #endif ================================================ FILE: NoodleGlue.m ================================================ // // NoodleBlockAction.m // NoodleKit // // Created by Paul Kim on 6/30/10. // Copyright 2010 Noodlesoft, LLC. All rights reserved. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. #import "NoodleGlue.h" #import #if defined(NS_BLOCKS_AVAILABLE) && (NS_BLOCKS_AVAILABLE == 1) @implementation NoodleGlue @synthesize glueBlock = _glueBlock; @synthesize cleanupBlock = _cleanupBlock; + (NoodleGlue *)glueWithBlock:(NoodleGlueBlock)glueBlock { return [self glueWithBlock:glueBlock cleanupBlock:nil]; } + (NoodleGlue *)glueWithBlock:(NoodleGlueBlock)glueBlock cleanupBlock:(NoodleGlueCleanupBlock)cleanupBlock { return [[[NoodleGlue alloc] initWithBlock:glueBlock cleanupBlock:cleanupBlock] autorelease]; } - (id)initWithBlock:(NoodleGlueBlock)glueBlock cleanupBlock:(NoodleGlueCleanupBlock)cleanupBlock { if ((self = [super init]) != nil) { _glueBlock = [glueBlock copy]; _cleanupBlock = [cleanupBlock copy]; } return self; } - (void)dealloc { if (_cleanupBlock != NULL) { _cleanupBlock(self); } [_glueBlock release]; [_cleanupBlock release]; [super dealloc]; } - (void)finalize { if (_cleanupBlock != NULL) { _cleanupBlock(self); } [super finalize]; } - (void)invoke:(id)object { _glueBlock(self, object); } @end @implementation NSObject (NoodleCleanupGlue) static char cleanupGlueKey; - (id)addCleanupBlock:(void (^)(id object))block { NSMutableDictionary *glueTable; NoodleGlue *glue; __block __weak id blockSelf; id key; blockSelf = self; glue = [[NoodleGlue alloc] initWithBlock:nil cleanupBlock: ^(NoodleGlue *glue) { block(blockSelf); }]; glueTable = objc_getAssociatedObject(self, &cleanupGlueKey); if (glueTable == nil) { glueTable = [NSMutableDictionary dictionary]; objc_setAssociatedObject(self, &cleanupGlueKey, glueTable, OBJC_ASSOCIATION_RETAIN); } key = [NSString stringWithFormat:@"%p", glue]; [glueTable setObject:glue forKey:key]; [glue release]; return key; } - (void)removeCleanupBlock:(id)identifier { NSMutableDictionary *glueTable; glueTable = objc_getAssociatedObject(self, &cleanupGlueKey); if (glueTable != nil) { NoodleGlue *glue; glue = [glueTable objectForKey:identifier]; // Clear the cleanup block since we don't want it to be invoked when it gets released when it's removed // from the table [glue setCleanupBlock:nil]; [glueTable removeObjectForKey:identifier]; if ([glueTable count] == 0) { objc_setAssociatedObject(self, &cleanupGlueKey, nil, OBJC_ASSOCIATION_RETAIN); } } } @end #endif ================================================ FILE: NoodleIPhoneTableView.h ================================================ // // NoodleIPhoneTableView.h // NoodleKit // // Created by Paul Kim on 9/22/09. // Copyright 2009 Noodlesoft, LLC. All rights reserved. // // Permission is hereby granted, free of charge, to any person // obtaining a copy of this software and associated documentation // files (the "Software"), to deal in the Software without // restriction, including without limitation the rights to use, // copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the // Software is furnished to do so, subject to the following // conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #import /* Simulates UITableView's look and feel. For more details, see the related blog post at http://www.noodlesoft.com/blog/2009/09/25/sticky-section-headers-in-nstableview/ */ @interface NoodleIPhoneTableView : NSTableView { BOOL _isDrawingStickyRow; } @end ================================================ FILE: NoodleIPhoneTableView.m ================================================ // // NoodleIPhoneTableView.m // NoodleKit // // Created by Paul Kim on 9/22/09. // Copyright 2009 Noodlesoft, LLC. All rights reserved. // // Permission is hereby granted, free of charge, to any person // obtaining a copy of this software and associated documentation // files (the "Software"), to deal in the Software without // restriction, including without limitation the rights to use, // copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the // Software is furnished to do so, subject to the following // conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #import "NoodleIPhoneTableView.h" #import "NSTableView-NoodleExtensions.h" @implementation NoodleIPhoneTableView - (id)initWithFrame:(NSRect)frameRect { if ((self = [super initWithFrame:frameRect]) != nil) { [self setGridColor:[NSColor colorWithCalibratedWhite:0.849 alpha:1.0]]; [self setGridStyleMask:NSTableViewSolidHorizontalGridLineMask]; } return self; } - (id)initWithCoder:(NSCoder *)decoder { if ((self = [super initWithCoder:decoder]) != nil) { [self setGridColor:[NSColor colorWithCalibratedWhite:0.849 alpha:1.0]]; [self setGridStyleMask:NSTableViewSolidHorizontalGridLineMask]; } return self; } - (void)drawRect:(NSRect)rect { [super drawRect:rect]; [self drawStickyRowHeader]; } // Since we are going to ensure that the regular and sticky versions of a row // look the same, no transition is needed here. - (NoodleStickyRowTransition)stickyRowHeaderTransition { return NoodleStickyRowTransitionNone; } - (void)drawRow:(NSInteger)rowIndex clipRect:(NSRect)clipRect { if ([self isRowSticky:rowIndex]) { NSRect rowRect, cellRect; NSUInteger colIndex, count; NSCell *cell; NSGradient *gradient; NSAttributedString *attrString; NSShadow *textShadow; NSBezierPath *path; NSDictionary *attributes; rowRect = [self rectOfRow:rowIndex]; if (!_isDrawingStickyRow) { // Note that NSTableView will still draw the special background that it does // for group row so we re-draw the background over it. [self drawBackgroundInClipRect:rowRect]; if (NSIntersectsRect(rowRect, [self stickyRowHeaderRect])) { // You can barely notice it but if the sticky view is showing, the actual // row it represents is still seen underneath. We check for this and don't // draw the row in such a case. return; } } gradient = [[NSGradient alloc] initWithStartingColor: [NSColor colorWithCalibratedRed:0.490 green:0.556 blue:0.600 alpha:0.9] endingColor:[NSColor colorWithCalibratedRed:0.665 green:0.706 blue:0.738 alpha:0.9]]; [gradient drawInRect:rowRect angle:90]; [gradient release]; textShadow = [[NSShadow alloc] init]; [textShadow setShadowOffset:NSMakeSize(1.0, -1.0)]; [textShadow setShadowColor:[NSColor colorWithCalibratedWhite:0.5 alpha:1.0]]; [textShadow setShadowBlurRadius:0.0]; attributes = [NSDictionary dictionaryWithObjectsAndKeys: [NSFont fontWithName:@"Helvetica-Bold" size:16.0], NSFontAttributeName, textShadow, NSShadowAttributeName, [NSColor whiteColor], NSForegroundColorAttributeName, nil]; [textShadow release]; count = [self numberOfColumns]; for (colIndex = 0; colIndex < count; colIndex++) { cell = [self preparedCellAtColumn:colIndex row:rowIndex]; attrString = [[NSAttributedString alloc] initWithString:[cell stringValue] attributes:attributes]; cellRect = [self frameOfCellAtColumn:colIndex row:rowIndex]; [cell setAttributedStringValue:attrString]; [cell drawWithFrame:cellRect inView:self]; [attrString release]; } [[NSColor colorWithCalibratedWhite:0.5 alpha:1.0] set]; path = [NSBezierPath bezierPath]; [path moveToPoint:NSMakePoint(NSMinX(rowRect), NSMinY(rowRect))]; [path lineToPoint:NSMakePoint(NSMaxX(rowRect), NSMinY(rowRect))]; [path moveToPoint:NSMakePoint(NSMinX(rowRect), NSMaxY(rowRect))]; [path lineToPoint:NSMakePoint(NSMaxX(rowRect), NSMaxY(rowRect))]; [path stroke]; } else { [super drawRow:rowIndex clipRect:clipRect]; } } - (void)drawStickyRow:(NSInteger)row clipRect:(NSRect)clipRect { _isDrawingStickyRow = YES; [self drawRow:row clipRect:clipRect]; _isDrawingStickyRow = NO; } @end ================================================ FILE: NoodleKit.xcodeproj/project.pbxproj ================================================ // !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 46; objects = { /* Begin PBXBuildFile section */ 322DEBAE1072594300CB7080 /* NoodleKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8DC2EF5B0486A6940098B216 /* NoodleKit.framework */; }; 322DEBAF1072594D00CB7080 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7B1FEA5585E11CA2CBB /* Cocoa.framework */; }; 322DEBB31072595B00CB7080 /* Controller.m in Sources */ = {isa = PBXBuildFile; fileRef = 322DEBB11072595B00CB7080 /* Controller.m */; }; 322DEBB41072595B00CB7080 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 322DEBB21072595B00CB7080 /* main.m */; }; 322DEBB81072598E00CB7080 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 322DEBB61072598E00CB7080 /* MainMenu.xib */; }; 322DECB310727B3C00CB7080 /* NoodleKit.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = 8DC2EF5B0486A6940098B216 /* NoodleKit.framework */; }; 322DECC610727B9300CB7080 /* NoodleKit.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = 8DC2EF5B0486A6940098B216 /* NoodleKit.framework */; }; 3251D221108F7FAE007E281D /* NSIndexSet-NoodleExtensions.h in Headers */ = {isa = PBXBuildFile; fileRef = 3251D21F108F7FAE007E281D /* NSIndexSet-NoodleExtensions.h */; settings = {ATTRIBUTES = (Public, ); }; }; 3251D222108F7FAE007E281D /* NSIndexSet-NoodleExtensions.m in Sources */ = {isa = PBXBuildFile; fileRef = 3251D220108F7FAE007E281D /* NSIndexSet-NoodleExtensions.m */; }; 3251D225108F7FB9007E281D /* NoodleTableView.h in Headers */ = {isa = PBXBuildFile; fileRef = 3251D223108F7FB9007E281D /* NoodleTableView.h */; settings = {ATTRIBUTES = (Public, ); }; }; 3251D226108F7FB9007E281D /* NoodleTableView.m in Sources */ = {isa = PBXBuildFile; fileRef = 3251D224108F7FB9007E281D /* NoodleTableView.m */; }; 3251D235108F8017007E281D /* NoodleKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8DC2EF5B0486A6940098B216 /* NoodleKit.framework */; }; 3251D241108F8119007E281D /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3251D23F108F8119007E281D /* MainMenu.xib */; }; 3251D243108F8125007E281D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 3251D242108F8125007E281D /* main.m */; }; 3251D245108F8165007E281D /* Credits.rtf in Resources */ = {isa = PBXBuildFile; fileRef = 3251D244108F8165007E281D /* Credits.rtf */; }; 3251D248108F817C007E281D /* Controller.m in Sources */ = {isa = PBXBuildFile; fileRef = 3251D247108F817B007E281D /* Controller.m */; }; 3251D48D1090FFB0007E281D /* NSTableView-NoodleExtensions.h in Headers */ = {isa = PBXBuildFile; fileRef = 3251D48B1090FFB0007E281D /* NSTableView-NoodleExtensions.h */; settings = {ATTRIBUTES = (Public, ); }; }; 3251D48E1090FFB0007E281D /* NSTableView-NoodleExtensions.m in Sources */ = {isa = PBXBuildFile; fileRef = 3251D48C1090FFB0007E281D /* NSTableView-NoodleExtensions.m */; }; 326A35051092486400AF02F8 /* NoodleIPhoneTableView.m in Sources */ = {isa = PBXBuildFile; fileRef = 32782FD910713DA00041F09C /* NoodleIPhoneTableView.m */; }; 326A35061092486800AF02F8 /* NoodleIPhoneTableView.h in Headers */ = {isa = PBXBuildFile; fileRef = 32782FD810713DA00041F09C /* NoodleIPhoneTableView.h */; settings = {ATTRIBUTES = (Public, ); }; }; 32782FB110713A4C0041F09C /* NoodleLineNumberView.h in Headers */ = {isa = PBXBuildFile; fileRef = 32782FAF10713A4C0041F09C /* NoodleLineNumberView.h */; settings = {ATTRIBUTES = (Public, ); }; }; 32782FB210713A4C0041F09C /* NoodleLineNumberView.m in Sources */ = {isa = PBXBuildFile; fileRef = 32782FB010713A4C0041F09C /* NoodleLineNumberView.m */; }; 32782FB610713B640041F09C /* NoodleLineNumberMarker.h in Headers */ = {isa = PBXBuildFile; fileRef = 32782FB410713B640041F09C /* NoodleLineNumberMarker.h */; settings = {ATTRIBUTES = (Public, ); }; }; 32782FB710713B640041F09C /* NoodleLineNumberMarker.m in Sources */ = {isa = PBXBuildFile; fileRef = 32782FB510713B640041F09C /* NoodleLineNumberMarker.m */; }; 32782FD610713C1E0041F09C /* NSResponder-NoodleModalExtensions.h in Headers */ = {isa = PBXBuildFile; fileRef = 32782FD410713C1E0041F09C /* NSResponder-NoodleModalExtensions.h */; settings = {ATTRIBUTES = (Public, ); }; }; 32782FD710713C1E0041F09C /* NSResponder-NoodleModalExtensions.m in Sources */ = {isa = PBXBuildFile; fileRef = 32782FD510713C1E0041F09C /* NSResponder-NoodleModalExtensions.m */; }; 32782FE210713DA00041F09C /* NSImage-NoodleExtensions.h in Headers */ = {isa = PBXBuildFile; fileRef = 32782FDC10713DA00041F09C /* NSImage-NoodleExtensions.h */; settings = {ATTRIBUTES = (Public, ); }; }; 32782FE310713DA00041F09C /* NSImage-NoodleExtensions.m in Sources */ = {isa = PBXBuildFile; fileRef = 32782FDD10713DA00041F09C /* NSImage-NoodleExtensions.m */; }; 32782FE610713DD60041F09C /* NSObject-NoodlePerformWhenIdle.h in Headers */ = {isa = PBXBuildFile; fileRef = 32782FE410713DD60041F09C /* NSObject-NoodlePerformWhenIdle.h */; settings = {ATTRIBUTES = (Public, ); }; }; 32782FE710713DD60041F09C /* NSObject-NoodlePerformWhenIdle.m in Sources */ = {isa = PBXBuildFile; fileRef = 32782FE510713DD60041F09C /* NSObject-NoodlePerformWhenIdle.m */; }; 3278303A107140600041F09C /* NSWindow-NoodleEffects.h in Headers */ = {isa = PBXBuildFile; fileRef = 32783038107140600041F09C /* NSWindow-NoodleEffects.h */; settings = {ATTRIBUTES = (Public, ); }; }; 3278303B107140600041F09C /* NSWindow-NoodleEffects.m in Sources */ = {isa = PBXBuildFile; fileRef = 32783039107140600041F09C /* NSWindow-NoodleEffects.m */; }; 32783093107152680041F09C /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 32783091107152680041F09C /* MainMenu.xib */; }; 32783097107152A90041F09C /* Controller.m in Sources */ = {isa = PBXBuildFile; fileRef = 32783096107152A90041F09C /* Controller.m */; }; 32783099107152E30041F09C /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 32783098107152E30041F09C /* main.m */; }; 327830AB107153500041F09C /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7B1FEA5585E11CA2CBB /* Cocoa.framework */; }; 327830F3107155D70041F09C /* NoodleKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8DC2EF5B0486A6940098B216 /* NoodleKit.framework */; }; 3278311A107156CB0041F09C /* NoodleKit.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = 8DC2EF5B0486A6940098B216 /* NoodleKit.framework */; }; 32783133107159280041F09C /* Credits.rtf in Resources */ = {isa = PBXBuildFile; fileRef = 32783132107159280041F09C /* Credits.rtf */; }; 3278315510715AC90041F09C /* NoodleKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8DC2EF5B0486A6940098B216 /* NoodleKit.framework */; }; 3278315910715AEA0041F09C /* Controller.m in Sources */ = {isa = PBXBuildFile; fileRef = 3278315810715AEA0041F09C /* Controller.m */; }; 3278315C10715AF60041F09C /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3278315A10715AF60041F09C /* MainMenu.xib */; }; 3278315E10715AFC0041F09C /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 3278315D10715AFC0041F09C /* main.m */; }; 3278316210715B210041F09C /* Credits.rtf in Resources */ = {isa = PBXBuildFile; fileRef = 3278316110715B210041F09C /* Credits.rtf */; }; 3278316410715B440041F09C /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7B1FEA5585E11CA2CBB /* Cocoa.framework */; }; 3278316810715B680041F09C /* NoodleKit.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = 8DC2EF5B0486A6940098B216 /* NoodleKit.framework */; }; 327831AE107160460041F09C /* NoodleKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8DC2EF5B0486A6940098B216 /* NoodleKit.framework */; }; 327831B0107160510041F09C /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7B1FEA5585E11CA2CBB /* Cocoa.framework */; }; 327831B7107160690041F09C /* Controller.m in Sources */ = {isa = PBXBuildFile; fileRef = 327831B4107160690041F09C /* Controller.m */; }; 327831B8107160690041F09C /* MarkerLineNumberView.m in Sources */ = {isa = PBXBuildFile; fileRef = 327831B6107160690041F09C /* MarkerLineNumberView.m */; }; 327831BB1071607D0041F09C /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 327831BA1071607D0041F09C /* main.m */; }; 327831BE1071608F0041F09C /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 327831BC1071608F0041F09C /* MainMenu.xib */; }; 327831DD107161EB0041F09C /* Credits.rtf in Resources */ = {isa = PBXBuildFile; fileRef = 327831DC107161EB0041F09C /* Credits.rtf */; }; 327CD73711DCF15200A88EA5 /* NSTimer-NoodleExtensions.h in Headers */ = {isa = PBXBuildFile; fileRef = 327CD73311DCF15200A88EA5 /* NSTimer-NoodleExtensions.h */; settings = {ATTRIBUTES = (Public, ); }; }; 327CD73811DCF15200A88EA5 /* NSTimer-NoodleExtensions.m in Sources */ = {isa = PBXBuildFile; fileRef = 327CD73411DCF15200A88EA5 /* NSTimer-NoodleExtensions.m */; }; 327CD73911DCF15200A88EA5 /* NoodleGlue.h in Headers */ = {isa = PBXBuildFile; fileRef = 327CD73511DCF15200A88EA5 /* NoodleGlue.h */; settings = {ATTRIBUTES = (Public, ); }; }; 327CD73A11DCF15200A88EA5 /* NoodleGlue.m in Sources */ = {isa = PBXBuildFile; fileRef = 327CD73611DCF15200A88EA5 /* NoodleGlue.m */; }; 327CD77B11DCF77000A88EA5 /* TimerLabAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 327CD77A11DCF77000A88EA5 /* TimerLabAppDelegate.m */; }; 327CD78211DCF7D400A88EA5 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 327CD78111DCF7D400A88EA5 /* main.m */; }; 327CD78711DCF82100A88EA5 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 327CD78511DCF82100A88EA5 /* MainMenu.xib */; }; 327CD7C711DCFA2F00A88EA5 /* NoodleKit.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = 8DC2EF5B0486A6940098B216 /* NoodleKit.framework */; }; 327CD7D711DD17F500A88EA5 /* Credits.rtf in Resources */ = {isa = PBXBuildFile; fileRef = 327CD7D611DD17F500A88EA5 /* Credits.rtf */; }; 327CD86011DD224E00A88EA5 /* NoodleKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8DC2EF5B0486A6940098B216 /* NoodleKit.framework */; }; 327CD86A11DD237000A88EA5 /* NoodleKit.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = 8DC2EF5B0486A6940098B216 /* NoodleKit.framework */; }; 8DC2EF530486A6940098B216 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C1666FE841158C02AAC07 /* InfoPlist.strings */; }; 8DC2EF570486A6940098B216 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7B1FEA5585E11CA2CBB /* Cocoa.framework */; }; B40F77FC135527AE00FCC42A /* NoodleCustomImageRep.h in Headers */ = {isa = PBXBuildFile; fileRef = B40F77FA135527AE00FCC42A /* NoodleCustomImageRep.h */; settings = {ATTRIBUTES = (Public, ); }; }; B40F77FD135527AE00FCC42A /* NoodleCustomImageRep.m in Sources */ = {isa = PBXBuildFile; fileRef = B40F77FB135527AE00FCC42A /* NoodleCustomImageRep.m */; }; B40F780F13552B0B00FCC42A /* NoodleKit.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = 8DC2EF5B0486A6940098B216 /* NoodleKit.framework */; }; B40F782A13552B7100FCC42A /* NoodleKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8DC2EF5B0486A6940098B216 /* NoodleKit.framework */; }; B40F784C13562C4D00FCC42A /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = B40F784A13562C4D00FCC42A /* MainMenu.xib */; }; B40F785113562CA500FCC42A /* test.tiff in Resources */ = {isa = PBXBuildFile; fileRef = B40F785013562CA500FCC42A /* test.tiff */; }; B40F785513562CED00FCC42A /* ImageLabAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = B40F785413562CED00FCC42A /* ImageLabAppDelegate.m */; }; B40F786113562D8C00FCC42A /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B40F786013562D8C00FCC42A /* QuartzCore.framework */; }; B40F786A13562DCF00FCC42A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = B40F786913562DCF00FCC42A /* main.m */; }; B40F788113562E5000FCC42A /* TimedImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = B40F788013562E5000FCC42A /* TimedImageView.m */; }; B40F78AA1356317F00FCC42A /* Credits.rtf in Resources */ = {isa = PBXBuildFile; fileRef = B40F78A91356317F00FCC42A /* Credits.rtf */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ 322DEBAC1072594000CB7080 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; proxyType = 1; remoteGlobalIDString = 8DC2EF4F0486A6940098B216; remoteInfo = NoodleKit; }; 3251D238108F802F007E281D /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; proxyType = 1; remoteGlobalIDString = 8DC2EF4F0486A6940098B216; remoteInfo = NoodleKit; }; 3278318710715CEB0041F09C /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; proxyType = 1; remoteGlobalIDString = 8DC2EF4F0486A6940098B216; remoteInfo = NoodleKit; }; 3278318910715CF30041F09C /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; proxyType = 1; remoteGlobalIDString = 8DC2EF4F0486A6940098B216; remoteInfo = NoodleKit; }; 327831AC107160410041F09C /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; proxyType = 1; remoteGlobalIDString = 8DC2EF4F0486A6940098B216; remoteInfo = NoodleKit; }; 327CD79111DCF8D500A88EA5 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; proxyType = 1; remoteGlobalIDString = 8DC2EF4F0486A6940098B216; remoteInfo = NoodleKit; }; B40F781413552B1B00FCC42A /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; proxyType = 1; remoteGlobalIDString = 8DC2EF4F0486A6940098B216; remoteInfo = NoodleKit; }; /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ 322DECB910727B4C00CB7080 /* Copy Frameworks */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = ""; dstSubfolderSpec = 10; files = ( 322DECB310727B3C00CB7080 /* NoodleKit.framework in Copy Frameworks */, ); name = "Copy Frameworks"; runOnlyForDeploymentPostprocessing = 0; }; 322DECC910727BA700CB7080 /* Copy Frameworks */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = ""; dstSubfolderSpec = 10; files = ( 322DECC610727B9300CB7080 /* NoodleKit.framework in Copy Frameworks */, ); name = "Copy Frameworks"; runOnlyForDeploymentPostprocessing = 0; }; 327831031071564E0041F09C /* Copy Frameworks */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = ""; dstSubfolderSpec = 10; files = ( 3278311A107156CB0041F09C /* NoodleKit.framework in Copy Frameworks */, ); name = "Copy Frameworks"; runOnlyForDeploymentPostprocessing = 0; }; 3278316610715B5F0041F09C /* Copy Frameworks */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = ""; dstSubfolderSpec = 10; files = ( 3278316810715B680041F09C /* NoodleKit.framework in Copy Frameworks */, ); name = "Copy Frameworks"; runOnlyForDeploymentPostprocessing = 0; }; 327CD81011DD1E2700A88EA5 /* Copy Frameworks */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = ""; dstSubfolderSpec = 10; files = ( 327CD7C711DCFA2F00A88EA5 /* NoodleKit.framework in Copy Frameworks */, ); name = "Copy Frameworks"; runOnlyForDeploymentPostprocessing = 0; }; 327CD87C11DD23C500A88EA5 /* Copy Frameworks */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = ""; dstSubfolderSpec = 10; files = ( 327CD86A11DD237000A88EA5 /* NoodleKit.framework in Copy Frameworks */, ); name = "Copy Frameworks"; runOnlyForDeploymentPostprocessing = 0; }; B40F784813552B8700FCC42A /* Copy Frameworks */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = ""; dstSubfolderSpec = 10; files = ( B40F780F13552B0B00FCC42A /* NoodleKit.framework in Copy Frameworks */, ); name = "Copy Frameworks"; runOnlyForDeploymentPostprocessing = 0; }; /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ 0867D69BFE84028FC02AAC07 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = ""; }; 0867D6A5FE840307C02AAC07 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = ""; }; 089C1667FE841158C02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = ""; }; 1058C7B1FEA5585E11CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = ""; }; 322DEBA61072593A00CB7080 /* Window Effects.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Window Effects.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 322DEBA81072593A00CB7080 /* Window Effects-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "Window Effects-Info.plist"; path = "Window Effects/Window Effects-Info.plist"; sourceTree = ""; }; 322DEBB01072595B00CB7080 /* Controller.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Controller.h; path = "Window Effects/Controller.h"; sourceTree = ""; }; 322DEBB11072595B00CB7080 /* Controller.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Controller.m; path = "Window Effects/Controller.m"; sourceTree = ""; }; 322DEBB21072595B00CB7080 /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = "Window Effects/main.m"; sourceTree = ""; }; 322DEBB71072598E00CB7080 /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = "Examples/Window Effects/English.lproj/MainMenu.xib"; sourceTree = ""; }; 3251D21F108F7FAE007E281D /* NSIndexSet-NoodleExtensions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSIndexSet-NoodleExtensions.h"; sourceTree = ""; }; 3251D220108F7FAE007E281D /* NSIndexSet-NoodleExtensions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSIndexSet-NoodleExtensions.m"; sourceTree = ""; }; 3251D223108F7FB9007E281D /* NoodleTableView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NoodleTableView.h; sourceTree = ""; }; 3251D224108F7FB9007E281D /* NoodleTableView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NoodleTableView.m; sourceTree = ""; }; 3251D22F108F800C007E281D /* iToonz.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = iToonz.app; sourceTree = BUILT_PRODUCTS_DIR; }; 3251D231108F800C007E281D /* iToonz-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "iToonz-Info.plist"; sourceTree = ""; }; 3251D240108F8119007E281D /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = English.lproj/MainMenu.xib; sourceTree = ""; }; 3251D242108F8125007E281D /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 3251D244108F8165007E281D /* Credits.rtf */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; path = Credits.rtf; sourceTree = ""; }; 3251D246108F817B007E281D /* Controller.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Controller.h; sourceTree = ""; }; 3251D247108F817B007E281D /* Controller.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Controller.m; sourceTree = ""; }; 3251D48B1090FFB0007E281D /* NSTableView-NoodleExtensions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSTableView-NoodleExtensions.h"; sourceTree = ""; }; 3251D48C1090FFB0007E281D /* NSTableView-NoodleExtensions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSTableView-NoodleExtensions.m"; sourceTree = ""; }; 32782FAF10713A4C0041F09C /* NoodleLineNumberView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NoodleLineNumberView.h; sourceTree = ""; }; 32782FB010713A4C0041F09C /* NoodleLineNumberView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NoodleLineNumberView.m; sourceTree = ""; }; 32782FB410713B640041F09C /* NoodleLineNumberMarker.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NoodleLineNumberMarker.h; sourceTree = ""; }; 32782FB510713B640041F09C /* NoodleLineNumberMarker.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NoodleLineNumberMarker.m; sourceTree = ""; }; 32782FD410713C1E0041F09C /* NSResponder-NoodleModalExtensions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSResponder-NoodleModalExtensions.h"; sourceTree = ""; }; 32782FD510713C1E0041F09C /* NSResponder-NoodleModalExtensions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSResponder-NoodleModalExtensions.m"; sourceTree = ""; }; 32782FD810713DA00041F09C /* NoodleIPhoneTableView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NoodleIPhoneTableView.h; sourceTree = ""; }; 32782FD910713DA00041F09C /* NoodleIPhoneTableView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NoodleIPhoneTableView.m; sourceTree = ""; }; 32782FDC10713DA00041F09C /* NSImage-NoodleExtensions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSImage-NoodleExtensions.h"; sourceTree = ""; }; 32782FDD10713DA00041F09C /* NSImage-NoodleExtensions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSImage-NoodleExtensions.m"; sourceTree = ""; }; 32782FE410713DD60041F09C /* NSObject-NoodlePerformWhenIdle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSObject-NoodlePerformWhenIdle.h"; sourceTree = ""; }; 32782FE510713DD60041F09C /* NSObject-NoodlePerformWhenIdle.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSObject-NoodlePerformWhenIdle.m"; sourceTree = ""; }; 32783038107140600041F09C /* NSWindow-NoodleEffects.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSWindow-NoodleEffects.h"; sourceTree = ""; }; 32783039107140600041F09C /* NSWindow-NoodleEffects.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSWindow-NoodleEffects.m"; sourceTree = ""; }; 32783085107151B60041F09C /* ModalResponderTest.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ModalResponderTest.app; sourceTree = BUILT_PRODUCTS_DIR; }; 32783087107151B60041F09C /* ModalResponder-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "ModalResponder-Info.plist"; sourceTree = ""; }; 32783092107152680041F09C /* MainMenu.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = MainMenu.xib; path = ModalResponder/English.lproj/MainMenu.xib; sourceTree = ""; }; 32783095107152A90041F09C /* Controller.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Controller.h; sourceTree = ""; }; 32783096107152A90041F09C /* Controller.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Controller.m; sourceTree = ""; }; 32783098107152E30041F09C /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 32783132107159280041F09C /* Credits.rtf */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; path = Credits.rtf; sourceTree = ""; }; 3278314F10715AB80041F09C /* StickyRowTableView Revue.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "StickyRowTableView Revue.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 3278315710715AEA0041F09C /* Controller.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Controller.h; sourceTree = ""; }; 3278315810715AEA0041F09C /* Controller.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Controller.m; sourceTree = ""; }; 3278315B10715AF60041F09C /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = English.lproj/MainMenu.xib; sourceTree = ""; }; 3278315D10715AFC0041F09C /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 3278315F10715B050041F09C /* StickyRowTableView Revue-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "StickyRowTableView Revue-Info.plist"; sourceTree = ""; }; 3278316110715B210041F09C /* Credits.rtf */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; path = Credits.rtf; sourceTree = ""; }; 327831A6107160380041F09C /* LineNumberView.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = LineNumberView.app; sourceTree = BUILT_PRODUCTS_DIR; }; 327831A8107160380041F09C /* LineNumberView-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "LineNumberView-Info.plist"; sourceTree = ""; }; 327831B3107160690041F09C /* Controller.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Controller.h; sourceTree = ""; }; 327831B4107160690041F09C /* Controller.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Controller.m; sourceTree = ""; }; 327831B5107160690041F09C /* MarkerLineNumberView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MarkerLineNumberView.h; sourceTree = ""; }; 327831B6107160690041F09C /* MarkerLineNumberView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MarkerLineNumberView.m; sourceTree = ""; }; 327831BA1071607D0041F09C /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 327831BD1071608F0041F09C /* MainMenu.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = MainMenu.xib; path = Examples/LineNumberView/English.lproj/MainMenu.xib; sourceTree = ""; }; 327831DC107161EB0041F09C /* Credits.rtf */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; path = Credits.rtf; sourceTree = ""; }; 327CD73311DCF15200A88EA5 /* NSTimer-NoodleExtensions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSTimer-NoodleExtensions.h"; sourceTree = ""; }; 327CD73411DCF15200A88EA5 /* NSTimer-NoodleExtensions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSTimer-NoodleExtensions.m"; sourceTree = ""; }; 327CD73511DCF15200A88EA5 /* NoodleGlue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NoodleGlue.h; sourceTree = ""; }; 327CD73611DCF15200A88EA5 /* NoodleGlue.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NoodleGlue.m; sourceTree = ""; }; 327CD76911DCF2EE00A88EA5 /* TimerLab.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = TimerLab.app; sourceTree = BUILT_PRODUCTS_DIR; }; 327CD77911DCF77000A88EA5 /* TimerLabAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TimerLabAppDelegate.h; path = TimerLab/TimerLabAppDelegate.h; sourceTree = ""; }; 327CD77A11DCF77000A88EA5 /* TimerLabAppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TimerLabAppDelegate.m; path = TimerLab/TimerLabAppDelegate.m; sourceTree = ""; }; 327CD78111DCF7D400A88EA5 /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = TimerLab/main.m; sourceTree = ""; }; 327CD78311DCF7DE00A88EA5 /* TimerLab-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = "TimerLab-Info.plist"; path = "TimerLab/TimerLab-Info.plist"; sourceTree = ""; }; 327CD78611DCF82100A88EA5 /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = TimerLab/English.lproj/MainMenu.xib; sourceTree = ""; }; 327CD7D611DD17F500A88EA5 /* Credits.rtf */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; name = Credits.rtf; path = TimerLab/Credits.rtf; sourceTree = ""; }; 32DBCF5E0370ADEE00C91783 /* NoodleKit_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NoodleKit_Prefix.pch; sourceTree = ""; }; 8DC2EF5A0486A6940098B216 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 8DC2EF5B0486A6940098B216 /* NoodleKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = NoodleKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; B40F77FA135527AE00FCC42A /* NoodleCustomImageRep.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NoodleCustomImageRep.h; sourceTree = ""; }; B40F77FB135527AE00FCC42A /* NoodleCustomImageRep.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NoodleCustomImageRep.m; sourceTree = ""; }; B40F780913552AF900FCC42A /* ImageLab.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ImageLab.app; sourceTree = BUILT_PRODUCTS_DIR; }; B40F780B13552AF900FCC42A /* ImageLab-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "ImageLab-Info.plist"; sourceTree = ""; }; B40F784B13562C4D00FCC42A /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = English.lproj/MainMenu.xib; sourceTree = ""; }; B40F785013562CA500FCC42A /* test.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; path = test.tiff; sourceTree = ""; }; B40F785313562CED00FCC42A /* ImageLabAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ImageLabAppDelegate.h; sourceTree = ""; }; B40F785413562CED00FCC42A /* ImageLabAppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ImageLabAppDelegate.m; sourceTree = ""; }; B40F786013562D8C00FCC42A /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; B40F786913562DCF00FCC42A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; B40F787F13562E5000FCC42A /* TimedImageView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TimedImageView.h; sourceTree = ""; }; B40F788013562E5000FCC42A /* TimedImageView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TimedImageView.m; sourceTree = ""; }; B40F78A91356317F00FCC42A /* Credits.rtf */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; path = Credits.rtf; sourceTree = ""; }; D2F7E79907B2D74100F64583 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = /System/Library/Frameworks/CoreData.framework; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ 322DEBA41072593A00CB7080 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 322DEBAF1072594D00CB7080 /* Cocoa.framework in Frameworks */, 322DEBAE1072594300CB7080 /* NoodleKit.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 3251D22D108F800C007E281D /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 3251D235108F8017007E281D /* NoodleKit.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 32783083107151B60041F09C /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 327830F3107155D70041F09C /* NoodleKit.framework in Frameworks */, 327830AB107153500041F09C /* Cocoa.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 3278314D10715AB80041F09C /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 3278316410715B440041F09C /* Cocoa.framework in Frameworks */, 3278315510715AC90041F09C /* NoodleKit.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 327831A4107160380041F09C /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 327831B0107160510041F09C /* Cocoa.framework in Frameworks */, 327831AE107160460041F09C /* NoodleKit.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 327CD76711DCF2EE00A88EA5 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 327CD86011DD224E00A88EA5 /* NoodleKit.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 8DC2EF560486A6940098B216 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 8DC2EF570486A6940098B216 /* Cocoa.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; B40F780713552AF900FCC42A /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( B40F782A13552B7100FCC42A /* NoodleKit.framework in Frameworks */, B40F786113562D8C00FCC42A /* QuartzCore.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 034768DFFF38A50411DB9C8B /* Products */ = { isa = PBXGroup; children = ( 8DC2EF5B0486A6940098B216 /* NoodleKit.framework */, 32783085107151B60041F09C /* ModalResponderTest.app */, 3278314F10715AB80041F09C /* StickyRowTableView Revue.app */, 327831A6107160380041F09C /* LineNumberView.app */, 322DEBA61072593A00CB7080 /* Window Effects.app */, 3251D22F108F800C007E281D /* iToonz.app */, 327CD76911DCF2EE00A88EA5 /* TimerLab.app */, B40F780913552AF900FCC42A /* ImageLab.app */, ); name = Products; sourceTree = ""; }; 0867D691FE84028FC02AAC07 /* NoodleKit */ = { isa = PBXGroup; children = ( 08FB77AEFE84172EC02AAC07 /* Classes */, 32C88DFF0371C24200C91783 /* Other Sources */, 089C1665FE841158C02AAC07 /* Resources */, 0867D69AFE84028FC02AAC07 /* External Frameworks and Libraries */, 3278307F1071513F0041F09C /* Examples */, 034768DFFF38A50411DB9C8B /* Products */, B40F786013562D8C00FCC42A /* QuartzCore.framework */, ); name = NoodleKit; sourceTree = ""; }; 0867D69AFE84028FC02AAC07 /* External Frameworks and Libraries */ = { isa = PBXGroup; children = ( 1058C7B0FEA5585E11CA2CBB /* Linked Frameworks */, 1058C7B2FEA5585E11CA2CBB /* Other Frameworks */, ); name = "External Frameworks and Libraries"; sourceTree = ""; }; 089C1665FE841158C02AAC07 /* Resources */ = { isa = PBXGroup; children = ( 8DC2EF5A0486A6940098B216 /* Info.plist */, 089C1666FE841158C02AAC07 /* InfoPlist.strings */, ); name = Resources; sourceTree = ""; }; 08FB77AEFE84172EC02AAC07 /* Classes */ = { isa = PBXGroup; children = ( 32782FE410713DD60041F09C /* NSObject-NoodlePerformWhenIdle.h */, 32782FE510713DD60041F09C /* NSObject-NoodlePerformWhenIdle.m */, 3251D21F108F7FAE007E281D /* NSIndexSet-NoodleExtensions.h */, 3251D220108F7FAE007E281D /* NSIndexSet-NoodleExtensions.m */, 32782FD410713C1E0041F09C /* NSResponder-NoodleModalExtensions.h */, 32782FD510713C1E0041F09C /* NSResponder-NoodleModalExtensions.m */, 327CD73311DCF15200A88EA5 /* NSTimer-NoodleExtensions.h */, 327CD73411DCF15200A88EA5 /* NSTimer-NoodleExtensions.m */, 327CD73511DCF15200A88EA5 /* NoodleGlue.h */, 327CD73611DCF15200A88EA5 /* NoodleGlue.m */, 32782FDC10713DA00041F09C /* NSImage-NoodleExtensions.h */, 32782FDD10713DA00041F09C /* NSImage-NoodleExtensions.m */, B40F77FA135527AE00FCC42A /* NoodleCustomImageRep.h */, B40F77FB135527AE00FCC42A /* NoodleCustomImageRep.m */, 32783038107140600041F09C /* NSWindow-NoodleEffects.h */, 32783039107140600041F09C /* NSWindow-NoodleEffects.m */, 32782FB410713B640041F09C /* NoodleLineNumberMarker.h */, 32782FB510713B640041F09C /* NoodleLineNumberMarker.m */, 32782FAF10713A4C0041F09C /* NoodleLineNumberView.h */, 32782FB010713A4C0041F09C /* NoodleLineNumberView.m */, 3251D48B1090FFB0007E281D /* NSTableView-NoodleExtensions.h */, 3251D48C1090FFB0007E281D /* NSTableView-NoodleExtensions.m */, 3251D223108F7FB9007E281D /* NoodleTableView.h */, 3251D224108F7FB9007E281D /* NoodleTableView.m */, 32782FD810713DA00041F09C /* NoodleIPhoneTableView.h */, 32782FD910713DA00041F09C /* NoodleIPhoneTableView.m */, ); name = Classes; sourceTree = ""; }; 1058C7B0FEA5585E11CA2CBB /* Linked Frameworks */ = { isa = PBXGroup; children = ( 1058C7B1FEA5585E11CA2CBB /* Cocoa.framework */, ); name = "Linked Frameworks"; sourceTree = ""; }; 1058C7B2FEA5585E11CA2CBB /* Other Frameworks */ = { isa = PBXGroup; children = ( 0867D6A5FE840307C02AAC07 /* AppKit.framework */, D2F7E79907B2D74100F64583 /* CoreData.framework */, 0867D69BFE84028FC02AAC07 /* Foundation.framework */, ); name = "Other Frameworks"; sourceTree = ""; }; 322DEB9E1072591900CB7080 /* Window Effects */ = { isa = PBXGroup; children = ( 322DEBB01072595B00CB7080 /* Controller.h */, 322DEBB11072595B00CB7080 /* Controller.m */, 322DEBB21072595B00CB7080 /* main.m */, 322DEBA81072593A00CB7080 /* Window Effects-Info.plist */, 322DEBB61072598E00CB7080 /* MainMenu.xib */, ); name = "Window Effects"; sourceTree = ""; }; 3251D23E108F8063007E281D /* iToonz */ = { isa = PBXGroup; children = ( 3251D242108F8125007E281D /* main.m */, 3251D231108F800C007E281D /* iToonz-Info.plist */, 3251D244108F8165007E281D /* Credits.rtf */, 3251D23F108F8119007E281D /* MainMenu.xib */, 3251D246108F817B007E281D /* Controller.h */, 3251D247108F817B007E281D /* Controller.m */, ); path = iToonz; sourceTree = ""; }; 3278307F1071513F0041F09C /* Examples */ = { isa = PBXGroup; children = ( B40F780013552AD300FCC42A /* ImageLab */, 327CD77811DCF74C00A88EA5 /* TimerLab */, 3251D23E108F8063007E281D /* iToonz */, 327831A110715FC90041F09C /* LineNumberView */, 327830941071527D0041F09C /* ModalResponder */, 3278314A10715A970041F09C /* StickyRowTableView Revue */, 322DEB9E1072591900CB7080 /* Window Effects */, ); path = Examples; sourceTree = ""; }; 327830941071527D0041F09C /* ModalResponder */ = { isa = PBXGroup; children = ( 32783095107152A90041F09C /* Controller.h */, 32783096107152A90041F09C /* Controller.m */, 32783098107152E30041F09C /* main.m */, 32783087107151B60041F09C /* ModalResponder-Info.plist */, 32783132107159280041F09C /* Credits.rtf */, 32783091107152680041F09C /* MainMenu.xib */, ); path = ModalResponder; sourceTree = ""; }; 3278314A10715A970041F09C /* StickyRowTableView Revue */ = { isa = PBXGroup; children = ( 3278315710715AEA0041F09C /* Controller.h */, 3278315810715AEA0041F09C /* Controller.m */, 3278315D10715AFC0041F09C /* main.m */, 3278315F10715B050041F09C /* StickyRowTableView Revue-Info.plist */, 3278316110715B210041F09C /* Credits.rtf */, 3278315A10715AF60041F09C /* MainMenu.xib */, ); path = "StickyRowTableView Revue"; sourceTree = ""; }; 327831A110715FC90041F09C /* LineNumberView */ = { isa = PBXGroup; children = ( 327831B3107160690041F09C /* Controller.h */, 327831B4107160690041F09C /* Controller.m */, 327831B5107160690041F09C /* MarkerLineNumberView.h */, 327831B6107160690041F09C /* MarkerLineNumberView.m */, 327831BA1071607D0041F09C /* main.m */, 327831A8107160380041F09C /* LineNumberView-Info.plist */, 327831DC107161EB0041F09C /* Credits.rtf */, 327831BC1071608F0041F09C /* MainMenu.xib */, ); path = LineNumberView; sourceTree = ""; }; 327CD77811DCF74C00A88EA5 /* TimerLab */ = { isa = PBXGroup; children = ( 327CD78111DCF7D400A88EA5 /* main.m */, 327CD7D611DD17F500A88EA5 /* Credits.rtf */, 327CD78311DCF7DE00A88EA5 /* TimerLab-Info.plist */, 327CD78511DCF82100A88EA5 /* MainMenu.xib */, 327CD77911DCF77000A88EA5 /* TimerLabAppDelegate.h */, 327CD77A11DCF77000A88EA5 /* TimerLabAppDelegate.m */, ); name = TimerLab; sourceTree = ""; }; 32C88DFF0371C24200C91783 /* Other Sources */ = { isa = PBXGroup; children = ( 32DBCF5E0370ADEE00C91783 /* NoodleKit_Prefix.pch */, ); name = "Other Sources"; sourceTree = ""; }; B40F780013552AD300FCC42A /* ImageLab */ = { isa = PBXGroup; children = ( B40F78A91356317F00FCC42A /* Credits.rtf */, B40F786913562DCF00FCC42A /* main.m */, B40F785013562CA500FCC42A /* test.tiff */, B40F784A13562C4D00FCC42A /* MainMenu.xib */, B40F785313562CED00FCC42A /* ImageLabAppDelegate.h */, B40F785413562CED00FCC42A /* ImageLabAppDelegate.m */, B40F787F13562E5000FCC42A /* TimedImageView.h */, B40F788013562E5000FCC42A /* TimedImageView.m */, B40F780B13552AF900FCC42A /* ImageLab-Info.plist */, ); path = ImageLab; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ 8DC2EF500486A6940098B216 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( 32782FB110713A4C0041F09C /* NoodleLineNumberView.h in Headers */, 32782FB610713B640041F09C /* NoodleLineNumberMarker.h in Headers */, 32782FD610713C1E0041F09C /* NSResponder-NoodleModalExtensions.h in Headers */, 327CD73711DCF15200A88EA5 /* NSTimer-NoodleExtensions.h in Headers */, 327CD73911DCF15200A88EA5 /* NoodleGlue.h in Headers */, 32782FE210713DA00041F09C /* NSImage-NoodleExtensions.h in Headers */, 32782FE610713DD60041F09C /* NSObject-NoodlePerformWhenIdle.h in Headers */, 3278303A107140600041F09C /* NSWindow-NoodleEffects.h in Headers */, 3251D221108F7FAE007E281D /* NSIndexSet-NoodleExtensions.h in Headers */, 3251D225108F7FB9007E281D /* NoodleTableView.h in Headers */, 3251D48D1090FFB0007E281D /* NSTableView-NoodleExtensions.h in Headers */, 326A35061092486800AF02F8 /* NoodleIPhoneTableView.h in Headers */, B40F77FC135527AE00FCC42A /* NoodleCustomImageRep.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ 322DEBA51072593A00CB7080 /* Window Effects */ = { isa = PBXNativeTarget; buildConfigurationList = 322DEBAB1072593B00CB7080 /* Build configuration list for PBXNativeTarget "Window Effects" */; buildPhases = ( 322DEBA21072593A00CB7080 /* Resources */, 322DEBA31072593A00CB7080 /* Sources */, 322DEBA41072593A00CB7080 /* Frameworks */, 322DECC910727BA700CB7080 /* Copy Frameworks */, ); buildRules = ( ); dependencies = ( 322DEBAD1072594000CB7080 /* PBXTargetDependency */, ); name = "Window Effects"; productName = "Window Effects"; productReference = 322DEBA61072593A00CB7080 /* Window Effects.app */; productType = "com.apple.product-type.application"; }; 3251D22E108F800C007E281D /* iToonz */ = { isa = PBXNativeTarget; buildConfigurationList = 3251D234108F800D007E281D /* Build configuration list for PBXNativeTarget "iToonz" */; buildPhases = ( 3251D22B108F800C007E281D /* Resources */, 3251D22C108F800C007E281D /* Sources */, 3251D22D108F800C007E281D /* Frameworks */, 327CD87C11DD23C500A88EA5 /* Copy Frameworks */, ); buildRules = ( ); dependencies = ( 3251D239108F802F007E281D /* PBXTargetDependency */, ); name = iToonz; productName = iToonz; productReference = 3251D22F108F800C007E281D /* iToonz.app */; productType = "com.apple.product-type.application"; }; 32783084107151B60041F09C /* ModalResponder */ = { isa = PBXNativeTarget; buildConfigurationList = 3278308A107151B70041F09C /* Build configuration list for PBXNativeTarget "ModalResponder" */; buildPhases = ( 32783081107151B60041F09C /* Resources */, 32783082107151B60041F09C /* Sources */, 32783083107151B60041F09C /* Frameworks */, 327831031071564E0041F09C /* Copy Frameworks */, ); buildRules = ( ); dependencies = ( 3278318810715CEB0041F09C /* PBXTargetDependency */, ); name = ModalResponder; productName = ModalResponderTest; productReference = 32783085107151B60041F09C /* ModalResponderTest.app */; productType = "com.apple.product-type.application"; }; 3278314E10715AB80041F09C /* StickyRowTableView Revue */ = { isa = PBXNativeTarget; buildConfigurationList = 3278315410715AB90041F09C /* Build configuration list for PBXNativeTarget "StickyRowTableView Revue" */; buildPhases = ( 3278314B10715AB80041F09C /* Resources */, 3278314C10715AB80041F09C /* Sources */, 3278314D10715AB80041F09C /* Frameworks */, 3278316610715B5F0041F09C /* Copy Frameworks */, ); buildRules = ( ); dependencies = ( 3278318A10715CF30041F09C /* PBXTargetDependency */, ); name = "StickyRowTableView Revue"; productName = "StickyRowTableView Revue"; productReference = 3278314F10715AB80041F09C /* StickyRowTableView Revue.app */; productType = "com.apple.product-type.application"; }; 327831A5107160380041F09C /* LineNumberView */ = { isa = PBXNativeTarget; buildConfigurationList = 327831AB107160390041F09C /* Build configuration list for PBXNativeTarget "LineNumberView" */; buildPhases = ( 327831A2107160380041F09C /* Resources */, 327831A3107160380041F09C /* Sources */, 327831A4107160380041F09C /* Frameworks */, 322DECB910727B4C00CB7080 /* Copy Frameworks */, ); buildRules = ( ); dependencies = ( 327831AD107160410041F09C /* PBXTargetDependency */, ); name = LineNumberView; productName = "Line View"; productReference = 327831A6107160380041F09C /* LineNumberView.app */; productType = "com.apple.product-type.application"; }; 327CD76811DCF2EE00A88EA5 /* TimerLab */ = { isa = PBXNativeTarget; buildConfigurationList = 327CD76E11DCF2EF00A88EA5 /* Build configuration list for PBXNativeTarget "TimerLab" */; buildPhases = ( 327CD76511DCF2EE00A88EA5 /* Resources */, 327CD76611DCF2EE00A88EA5 /* Sources */, 327CD76711DCF2EE00A88EA5 /* Frameworks */, 327CD81011DD1E2700A88EA5 /* Copy Frameworks */, ); buildRules = ( ); dependencies = ( 327CD79211DCF8D500A88EA5 /* PBXTargetDependency */, ); name = TimerLab; productName = TimerLab; productReference = 327CD76911DCF2EE00A88EA5 /* TimerLab.app */; productType = "com.apple.product-type.application"; }; 8DC2EF4F0486A6940098B216 /* NoodleKit */ = { isa = PBXNativeTarget; buildConfigurationList = 1DEB91AD08733DA50010E9CD /* Build configuration list for PBXNativeTarget "NoodleKit" */; buildPhases = ( 8DC2EF500486A6940098B216 /* Headers */, 8DC2EF520486A6940098B216 /* Resources */, 8DC2EF540486A6940098B216 /* Sources */, 8DC2EF560486A6940098B216 /* Frameworks */, ); buildRules = ( ); dependencies = ( ); name = NoodleKit; productInstallPath = "$(HOME)/Library/Frameworks"; productName = NoodleKit; productReference = 8DC2EF5B0486A6940098B216 /* NoodleKit.framework */; productType = "com.apple.product-type.framework"; }; B40F780813552AF900FCC42A /* ImageLab */ = { isa = PBXNativeTarget; buildConfigurationList = B40F780E13552AFA00FCC42A /* Build configuration list for PBXNativeTarget "ImageLab" */; buildPhases = ( B40F780513552AF900FCC42A /* Resources */, B40F780613552AF900FCC42A /* Sources */, B40F780713552AF900FCC42A /* Frameworks */, B40F784813552B8700FCC42A /* Copy Frameworks */, ); buildRules = ( ); dependencies = ( B40F781513552B1B00FCC42A /* PBXTargetDependency */, ); name = ImageLab; productName = ImageLab; productReference = B40F780913552AF900FCC42A /* ImageLab.app */; productType = "com.apple.product-type.application"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 0867D690FE84028FC02AAC07 /* Project object */ = { isa = PBXProject; attributes = { LastUpgradeCheck = 0430; }; buildConfigurationList = 1DEB91B108733DA50010E9CD /* Build configuration list for PBXProject "NoodleKit" */; compatibilityVersion = "Xcode 3.2"; developmentRegion = English; hasScannedForEncodings = 1; knownRegions = ( English, Japanese, French, German, ); mainGroup = 0867D691FE84028FC02AAC07 /* NoodleKit */; productRefGroup = 034768DFFF38A50411DB9C8B /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( 8DC2EF4F0486A6940098B216 /* NoodleKit */, 32783084107151B60041F09C /* ModalResponder */, 3278314E10715AB80041F09C /* StickyRowTableView Revue */, 327831A5107160380041F09C /* LineNumberView */, 322DEBA51072593A00CB7080 /* Window Effects */, 3251D22E108F800C007E281D /* iToonz */, 327CD76811DCF2EE00A88EA5 /* TimerLab */, B40F780813552AF900FCC42A /* ImageLab */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ 322DEBA21072593A00CB7080 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( 322DEBB81072598E00CB7080 /* MainMenu.xib in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; 3251D22B108F800C007E281D /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( 3251D241108F8119007E281D /* MainMenu.xib in Resources */, 3251D245108F8165007E281D /* Credits.rtf in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; 32783081107151B60041F09C /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( 32783133107159280041F09C /* Credits.rtf in Resources */, 32783093107152680041F09C /* MainMenu.xib in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; 3278314B10715AB80041F09C /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( 3278315C10715AF60041F09C /* MainMenu.xib in Resources */, 3278316210715B210041F09C /* Credits.rtf in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; 327831A2107160380041F09C /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( 327831BE1071608F0041F09C /* MainMenu.xib in Resources */, 327831DD107161EB0041F09C /* Credits.rtf in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; 327CD76511DCF2EE00A88EA5 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( 327CD78711DCF82100A88EA5 /* MainMenu.xib in Resources */, 327CD7D711DD17F500A88EA5 /* Credits.rtf in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; 8DC2EF520486A6940098B216 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( 8DC2EF530486A6940098B216 /* InfoPlist.strings in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; B40F780513552AF900FCC42A /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( B40F784C13562C4D00FCC42A /* MainMenu.xib in Resources */, B40F785113562CA500FCC42A /* test.tiff in Resources */, B40F78AA1356317F00FCC42A /* Credits.rtf in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ 322DEBA31072593A00CB7080 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 322DEBB31072595B00CB7080 /* Controller.m in Sources */, 322DEBB41072595B00CB7080 /* main.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 3251D22C108F800C007E281D /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 3251D243108F8125007E281D /* main.m in Sources */, 3251D248108F817C007E281D /* Controller.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 32783082107151B60041F09C /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 32783097107152A90041F09C /* Controller.m in Sources */, 32783099107152E30041F09C /* main.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 3278314C10715AB80041F09C /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 3278315910715AEA0041F09C /* Controller.m in Sources */, 3278315E10715AFC0041F09C /* main.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 327831A3107160380041F09C /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 327831B7107160690041F09C /* Controller.m in Sources */, 327831B8107160690041F09C /* MarkerLineNumberView.m in Sources */, 327831BB1071607D0041F09C /* main.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 327CD76611DCF2EE00A88EA5 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 327CD77B11DCF77000A88EA5 /* TimerLabAppDelegate.m in Sources */, 327CD78211DCF7D400A88EA5 /* main.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 8DC2EF540486A6940098B216 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 32782FE710713DD60041F09C /* NSObject-NoodlePerformWhenIdle.m in Sources */, 32782FD710713C1E0041F09C /* NSResponder-NoodleModalExtensions.m in Sources */, 32782FE310713DA00041F09C /* NSImage-NoodleExtensions.m in Sources */, 327CD73811DCF15200A88EA5 /* NSTimer-NoodleExtensions.m in Sources */, 327CD73A11DCF15200A88EA5 /* NoodleGlue.m in Sources */, 3278303B107140600041F09C /* NSWindow-NoodleEffects.m in Sources */, 3251D222108F7FAE007E281D /* NSIndexSet-NoodleExtensions.m in Sources */, 32782FB210713A4C0041F09C /* NoodleLineNumberView.m in Sources */, 32782FB710713B640041F09C /* NoodleLineNumberMarker.m in Sources */, 3251D226108F7FB9007E281D /* NoodleTableView.m in Sources */, 3251D48E1090FFB0007E281D /* NSTableView-NoodleExtensions.m in Sources */, 326A35051092486400AF02F8 /* NoodleIPhoneTableView.m in Sources */, B40F77FD135527AE00FCC42A /* NoodleCustomImageRep.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; B40F780613552AF900FCC42A /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( B40F785513562CED00FCC42A /* ImageLabAppDelegate.m in Sources */, B40F786A13562DCF00FCC42A /* main.m in Sources */, B40F788113562E5000FCC42A /* TimedImageView.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ 322DEBAD1072594000CB7080 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 8DC2EF4F0486A6940098B216 /* NoodleKit */; targetProxy = 322DEBAC1072594000CB7080 /* PBXContainerItemProxy */; }; 3251D239108F802F007E281D /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 8DC2EF4F0486A6940098B216 /* NoodleKit */; targetProxy = 3251D238108F802F007E281D /* PBXContainerItemProxy */; }; 3278318810715CEB0041F09C /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 8DC2EF4F0486A6940098B216 /* NoodleKit */; targetProxy = 3278318710715CEB0041F09C /* PBXContainerItemProxy */; }; 3278318A10715CF30041F09C /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 8DC2EF4F0486A6940098B216 /* NoodleKit */; targetProxy = 3278318910715CF30041F09C /* PBXContainerItemProxy */; }; 327831AD107160410041F09C /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 8DC2EF4F0486A6940098B216 /* NoodleKit */; targetProxy = 327831AC107160410041F09C /* PBXContainerItemProxy */; }; 327CD79211DCF8D500A88EA5 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 8DC2EF4F0486A6940098B216 /* NoodleKit */; targetProxy = 327CD79111DCF8D500A88EA5 /* PBXContainerItemProxy */; }; B40F781513552B1B00FCC42A /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 8DC2EF4F0486A6940098B216 /* NoodleKit */; targetProxy = B40F781413552B1B00FCC42A /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ /* Begin PBXVariantGroup section */ 089C1666FE841158C02AAC07 /* InfoPlist.strings */ = { isa = PBXVariantGroup; children = ( 089C1667FE841158C02AAC07 /* English */, ); name = InfoPlist.strings; sourceTree = ""; }; 322DEBB61072598E00CB7080 /* MainMenu.xib */ = { isa = PBXVariantGroup; children = ( 322DEBB71072598E00CB7080 /* English */, ); name = MainMenu.xib; path = ..; sourceTree = ""; }; 3251D23F108F8119007E281D /* MainMenu.xib */ = { isa = PBXVariantGroup; children = ( 3251D240108F8119007E281D /* English */, ); name = MainMenu.xib; sourceTree = ""; }; 32783091107152680041F09C /* MainMenu.xib */ = { isa = PBXVariantGroup; children = ( 32783092107152680041F09C /* MainMenu.xib */, ); name = MainMenu.xib; path = ..; sourceTree = ""; }; 3278315A10715AF60041F09C /* MainMenu.xib */ = { isa = PBXVariantGroup; children = ( 3278315B10715AF60041F09C /* English */, ); name = MainMenu.xib; sourceTree = ""; }; 327831BC1071608F0041F09C /* MainMenu.xib */ = { isa = PBXVariantGroup; children = ( 327831BD1071608F0041F09C /* MainMenu.xib */, ); name = MainMenu.xib; path = ../..; sourceTree = ""; }; 327CD78511DCF82100A88EA5 /* MainMenu.xib */ = { isa = PBXVariantGroup; children = ( 327CD78611DCF82100A88EA5 /* English */, ); name = MainMenu.xib; sourceTree = ""; }; B40F784A13562C4D00FCC42A /* MainMenu.xib */ = { isa = PBXVariantGroup; children = ( B40F784B13562C4D00FCC42A /* English */, ); name = MainMenu.xib; sourceTree = ""; }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ 1DEB91AE08733DA50010E9CD /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; COPY_PHASE_STRIP = NO; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; FRAMEWORK_VERSION = A; GCC_DYNAMIC_NO_PIC = NO; GCC_MODEL_TUNING = G5; GCC_OPTIMIZATION_LEVEL = 0; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = NoodleKit_Prefix.pch; INFOPLIST_FILE = Info.plist; INSTALL_PATH = "@rpath"; PRODUCT_NAME = NoodleKit; WRAPPER_EXTENSION = framework; }; name = Debug; }; 1DEB91AF08733DA50010E9CD /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; FRAMEWORK_VERSION = A; GCC_MODEL_TUNING = G5; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = NoodleKit_Prefix.pch; INFOPLIST_FILE = Info.plist; INSTALL_PATH = "@rpath"; PRODUCT_NAME = NoodleKit; WRAPPER_EXTENSION = framework; }; name = Release; }; 1DEB91B208733DA50010E9CD /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_OPTIMIZATION_LEVEL = 0; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; LD_RUNPATH_SEARCH_PATHS = "@loader_path/../Frameworks"; MACOSX_DEPLOYMENT_TARGET = 10.6; ONLY_ACTIVE_ARCH = YES; "OTHER_CFLAGS[arch=i386]" = ( "$(inherited)", "-fsingle-precision-constant", ); "OTHER_CFLAGS[arch=ppc]" = ( "$(inherited)", "-fsingle-precision-constant", ); SDKROOT = macosx10.6; }; name = Debug; }; 1DEB91B308733DA50010E9CD /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; FRAMEWORK_SEARCH_PATHS = "$(BUILT_PRODUCTS_DIR)"; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; LD_RUNPATH_SEARCH_PATHS = "@loader_path/../Frameworks"; MACOSX_DEPLOYMENT_TARGET = 10.6; "OTHER_CFLAGS[arch=i386]" = ( "$(inherited)", "-fsingle-precision-constant", ); "OTHER_CFLAGS[arch=ppc]" = ( "$(inherited)", "-fsingle-precision-constant", ); SDKROOT = macosx10.6; }; name = Release; }; 322DEBA91072593A00CB7080 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; COPY_PHASE_STRIP = NO; GCC_DYNAMIC_NO_PIC = NO; GCC_MODEL_TUNING = G5; GCC_OPTIMIZATION_LEVEL = 0; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/AppKit.framework/Headers/AppKit.h"; INFOPLIST_FILE = "Examples/Window Effects/Window Effects-Info.plist"; INSTALL_PATH = "$(HOME)/Applications"; OTHER_LDFLAGS = ( "-framework", Foundation, "-framework", AppKit, ); PRODUCT_NAME = "Window Effects"; }; name = Debug; }; 322DEBAA1072593A00CB7080 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; COPY_PHASE_STRIP = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; GCC_MODEL_TUNING = G5; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/AppKit.framework/Headers/AppKit.h"; INFOPLIST_FILE = "Examples/Window Effects/Window Effects-Info.plist"; INSTALL_PATH = "$(HOME)/Applications"; OTHER_LDFLAGS = ( "-framework", Foundation, "-framework", AppKit, ); PRODUCT_NAME = "Window Effects"; ZERO_LINK = NO; }; name = Release; }; 3251D232108F800D007E281D /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; COPY_PHASE_STRIP = NO; GCC_DYNAMIC_NO_PIC = NO; GCC_MODEL_TUNING = G5; GCC_OPTIMIZATION_LEVEL = 0; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/AppKit.framework/Headers/AppKit.h"; INFOPLIST_FILE = "Examples/iToonz/iToonz-Info.plist"; INSTALL_PATH = "$(HOME)/Applications"; OTHER_LDFLAGS = ( "-framework", Foundation, "-framework", AppKit, ); PRODUCT_NAME = iToonz; }; name = Debug; }; 3251D233108F800D007E281D /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; COPY_PHASE_STRIP = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; GCC_MODEL_TUNING = G5; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/AppKit.framework/Headers/AppKit.h"; INFOPLIST_FILE = "Examples/iToonz/iToonz-Info.plist"; INSTALL_PATH = "$(HOME)/Applications"; OTHER_LDFLAGS = ( "-framework", Foundation, "-framework", AppKit, ); PRODUCT_NAME = iToonz; ZERO_LINK = NO; }; name = Release; }; 32783088107151B70041F09C /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; COPY_PHASE_STRIP = NO; GCC_DYNAMIC_NO_PIC = NO; GCC_MODEL_TUNING = G5; GCC_OPTIMIZATION_LEVEL = 0; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/AppKit.framework/Headers/AppKit.h"; INFOPLIST_FILE = "Examples/ModalResponder/ModalResponder-Info.plist"; INSTALL_PATH = "$(HOME)/Applications"; OTHER_LDFLAGS = ( "-framework", Foundation, "-framework", AppKit, ); PRODUCT_NAME = ModalResponderTest; }; name = Debug; }; 32783089107151B70041F09C /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; COPY_PHASE_STRIP = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; GCC_MODEL_TUNING = G5; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/AppKit.framework/Headers/AppKit.h"; INFOPLIST_FILE = "Examples/ModalResponder/ModalResponder-Info.plist"; INSTALL_PATH = "$(HOME)/Applications"; OTHER_LDFLAGS = ( "-framework", Foundation, "-framework", AppKit, ); PRODUCT_NAME = ModalResponderTest; ZERO_LINK = NO; }; name = Release; }; 3278315210715AB90041F09C /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; COPY_PHASE_STRIP = NO; GCC_DYNAMIC_NO_PIC = NO; GCC_MODEL_TUNING = G5; GCC_OPTIMIZATION_LEVEL = 0; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/AppKit.framework/Headers/AppKit.h"; INFOPLIST_FILE = "Examples/StickyRowTableView Revue/StickyRowTableView Revue-Info.plist"; INSTALL_PATH = "$(HOME)/Applications"; OTHER_LDFLAGS = ( "-framework", Foundation, "-framework", AppKit, ); PRODUCT_NAME = "StickyRowTableView Revue"; }; name = Debug; }; 3278315310715AB90041F09C /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; COPY_PHASE_STRIP = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; GCC_MODEL_TUNING = G5; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/AppKit.framework/Headers/AppKit.h"; INFOPLIST_FILE = "Examples/StickyRowTableView Revue/StickyRowTableView Revue-Info.plist"; INSTALL_PATH = "$(HOME)/Applications"; OTHER_LDFLAGS = ( "-framework", Foundation, "-framework", AppKit, ); PRODUCT_NAME = "StickyRowTableView Revue"; ZERO_LINK = NO; }; name = Release; }; 327831A9107160380041F09C /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; COPY_PHASE_STRIP = NO; GCC_DYNAMIC_NO_PIC = NO; GCC_MODEL_TUNING = G5; GCC_OPTIMIZATION_LEVEL = 0; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/AppKit.framework/Headers/AppKit.h"; INFOPLIST_FILE = "Examples/LineNumberView/LineNumberView-Info.plist"; INSTALL_PATH = "$(HOME)/Applications"; OTHER_LDFLAGS = ( "-framework", Foundation, "-framework", AppKit, ); PRODUCT_NAME = LineNumberView; }; name = Debug; }; 327831AA107160380041F09C /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; COPY_PHASE_STRIP = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; GCC_MODEL_TUNING = G5; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/AppKit.framework/Headers/AppKit.h"; INFOPLIST_FILE = "Examples/LineNumberView/LineNumberView-Info.plist"; INSTALL_PATH = "$(HOME)/Applications"; OTHER_LDFLAGS = ( "-framework", Foundation, "-framework", AppKit, ); PRODUCT_NAME = LineNumberView; ZERO_LINK = NO; }; name = Release; }; 327CD76C11DCF2EF00A88EA5 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; COPY_PHASE_STRIP = NO; GCC_DYNAMIC_NO_PIC = NO; GCC_MODEL_TUNING = G5; GCC_OPTIMIZATION_LEVEL = 0; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/AppKit.framework/Headers/AppKit.h"; INFOPLIST_FILE = "Examples/TimerLab/TimerLab-Info.plist"; INSTALL_PATH = "$(HOME)/Applications"; OTHER_LDFLAGS = ( "-framework", Foundation, "-framework", AppKit, ); PRODUCT_NAME = TimerLab; }; name = Debug; }; 327CD76D11DCF2EF00A88EA5 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; COPY_PHASE_STRIP = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; GCC_MODEL_TUNING = G5; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/AppKit.framework/Headers/AppKit.h"; INFOPLIST_FILE = "Examples/TimerLab/TimerLab-Info.plist"; INSTALL_PATH = "$(HOME)/Applications"; OTHER_LDFLAGS = ( "-framework", Foundation, "-framework", AppKit, ); PRODUCT_NAME = TimerLab; ZERO_LINK = NO; }; name = Release; }; B40F780C13552AF900FCC42A /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; COPY_PHASE_STRIP = NO; GCC_DYNAMIC_NO_PIC = NO; GCC_MODEL_TUNING = G5; GCC_OPTIMIZATION_LEVEL = 0; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/AppKit.framework/Headers/AppKit.h"; INFOPLIST_FILE = "Examples/ImageLab/ImageLab-Info.plist"; INSTALL_PATH = "$(HOME)/Applications"; OTHER_LDFLAGS = ( "-framework", Foundation, "-framework", AppKit, ); PRODUCT_NAME = ImageLab; }; name = Debug; }; B40F780D13552AF900FCC42A /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; COPY_PHASE_STRIP = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; GCC_MODEL_TUNING = G5; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/AppKit.framework/Headers/AppKit.h"; INFOPLIST_FILE = "Examples/ImageLab/ImageLab-Info.plist"; INSTALL_PATH = "$(HOME)/Applications"; OTHER_LDFLAGS = ( "-framework", Foundation, "-framework", AppKit, ); PRODUCT_NAME = ImageLab; ZERO_LINK = NO; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ 1DEB91AD08733DA50010E9CD /* Build configuration list for PBXNativeTarget "NoodleKit" */ = { isa = XCConfigurationList; buildConfigurations = ( 1DEB91AE08733DA50010E9CD /* Debug */, 1DEB91AF08733DA50010E9CD /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 1DEB91B108733DA50010E9CD /* Build configuration list for PBXProject "NoodleKit" */ = { isa = XCConfigurationList; buildConfigurations = ( 1DEB91B208733DA50010E9CD /* Debug */, 1DEB91B308733DA50010E9CD /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 322DEBAB1072593B00CB7080 /* Build configuration list for PBXNativeTarget "Window Effects" */ = { isa = XCConfigurationList; buildConfigurations = ( 322DEBA91072593A00CB7080 /* Debug */, 322DEBAA1072593A00CB7080 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 3251D234108F800D007E281D /* Build configuration list for PBXNativeTarget "iToonz" */ = { isa = XCConfigurationList; buildConfigurations = ( 3251D232108F800D007E281D /* Debug */, 3251D233108F800D007E281D /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 3278308A107151B70041F09C /* Build configuration list for PBXNativeTarget "ModalResponder" */ = { isa = XCConfigurationList; buildConfigurations = ( 32783088107151B70041F09C /* Debug */, 32783089107151B70041F09C /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 3278315410715AB90041F09C /* Build configuration list for PBXNativeTarget "StickyRowTableView Revue" */ = { isa = XCConfigurationList; buildConfigurations = ( 3278315210715AB90041F09C /* Debug */, 3278315310715AB90041F09C /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 327831AB107160390041F09C /* Build configuration list for PBXNativeTarget "LineNumberView" */ = { isa = XCConfigurationList; buildConfigurations = ( 327831A9107160380041F09C /* Debug */, 327831AA107160380041F09C /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 327CD76E11DCF2EF00A88EA5 /* Build configuration list for PBXNativeTarget "TimerLab" */ = { isa = XCConfigurationList; buildConfigurations = ( 327CD76C11DCF2EF00A88EA5 /* Debug */, 327CD76D11DCF2EF00A88EA5 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; B40F780E13552AFA00FCC42A /* Build configuration list for PBXNativeTarget "ImageLab" */ = { isa = XCConfigurationList; buildConfigurations = ( B40F780C13552AF900FCC42A /* Debug */, B40F780D13552AF900FCC42A /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; rootObject = 0867D690FE84028FC02AAC07 /* Project object */; } ================================================ FILE: NoodleKit.xcodeproj/project.xcworkspace/contents.xcworkspacedata ================================================ ================================================ FILE: NoodleKit_Prefix.pch ================================================ // // Prefix header for all source files of the 'NoodleKit' target in the 'NoodleKit' project. // #ifdef __OBJC__ #import #endif ================================================ FILE: NoodleLineNumberMarker.h ================================================ // // NoodleLineNumberMarker.h // NoodleKit // // Created by Paul Kim on 9/30/08. // Copyright (c) 2008 Noodlesoft, LLC. All rights reserved. // // Permission is hereby granted, free of charge, to any person // obtaining a copy of this software and associated documentation // files (the "Software"), to deal in the Software without // restriction, including without limitation the rights to use, // copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the // Software is furnished to do so, subject to the following // conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. // #import /* Marker for NoodleLineNumberView. For more details, see the related blog post at: http://www.noodlesoft.com/blog/2008/10/05/displaying-line-numbers-with-nstextview/ */ @interface NoodleLineNumberMarker : NSRulerMarker { NSUInteger _lineNumber; } - (id)initWithRulerView:(NSRulerView *)aRulerView lineNumber:(CGFloat)line image:(NSImage *)anImage imageOrigin:(NSPoint)imageOrigin; - (void)setLineNumber:(NSUInteger)line; - (NSUInteger)lineNumber; @end ================================================ FILE: NoodleLineNumberMarker.m ================================================ // // NoodleLineNumberMarker.m // NoodleKit // // Created by Paul Kim on 9/30/08. // Copyright (c) 2008 Noodlesoft, LLC. All rights reserved. // // Permission is hereby granted, free of charge, to any person // obtaining a copy of this software and associated documentation // files (the "Software"), to deal in the Software without // restriction, including without limitation the rights to use, // copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the // Software is furnished to do so, subject to the following // conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. // #import "NoodleLineNumberMarker.h" @implementation NoodleLineNumberMarker - (id)initWithRulerView:(NSRulerView *)aRulerView lineNumber:(CGFloat)line image:(NSImage *)anImage imageOrigin:(NSPoint)imageOrigin { if ((self = [super initWithRulerView:aRulerView markerLocation:0.0 image:anImage imageOrigin:imageOrigin]) != nil) { _lineNumber = line; } return self; } - (void)setLineNumber:(NSUInteger)line { _lineNumber = line; } - (NSUInteger)lineNumber { return _lineNumber; } #pragma mark NSCoding methods #define NOODLE_LINE_CODING_KEY @"line" - (id)initWithCoder:(NSCoder *)decoder { if ((self = [super initWithCoder:decoder]) != nil) { if ([decoder allowsKeyedCoding]) { _lineNumber = [[decoder decodeObjectForKey:NOODLE_LINE_CODING_KEY] unsignedIntegerValue]; } else { _lineNumber = [[decoder decodeObject] unsignedIntegerValue]; } } return self; } - (void)encodeWithCoder:(NSCoder *)encoder { [super encodeWithCoder:encoder]; if ([encoder allowsKeyedCoding]) { [encoder encodeObject:[NSNumber numberWithUnsignedInteger:_lineNumber] forKey:NOODLE_LINE_CODING_KEY]; } else { [encoder encodeObject:[NSNumber numberWithUnsignedInteger:_lineNumber]]; } } #pragma mark NSCopying methods - (id)copyWithZone:(NSZone *)zone { id copy; copy = [super copyWithZone:zone]; [copy setLineNumber:_lineNumber]; return copy; } @end ================================================ FILE: NoodleLineNumberView.h ================================================ // // NoodleLineNumberView.h // NoodleKit // // Created by Paul Kim on 9/28/08. // Copyright (c) 2008-2012 Noodlesoft, LLC. All rights reserved. // // Permission is hereby granted, free of charge, to any person // obtaining a copy of this software and associated documentation // files (the "Software"), to deal in the Software without // restriction, including without limitation the rights to use, // copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the // Software is furnished to do so, subject to the following // conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. // #import /* Displays line numbers for an NSTextView. For more details, see the related blog post at: http://www.noodlesoft.com/blog/2008/10/05/displaying-line-numbers-with-nstextview/ */ @class NoodleLineNumberMarker; @interface NoodleLineNumberView : NSRulerView { // Array of character indices for the beginning of each line NSMutableArray *_lineIndices; // When text is edited, this is the start of the editing region. All line calculations after this point are invalid // and need to be recalculated. NSUInteger _invalidCharacterIndex; // Maps line numbers to markers NSMutableDictionary *_linesToMarkers; NSFont *_font; NSColor *_textColor; NSColor *_alternateTextColor; NSColor *_backgroundColor; } @property (readwrite, retain) NSFont *font; @property (readwrite, retain) NSColor *textColor; @property (readwrite, retain) NSColor *alternateTextColor; @property (readwrite, retain) NSColor *backgroundColor; - (id)initWithScrollView:(NSScrollView *)aScrollView; - (NSUInteger)lineNumberForLocation:(CGFloat)location; - (NoodleLineNumberMarker *)markerAtLine:(NSUInteger)line; @end ================================================ FILE: NoodleLineNumberView.m ================================================ // // NoodleLineNumberView.m // NoodleKit // // Created by Paul Kim on 9/28/08. // Copyright (c) 2008 Noodlesoft, LLC. All rights reserved. // // Permission is hereby granted, free of charge, to any person // obtaining a copy of this software and associated documentation // files (the "Software"), to deal in the Software without // restriction, including without limitation the rights to use, // copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the // Software is furnished to do so, subject to the following // conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. // #import "NoodleLineNumberView.h" #import "NoodleLineNumberMarker.h" #import #define DEFAULT_THICKNESS 22.0 #define RULER_MARGIN 5.0 @interface NoodleLineNumberView (Private) - (NSFont *)defaultFont; - (NSColor *)defaultTextColor; - (NSColor *)defaultAlternateTextColor; - (NSMutableArray *)lineIndices; - (void)invalidateLineIndicesFromCharacterIndex:(NSUInteger)charIndex; - (void)calculateLines; - (NSUInteger)lineNumberForCharacterIndex:(NSUInteger)index inText:(NSString *)text; - (NSDictionary *)textAttributes; - (NSDictionary *)markerTextAttributes; @end @implementation NoodleLineNumberView @synthesize font = _font; @synthesize textColor = _textColor; @synthesize alternateTextColor = _alternateTextColor; @synthesize backgroundColor = _backgroundColor; - (id)initWithScrollView:(NSScrollView *)aScrollView { if ((self = [super initWithScrollView:aScrollView orientation:NSVerticalRuler]) != nil) { _lineIndices = [[NSMutableArray alloc] init]; _linesToMarkers = [[NSMutableDictionary alloc] init]; [self setClientView:[aScrollView documentView]]; } return self; } - (void)awakeFromNib { _lineIndices = [[NSMutableArray alloc] init]; _linesToMarkers = [[NSMutableDictionary alloc] init]; [self setClientView:[[self scrollView] documentView]]; } - (void)dealloc { [[NSNotificationCenter defaultCenter] removeObserver:self]; [_lineIndices release]; [_linesToMarkers release]; [_font release]; [_textColor release]; [_alternateTextColor release]; [_backgroundColor release]; [super dealloc]; } - (NSFont *)defaultFont { return [NSFont labelFontOfSize:[NSFont systemFontSizeForControlSize:NSMiniControlSize]]; } - (NSColor *)defaultTextColor { return [NSColor colorWithCalibratedWhite:0.42 alpha:1.0]; } - (NSColor *)defaultAlternateTextColor { return [NSColor whiteColor]; } - (void)setClientView:(NSView *)aView { id oldClientView; oldClientView = [self clientView]; if ((oldClientView != aView) && [oldClientView isKindOfClass:[NSTextView class]]) { [[NSNotificationCenter defaultCenter] removeObserver:self name:NSTextStorageDidProcessEditingNotification object:[(NSTextView *)oldClientView textStorage]]; } [super setClientView:aView]; if ((aView != nil) && [aView isKindOfClass:[NSTextView class]]) { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textStorageDidProcessEditing:) name:NSTextStorageDidProcessEditingNotification object:[(NSTextView *)aView textStorage]]; [self invalidateLineIndicesFromCharacterIndex:0]; } } - (NSMutableArray *)lineIndices { if (_invalidCharacterIndex < NSUIntegerMax) { [self calculateLines]; } return _lineIndices; } // Forces recalculation of line indicies starting from the given index - (void)invalidateLineIndicesFromCharacterIndex:(NSUInteger)charIndex { _invalidCharacterIndex = MIN(charIndex, _invalidCharacterIndex); } - (void)textStorageDidProcessEditing:(NSNotification *)notification { NSTextStorage *storage; NSRange range; storage = [notification object]; // Invalidate the line indices. They will be recalculated and re-cached on demand. range = [storage editedRange]; if (range.location != NSNotFound) { [self invalidateLineIndicesFromCharacterIndex:range.location]; [self setNeedsDisplay:YES]; } } - (void)calculateLines { id view; view = [self clientView]; if ([view isKindOfClass:[NSTextView class]]) { NSUInteger charIndex, stringLength, lineEnd, contentEnd, count, lineIndex; NSString *text; CGFloat oldThickness, newThickness; text = [view string]; stringLength = [text length]; count = [_lineIndices count]; charIndex = 0; lineIndex = [self lineNumberForCharacterIndex:_invalidCharacterIndex inText:text]; if (count > 0) { charIndex = [[_lineIndices objectAtIndex:lineIndex] unsignedIntegerValue]; } do { if (lineIndex < count) { [_lineIndices replaceObjectAtIndex:lineIndex withObject:[NSNumber numberWithUnsignedInteger:charIndex]]; } else { [_lineIndices addObject:[NSNumber numberWithUnsignedInteger:charIndex]]; } charIndex = NSMaxRange([text lineRangeForRange:NSMakeRange(charIndex, 0)]); lineIndex++; } while (charIndex < stringLength); if (lineIndex < count) { [_lineIndices removeObjectsInRange:NSMakeRange(lineIndex, count - lineIndex)]; } _invalidCharacterIndex = NSUIntegerMax; // Check if text ends with a new line. [text getLineStart:NULL end:&lineEnd contentsEnd:&contentEnd forRange:NSMakeRange([[_lineIndices lastObject] unsignedIntegerValue], 0)]; if (contentEnd < lineEnd) { [_lineIndices addObject:[NSNumber numberWithUnsignedInteger:charIndex]]; } // See if we need to adjust the width of the view oldThickness = [self ruleThickness]; newThickness = [self requiredThickness]; if (fabs(oldThickness - newThickness) > 1) { NSInvocation *invocation; // Not a good idea to resize the view during calculations (which can happen during // display). Do a delayed perform (using NSInvocation since arg is a float). invocation = [NSInvocation invocationWithMethodSignature:[self methodSignatureForSelector:@selector(setRuleThickness:)]]; [invocation setSelector:@selector(setRuleThickness:)]; [invocation setTarget:self]; [invocation setArgument:&newThickness atIndex:2]; [invocation performSelector:@selector(invoke) withObject:nil afterDelay:0.0]; } } } - (NSUInteger)lineNumberForCharacterIndex:(NSUInteger)charIndex inText:(NSString *)text { NSUInteger left, right, mid, lineStart; NSMutableArray *lines; if (_invalidCharacterIndex < NSUIntegerMax) { // We do not want to risk calculating the indices again since we are probably doing it right now, thus // possibly causing an infinite loop. lines = _lineIndices; } else { lines = [self lineIndices]; } // Binary search left = 0; right = [lines count]; while ((right - left) > 1) { mid = (right + left) / 2; lineStart = [[lines objectAtIndex:mid] unsignedIntegerValue]; if (charIndex < lineStart) { right = mid; } else if (charIndex > lineStart) { left = mid; } else { return mid; } } return left; } - (NSDictionary *)textAttributes { NSFont *font; NSColor *color; font = [self font]; if (font == nil) { font = [self defaultFont]; } color = [self textColor]; if (color == nil) { color = [self defaultTextColor]; } return [NSDictionary dictionaryWithObjectsAndKeys:font, NSFontAttributeName, color, NSForegroundColorAttributeName, nil]; } - (NSDictionary *)markerTextAttributes { NSFont *font; NSColor *color; font = [self font]; if (font == nil) { font = [self defaultFont]; } color = [self alternateTextColor]; if (color == nil) { color = [self defaultAlternateTextColor]; } return [NSDictionary dictionaryWithObjectsAndKeys:font, NSFontAttributeName, color, NSForegroundColorAttributeName, nil]; } - (CGFloat)requiredThickness { NSUInteger lineCount, digits, i; NSMutableString *sampleString; NSSize stringSize; lineCount = [[self lineIndices] count]; digits = 1; if (lineCount > 0) { digits = (NSUInteger)log10(lineCount) + 1; } sampleString = [NSMutableString string]; for (i = 0; i < digits; i++) { // Use "8" since it is one of the fatter numbers. Anything but "1" // will probably be ok here. I could be pedantic and actually find the fattest // number for the current font but nah. [sampleString appendString:@"8"]; } stringSize = [sampleString sizeWithAttributes:[self textAttributes]]; // Round up the value. There is a bug on 10.4 where the display gets all wonky when scrolling if you don't // return an integral value here. return ceil(MAX(DEFAULT_THICKNESS, stringSize.width + RULER_MARGIN * 2)); } - (void)drawHashMarksAndLabelsInRect:(NSRect)aRect { id view; NSRect bounds; bounds = [self bounds]; if (_backgroundColor != nil) { [_backgroundColor set]; NSRectFill(bounds); [[NSColor colorWithCalibratedWhite:0.58 alpha:1.0] set]; [NSBezierPath strokeLineFromPoint:NSMakePoint(NSMaxX(bounds) - 0/5, NSMinY(bounds)) toPoint:NSMakePoint(NSMaxX(bounds) - 0.5, NSMaxY(bounds))]; } view = [self clientView]; if ([view isKindOfClass:[NSTextView class]]) { NSLayoutManager *layoutManager; NSTextContainer *container; NSRect visibleRect, markerRect; NSRange range, glyphRange, nullRange; NSString *text, *labelText; NSUInteger rectCount, index, line, count; NSRectArray rects; CGFloat ypos, yinset; NSDictionary *textAttributes, *currentTextAttributes; NSSize stringSize, markerSize; NoodleLineNumberMarker *marker; NSImage *markerImage; NSMutableArray *lines; layoutManager = [view layoutManager]; container = [view textContainer]; text = [view string]; nullRange = NSMakeRange(NSNotFound, 0); yinset = [view textContainerInset].height; visibleRect = [[[self scrollView] contentView] bounds]; textAttributes = [self textAttributes]; lines = [self lineIndices]; // Find the characters that are currently visible glyphRange = [layoutManager glyphRangeForBoundingRect:visibleRect inTextContainer:container]; range = [layoutManager characterRangeForGlyphRange:glyphRange actualGlyphRange:NULL]; // Fudge the range a tad in case there is an extra new line at end. // It doesn't show up in the glyphs so would not be accounted for. range.length++; count = [lines count]; for (line = [self lineNumberForCharacterIndex:range.location inText:text]; line < count; line++) { index = [[lines objectAtIndex:line] unsignedIntegerValue]; if (NSLocationInRange(index, range)) { rects = [layoutManager rectArrayForCharacterRange:NSMakeRange(index, 0) withinSelectedCharacterRange:nullRange inTextContainer:container rectCount:&rectCount]; if (rectCount > 0) { // Note that the ruler view is only as tall as the visible // portion. Need to compensate for the clipview's coordinates. ypos = yinset + NSMinY(rects[0]) - NSMinY(visibleRect); marker = [_linesToMarkers objectForKey:[NSNumber numberWithUnsignedInteger:line]]; if (marker != nil) { markerImage = [marker image]; markerSize = [markerImage size]; markerRect = NSMakeRect(0.0, 0.0, markerSize.width, markerSize.height); // Marker is flush right and centered vertically within the line. markerRect.origin.x = NSWidth(bounds) - [markerImage size].width - 1.0; markerRect.origin.y = ypos + NSHeight(rects[0]) / 2.0 - [marker imageOrigin].y; [markerImage drawInRect:markerRect fromRect:NSMakeRect(0, 0, markerSize.width, markerSize.height) operation:NSCompositeSourceOver fraction:1.0]; } // Line numbers are internally stored starting at 0 labelText = [NSString stringWithFormat:@"%jd", (intmax_t)line + 1]; stringSize = [labelText sizeWithAttributes:textAttributes]; if (marker == nil) { currentTextAttributes = textAttributes; } else { currentTextAttributes = [self markerTextAttributes]; } // Draw string flush right, centered vertically within the line [labelText drawInRect: NSMakeRect(NSWidth(bounds) - stringSize.width - RULER_MARGIN, ypos + (NSHeight(rects[0]) - stringSize.height) / 2.0, NSWidth(bounds) - RULER_MARGIN * 2.0, NSHeight(rects[0])) withAttributes:currentTextAttributes]; } } if (index > NSMaxRange(range)) { break; } } } } - (NSUInteger)lineNumberForLocation:(CGFloat)location { NSUInteger line, count, index, rectCount, i; NSRectArray rects; NSRect visibleRect; NSLayoutManager *layoutManager; NSTextContainer *container; NSRange nullRange; NSMutableArray *lines; id view; view = [self clientView]; visibleRect = [[[self scrollView] contentView] bounds]; lines = [self lineIndices]; location += NSMinY(visibleRect); if ([view isKindOfClass:[NSTextView class]]) { nullRange = NSMakeRange(NSNotFound, 0); layoutManager = [view layoutManager]; container = [view textContainer]; count = [lines count]; for (line = 0; line < count; line++) { index = [[lines objectAtIndex:line] unsignedIntegerValue]; rects = [layoutManager rectArrayForCharacterRange:NSMakeRange(index, 0) withinSelectedCharacterRange:nullRange inTextContainer:container rectCount:&rectCount]; for (i = 0; i < rectCount; i++) { if ((location >= NSMinY(rects[i])) && (location < NSMaxY(rects[i]))) { return line + 1; } } } } return NSNotFound; } - (NoodleLineNumberMarker *)markerAtLine:(NSUInteger)line { return [_linesToMarkers objectForKey:[NSNumber numberWithUnsignedInteger:line - 1]]; } - (void)setMarkers:(NSArray *)markers { NSEnumerator *enumerator; NSRulerMarker *marker; [_linesToMarkers removeAllObjects]; [super setMarkers:nil]; enumerator = [markers objectEnumerator]; while ((marker = [enumerator nextObject]) != nil) { [self addMarker:marker]; } } - (void)addMarker:(NSRulerMarker *)aMarker { if ([aMarker isKindOfClass:[NoodleLineNumberMarker class]]) { [_linesToMarkers setObject:aMarker forKey:[NSNumber numberWithUnsignedInteger:[(NoodleLineNumberMarker *)aMarker lineNumber] - 1]]; } else { [super addMarker:aMarker]; } } - (void)removeMarker:(NSRulerMarker *)aMarker { if ([aMarker isKindOfClass:[NoodleLineNumberMarker class]]) { [_linesToMarkers removeObjectForKey:[NSNumber numberWithUnsignedInteger:[(NoodleLineNumberMarker *)aMarker lineNumber] - 1]]; } else { [super removeMarker:aMarker]; } } #pragma mark NSCoding methods #define NOODLE_FONT_CODING_KEY @"font" #define NOODLE_TEXT_COLOR_CODING_KEY @"textColor" #define NOODLE_ALT_TEXT_COLOR_CODING_KEY @"alternateTextColor" #define NOODLE_BACKGROUND_COLOR_CODING_KEY @"backgroundColor" - (id)initWithCoder:(NSCoder *)decoder { if ((self = [super initWithCoder:decoder]) != nil) { if ([decoder allowsKeyedCoding]) { _font = [[decoder decodeObjectForKey:NOODLE_FONT_CODING_KEY] retain]; _textColor = [[decoder decodeObjectForKey:NOODLE_TEXT_COLOR_CODING_KEY] retain]; _alternateTextColor = [[decoder decodeObjectForKey:NOODLE_ALT_TEXT_COLOR_CODING_KEY] retain]; _backgroundColor = [[decoder decodeObjectForKey:NOODLE_BACKGROUND_COLOR_CODING_KEY] retain]; } else { _font = [[decoder decodeObject] retain]; _textColor = [[decoder decodeObject] retain]; _alternateTextColor = [[decoder decodeObject] retain]; _backgroundColor = [[decoder decodeObject] retain]; } _linesToMarkers = [[NSMutableDictionary alloc] init]; } return self; } - (void)encodeWithCoder:(NSCoder *)encoder { [super encodeWithCoder:encoder]; if ([encoder allowsKeyedCoding]) { [encoder encodeObject:_font forKey:NOODLE_FONT_CODING_KEY]; [encoder encodeObject:_textColor forKey:NOODLE_TEXT_COLOR_CODING_KEY]; [encoder encodeObject:_alternateTextColor forKey:NOODLE_ALT_TEXT_COLOR_CODING_KEY]; [encoder encodeObject:_backgroundColor forKey:NOODLE_BACKGROUND_COLOR_CODING_KEY]; } else { [encoder encodeObject:_font]; [encoder encodeObject:_textColor]; [encoder encodeObject:_alternateTextColor]; [encoder encodeObject:_backgroundColor]; } } @end ================================================ FILE: NoodleTableView.h ================================================ // // NoodleRowSpanningTableView.h // NoodleRowSpanningTableViewTest // // Created by Paul Kim on 10/20/09. // Copyright 2009-2012 Noodlesoft, LLC. All rights reserved. // // Permission is hereby granted, free of charge, to any person // obtaining a copy of this software and associated documentation // files (the "Software"), to deal in the Software without // restriction, including without limitation the rights to use, // copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the // Software is furnished to do so, subject to the following // conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #import /* This NSTableView subclass provides a couple of neat features. Sticky Row Headers ================== This allows you to specify certain rows (it uses group rows by default) to "stick" to the top of the tableview scroll area when it is scrolled out of view. This is similar to how section headers work in UITableView in the iPhone SDK. The bulk of the implementation and delegate API are in the NSTableView-NoodleExtensions category. To enable this feature, just set the showsStickyRowHeader property. For more details, see the related blog post at http://www.noodlesoft.com/blog/2009/09/25/sticky-section-headers-in-nstableview/ Row Spanning Columns ==================== Row Spanning Columns are columns whose cells are allow to span across multiple rows. The span is determined by a contiguous section of rows that have the same object value. The cells within such a span are consolidated into a single special cell. An example of this can be seen in the Artwork column in iTunes. For any columns where you want to have this take effect, just change the column class to NoodleTableColumn and set the rowSpanningEnabled property on it. You can alternatively call -setRowSpanningEnabledForCapablyColumns on the tableview in your -awakeFromNib to enable all the NoodleTableColumns in your table in one fell swoop. For more details, see the related blog post at http://www.noodlesoft.com/blog/2009/10/20/yet-another-way-to-mimic-the-artwork-column-in-cocoa/ */ @interface NoodleTableView : NSTableView { BOOL _showsStickyRowHeader; BOOL _hasSpanningColumns; BOOL _isDrawingStickyRow; } @property (readwrite, assign) BOOL showsStickyRowHeader; #pragma mark Row Spanning methods /* Enables/disables row spanning for all NoodleTableColumns in the receiver. Note that row spanning is not enabled by default so if you want row spanning, call this from -awakeFromNib is a good idea. */ - (void)setRowSpanningEnabledForCapableColumns:(BOOL)flag; @end @class NoodleRowSpanningCell; /* Special table column that enables row spanning functionality. Just set your columns in IB to use this class and enable it by calling -setRowSpaningEnabled: */ @interface NoodleTableColumn :NSTableColumn { BOOL _spanningEnabled; NoodleRowSpanningCell *_cell; } @property (getter=isRowSpanningEnabled, setter=setRowSpanningEnabled:) BOOL rowSpanningEnabled; @end ================================================ FILE: NoodleTableView.m ================================================ // // NoodleRowSpanningTableView.m // NoodleRowSpanningTableViewTest // // Created by Paul Kim on 10/20/09. // Copyright 2009 Noodlesoft, LLC. All rights reserved. // // Permission is hereby granted, free of charge, to any person // obtaining a copy of this software and associated documentation // files (the "Software"), to deal in the Software without // restriction, including without limitation the rights to use, // copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the // Software is furnished to do so, subject to the following // conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #import "NoodleTableView.h" #import "NSTableView-NoodleExtensions.h" #import "NSImage-NoodleExtensions.h" #import "NSIndexSet-NoodleExtensions.h" /* Internal cell class. Wraps around another cell. Draws the inner cell in its "full frame" but when drawing in the tableview, draws each row sliver from the full image. */ @interface NoodleRowSpanningCell : NSCell { NSRect _fullFrame; NSCell *_cell; NSImage *_cachedImage; NSColor *_backgroundColor; NSInteger _startIndex; NSInteger _lastStartIndex; NSInteger _endIndex; NSInteger _lastEndIndex; } @property NSRect fullFrame; @property (assign) NSCell *cell; @property (copy) NSColor *backgroundColor; @property NSInteger startIndex; @property NSInteger endIndex; @end @implementation NoodleRowSpanningCell @synthesize fullFrame = _fullFrame; @synthesize cell = _cell; @synthesize backgroundColor = _backgroundColor; @synthesize startIndex = _startIndex; @synthesize endIndex = _endIndex; - (void)_clearOutCaches { _startIndex = -1; _endIndex = -1; _lastStartIndex = -1; _lastEndIndex = -1; _cell = nil; } - (void)dealloc { [self _clearOutCaches]; [_backgroundColor release]; [_cachedImage release]; [super dealloc]; } - (id)copyWithZone:(NSZone *)zone { NoodleRowSpanningCell *copy; copy = [super copyWithZone:zone]; // super will copy the pointer across (via NSCopyObject()) but we need to retain or copy the actual instances copy->_cachedImage = [_cachedImage copy]; copy->_backgroundColor = [_backgroundColor copy]; return copy; } - (void)drawWithFrame:(NSRect)cellFrame inView:(NSView *)controlView { // Draw the full span of the cell into a cached image and then pull out the correct sliver as needed if ((_startIndex != _lastStartIndex) || (_endIndex != _lastEndIndex) || (_cachedImage == nil)) { // If the indices have changed, we are dealing with a new span so recache the cell's full image NSAffineTransform *transform; NSColor *color; if ((_cachedImage == nil) || !NSEqualSizes(_fullFrame.size, [_cachedImage size])) { [_cachedImage release]; _cachedImage = [[NSImage alloc] initWithSize:_fullFrame.size]; [_cachedImage setFlipped:[controlView isFlipped]]; } [_cachedImage lockFocus]; transform = [NSAffineTransform transform]; [transform translateXBy:-NSMinX(_fullFrame) yBy:-NSMinY(_fullFrame)]; [transform concat]; color = _backgroundColor; if (color == nil) { color = [NSColor clearColor]; } [color set]; NSRectFill(_fullFrame); [_cell drawWithFrame:_fullFrame inView:controlView]; [_cachedImage unlockFocus]; _lastStartIndex = _startIndex; _lastEndIndex = _endIndex; } // Now draw the sliver for the current row in the right spot [_cachedImage drawAdjustedInRect:cellFrame fromRect:NSMakeRect(NSMinX(cellFrame) - NSMinX(_fullFrame), NSMinY(cellFrame) - NSMinY(_fullFrame), NSWidth(cellFrame), NSHeight(cellFrame)) operation:NSCompositeSourceOver fraction:1.0]; } @end @implementation NoodleTableColumn : NSTableColumn @synthesize rowSpanningEnabled = _spanningEnabled; #define SPANNING_ENABLED_KEY @"spanningEnabled" - (void)encodeWithCoder:(NSCoder *)encoder { [super encodeWithCoder:encoder]; if ([encoder allowsKeyedCoding]) { [encoder encodeObject:[NSNumber numberWithBool:_spanningEnabled] forKey:SPANNING_ENABLED_KEY]; } else { [encoder encodeObject:[NSNumber numberWithBool:_spanningEnabled]]; } } - (id)initWithCoder:(NSCoder *)decoder { if ((self = [super initWithCoder:decoder]) != nil) { id value; if ([decoder allowsKeyedCoding]) { value = [decoder decodeObjectForKey:SPANNING_ENABLED_KEY]; } else { value = [decoder decodeObject]; } if (value != nil) { _spanningEnabled = [value boolValue]; } } return self; } - (void)dealloc { [_cell release]; [super dealloc]; } - (NoodleRowSpanningCell *)spanningCell { if (_cell == nil) { _cell = [[NoodleRowSpanningCell alloc] initTextCell:@""]; } return _cell; } @end @implementation NoodleTableView @synthesize showsStickyRowHeader = _showsStickyRowHeader; #pragma mark NSCoding methods #define SHOWS_STICKY_ROW_HEADER_KEY @"showsStickyRowHeader" - (void)encodeWithCoder:(NSCoder *)encoder { [super encodeWithCoder:encoder]; if ([encoder allowsKeyedCoding]) { [encoder encodeObject:[NSNumber numberWithBool:_showsStickyRowHeader] forKey:SHOWS_STICKY_ROW_HEADER_KEY]; } else { [encoder encodeObject:[NSNumber numberWithBool:_showsStickyRowHeader]]; } } - (id)initWithCoder:(NSCoder *)decoder { if ((self = [super initWithCoder:decoder]) != nil) { id value; if ([decoder allowsKeyedCoding]) { value = [decoder decodeObjectForKey:SHOWS_STICKY_ROW_HEADER_KEY]; } else { value = [decoder decodeObject]; } _showsStickyRowHeader = [value boolValue]; for (NSTableColumn *column in [self tableColumns]) { if ([column isKindOfClass:[NoodleTableColumn class]]) { _hasSpanningColumns = YES; break; } } } return self; } - (void)addTableColumn:(NSTableColumn *)column { [super addTableColumn:column]; if ([column isKindOfClass:[NoodleTableColumn class]]) { _hasSpanningColumns = YES; } } - (void)removeTableColumn:(NSTableColumn *)column { [super removeTableColumn:column]; for (NSTableColumn *column in [self tableColumns]) { if ([column isKindOfClass:[NoodleTableColumn class]]) { _hasSpanningColumns = YES; break; } } } #pragma mark Row Spanning methods - (void)setRowSpanningEnabledForCapableColumns:(BOOL)flag { for (id column in [self tableColumns]) { if ([column respondsToSelector:@selector(setRowSpanningEnabled:)]) { [column setRowSpanningEnabled:flag]; } } } // Does the actual work of drawing the grid. Originally, was trying to set the grid mask and calling super's // -drawGridInClipRect: method on specific regions to get the effect I wanted but all the setting of the masks // ended up sucking down CPU cycles as it got into a loop queueing up tons of redraw requests. - (void)_drawGrid:(NSUInteger)gridMask inClipRect:(NSRect)aRect { NSRect rect; [[self gridColor] set]; if ((gridMask & NSTableViewSolidHorizontalGridLineMask) != 0) { NSRange range; NSInteger i; range = [self rowsInRect:aRect]; for (i = range.location; i < NSMaxRange(range); i++) { rect = [self rectOfRow:i]; if (NSMaxY(rect) <= NSMaxY(aRect)) { rect.origin.x = NSMinX(aRect); rect.size.width = NSWidth(aRect); rect.origin.y -= 0.5; [NSBezierPath strokeLineFromPoint:NSMakePoint(NSMinX(rect), NSMaxY(rect)) toPoint:NSMakePoint(NSMaxX(rect), NSMaxY(rect))]; } } } if ((gridMask & NSTableViewSolidVerticalGridLineMask) != 0) { NoodleIndexSetEnumerator *enumerator; NSInteger i; enumerator = [[self columnIndexesInRect:aRect] indexEnumerator]; while ((i = [enumerator nextIndex]) != NSNotFound) { rect = [self rectOfColumn:i]; if (NSMaxX(rect) <= NSMaxX(aRect)) { rect.origin.y = NSMinY(aRect); rect.size.height = NSHeight(aRect); rect.origin.x -= 0.5; [NSBezierPath strokeLineFromPoint:NSMakePoint(NSMaxX(rect), NSMinY(rect)) toPoint:NSMakePoint(NSMaxX(rect), NSMaxY(rect))]; } } } } - (void)drawGridInClipRect:(NSRect)aRect { NSUInteger origGridMask; origGridMask = [self gridStyleMask]; if (_hasSpanningColumns && ((origGridMask & NSTableViewSolidHorizontalGridLineMask) != 0)) { // Rules: // - No spanning cell should have grid lines within it. Only at the bottom. // - Non-spanning cells inherit their grid lines from the closest spanning cell to the left (or to the right // if there are none to the left. NSRange range, spanRange; NSInteger columnIndex, endColumnIndex, startColumnIndex, row; NSMutableIndexSet *columnIndexes; NoodleIndexSetEnumerator *enumerator; NSRect topLeft, bottomRight, rect; // Grab the indexes of all the spanning columns. columnIndex = 0; columnIndexes = [NSMutableIndexSet indexSet]; for (NSTableColumn *column in [self tableColumns]) { if ([column isRowSpanningEnabled]) { [columnIndexes addIndex:columnIndex]; } columnIndex++; } // Hard to explain but we calculate regions going from left to right, defining regions horizontally // from one spanning column to the next and vertically by row spans. We first draw the non-horizontal // grid lines within a span (taking into account precedence rules concerning columns as noted above). // Then we draw the horizontal grid line at the bottom of a span. We are trying to find the maximal // regions to send to the grid drawing routine as doing it cell by cell incurs a bit of overhead. startColumnIndex = 0; enumerator = [columnIndexes indexEnumerator]; while ((columnIndex = [enumerator nextIndex]) != NSNotFound) { // This column is the right edge of this region (which is up to the next spanning column) endColumnIndex = [columnIndexes indexGreaterThanIndex:columnIndex]; if (endColumnIndex == NSNotFound) { endColumnIndex = [self numberOfColumns] - 1; } else { endColumnIndex--; } range = [self rowsInRect:aRect]; row = range.location; while (row < NSMaxRange(range)) { spanRange = [self rangeOfRowSpanAtColumn:columnIndex row:row]; // Get the rects of the top left of our region (the start column and start row of the span) // to the bottom right (the end column and the row in the span just before the last one). topLeft = [self frameOfCellAtColumn:startColumnIndex row:spanRange.location]; bottomRight = [self frameOfCellAtColumn:endColumnIndex row:NSMaxRange(spanRange) - 2]; rect = NSIntersectionRect(aRect, NSUnionRect(topLeft, bottomRight)); if (spanRange.length > 1) { // Draw span region without horizontal grid lines [self _drawGrid:origGridMask & ~NSTableViewSolidHorizontalGridLineMask inClipRect:rect]; // Now, calculate the region at the last row of the span topLeft = [self frameOfCellAtColumn:startColumnIndex row:NSMaxRange(spanRange) - 1]; bottomRight = [self frameOfCellAtColumn:endColumnIndex row:NSMaxRange(spanRange) - 1]; // Draw bottom of span with horizontal grid lines rect = NSIntersectionRect(aRect, NSUnionRect(topLeft, bottomRight) ); [self _drawGrid:origGridMask inClipRect:rect]; } else { // Not a span row or just a single row. Either way, draw with horizontal grid lines [self _drawGrid:origGridMask inClipRect:rect]; } // Advance to the next row span row = NSMaxRange(spanRange); } // Advance to the next span column region startColumnIndex = endColumnIndex + 1; } } else { // We only need the special logic when we have row spanning columns and drawing horizontal lines. Otherwise, // just call super. [super drawGridInClipRect:aRect]; } } - (NSCell *)preparedCellAtColumn:(NSInteger)columnIndex row:(NSInteger)rowIndex { NSTableColumn *column; column = [[self tableColumns] objectAtIndex:columnIndex]; if (!_isDrawingStickyRow && [column isRowSpanningEnabled]) { NSRange range; range = [self rangeOfRowSpanAtColumn:columnIndex row:rowIndex]; if (range.length >= 1) { // Here is where we insert our special cell for row spanning behavior NoodleRowSpanningCell *spanningCell; NSCell *cell; NSInteger start, end; BOOL wasSelected; start = range.location; end = NSMaxRange(range) - 1; // Want to draw cell in its unhighlighted state since spanning cells aren't selectable. Unfortuantely, // can't just setHighlight:NO on it because NSTableView sets other attributes (like text color). // Instead, we deselect the row, grab the cell, then set it back (if it was selected before). wasSelected = [self isRowSelected:start]; [self deselectRow:start]; cell = [super preparedCellAtColumn:columnIndex row:start]; if (wasSelected) { [self selectRowIndexes:[NSIndexSet indexSetWithIndex:start] byExtendingSelection:YES]; } spanningCell = [column spanningCell]; [spanningCell setCell:cell]; // The full frame is the rect encompassing the first and last rows of the span. [spanningCell setFullFrame:NSUnionRect([self frameOfCellAtColumn:columnIndex row:start], [self frameOfCellAtColumn:columnIndex row:end])]; [spanningCell setStartIndex:start]; [spanningCell setEndIndex:end]; [spanningCell setBackgroundColor:[self backgroundColor]]; return spanningCell; } } return [super preparedCellAtColumn:columnIndex row:rowIndex]; } - (void)mouseDown:(NSEvent *)event { if (_hasSpanningColumns) { // Eat up any clicks on spanning cells. In the future, may want to consider having clicks select the // first row in the span (like when clicking on the artwork in iTunes). NSPoint point; NSInteger columnIndex; NSTableColumn *column; point = [event locationInWindow]; point = [self convertPointFromBase:point]; columnIndex = [self columnAtPoint:point]; column = [[self tableColumns] objectAtIndex:columnIndex]; if ([column isRowSpanningEnabled]) { return; } } [super mouseDown:event]; } - (void)drawRect:(NSRect)dirtyRect { [super drawRect:dirtyRect]; // All that needs to be done to enable the sticky row header functionality (bulk of the work // done in the NSTableView category) if ([self showsStickyRowHeader]) { [self drawStickyRowHeader]; } if (_hasSpanningColumns) { // Clean up any cached data. Don't want to keep stale cache data around. for (NSTableColumn *column in [self tableColumns]) { if ([column isRowSpanningEnabled]) { [[column spanningCell] _clearOutCaches]; } } } } - (void)drawStickyRow:(NSInteger)row clipRect:(NSRect)clipRect { _isDrawingStickyRow = YES; [super drawStickyRow:row clipRect:clipRect]; _isDrawingStickyRow = NO; } @end ================================================ FILE: README.md ================================================ NoodleKit ========= This is a random collection of classes and categories that I am making public. Most of this code has been posted on my blog: The project is primarily structured to build a framework. There are targets for various examples showing how the different classes are used. Some of the examples also contain a Read Me file so check those out for more details on the specific classes. This framework is meant to be built/used on 10.6 and later and should support 64-bit. This code is maintained at . Please post any issues and requests there. What nifty stuff is in here? ---------------------------- #### NSObject-NoodlePerformWhenIdle NSObject category for calling a method when the user has been idle for the specified amount of time. Useful for putting up non-critical alerts and purging memory caches, among other things. #### NSIndexSet-NoodleExtensions Provides an enumerator to cycle through the indexes in an NSIndexSet. Not featured directly in any blog article but used for the "Row Spanning Columns" feature (see below). #### NSTimer-NoodleExtensions Allows you to create timers that treat the fire date as absolute. Normally, NSTimer will adjust the time if you put the machine to sleep. This category makes it such that it will fire on the date you told it to originally. #### NoodleGlue Little class that allows you to plug a block into some code that requires a target/selector. Check the NSTimer category too see how it can be used. #### NSObject-NoodleCleanupGlue A category on NSObject that allows you to add a block that will be executed when the object is deallocated. It is based on NoodleGlue and it is lumped into the same source file with it. #### NSResponder-NoodleModalExtensions NSResponder category providing methods that will dismiss a dialog and return the proper code for whatever button (OK/Cancel) was clicked. Just hook your dialog buttons up to these methods in IB and you're set. Alleviates having to write that glue code every time. #### NSImage-NoodleExtensions NSImage category providing methods to draw NSImages with correct orientation and scaling regardless of the flipped status of the image or the context being drawn into. #### NoodleCustomImageRep NSImageRep subclass that allows you to specify the drawing via a block. Handy for drawing images without having to create a new subclass of NSImageRep. #### NSWindow-NoodleEffects Provides a basic zoom effect for NSWindow. #### NoodleLineNumberView, NoodleLineNumberMarker Adds line numbers (and corresponding markers) to NSTextView. #### NSTableView-NoodleExtensions, NoodleTableView, NoodleIPhoneTableView The NSTableView category and NoodleTableView are a consolidation of the sticky row header tableview and row spanning tableview featured on my blog. #####Sticky Row Headers An NSTableView category that does sticky row headers, like with UITableView on the iPhone. NoodleTableView implements the basic hooks to enable the feature while NoodleIPhoneTableView simulates the look and feel of UITableView. #####Row Spanning Columns Certain columns can be made to allow their cells to span across multiple rows. These spans are determined by contiguous sections of rows with the same object value. You can enable this in NoodleTableView by using NoodleTableColumns for any columns you want to exhibit this behavior. Remember to enable the property on each column or call -setRowSpanningEnabledForCapableColumns: to enable it for all NoodleTableColumns in the tableview. License ------- Copyright (c) 2007-2012 Noodlesoft, LLC. All Rights Reserved. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: version.plist ================================================ BuildVersion 2 CFBundleShortVersionString 1.0 CFBundleVersion 1 ProjectName DevToolsWizardTemplates SourceVersion 15920000