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
================================================
106010J8698231038.35461.00YESperformMiniaturize:37arrangeInFront:39print:86runPageLayout:87clearRecentDocuments:127orderFrontStandardAboutPanel:142performClose:193toggleContinuousSpellChecking:222undo:223copy:224checkSpelling:225paste:226stopSpeaking:227cut:228showGuessPanel:230redo:231selectAll:232startSpeaking:233delete:235performZoom:240performFindPanelAction:241centerSelectionInVisibleArea:245toggleGrammarChecking:347toggleSmartInsertDelete:355toggleAutomaticQuoteSubstitution:356toggleAutomaticLinkDetection:357saveDocument:362saveDocumentAs:363revertDocumentToSaved:364runToolbarCustomizationPalette:365toggleToolbarShown:366hide:367hideOtherApplications:368unhideAllApplications:370newDocument:373openDocument:374addFontTrait:421addFontTrait:422modifyFont:423orderFrontFontPanel:424modifyFont:425raiseBaseline:426lowerBaseline:427copyFont:428subscript:429superscript:430tightenKerning:431underline:432orderFrontColorPanel:433useAllLigatures:434loosenKerning:435pasteFont:436unscript:437useStandardKerning:438useStandardLigatures:439turnOffLigatures:440turnOffKerning:441terminate:449toggleAutomaticSpellingCorrection:456orderFrontSubstitutionsPanel:458toggleAutomaticDashSubstitution:461toggleAutomaticTextReplacement:463uppercaseWord:464capitalizeWord:467lowercaseWord:468pasteAsPlainText:486performFindPanelAction:487performFindPanelAction:488performFindPanelAction:489showHelp:493delegate495alignCenter:518pasteRuler:519toggleRuler:520alignRight:521copyRuler:522alignJustified:523alignLeft:524makeBaseWritingDirectionNatural:525makeBaseWritingDirectionLeftToRight:526makeBaseWritingDirectionRightToLeft:527makeTextWritingDirectionNatural:528makeTextWritingDirectionLeftToRight:529makeTextWritingDirectionRightToLeft:530window532imageView545switchImage:546timeLabel553label554redraw:559redrawIndicator569recacheIndicator570YES0YES-2File's Owner-1First Responder-3Application29YES19YES56YES217YES83YES81YES7580787282124YES77737911274125YES126205YES202198207214199203197206215218YES216YES200YES219201204220YES21321022120820957YES58134150136144129143236131YES14914513024YES92523923295YES296YES297298211YES212YES195196346348YES349YES350351354371YES372YES375YES376YES377YES388YES389390391392393394395396397YES398YES399YES400401402403404405YES406407408409410411YES412413414415YES416417418419420450YES451YES452453454457459460462465466485490YES491YES492494Image Lab App Delegate496YES497YES498499500501502503YES504505506507508YES509510511512513514515516517533YES534560YES557YES558539YES540YES541YES550549548547544543542551YES552571YES567YES568565YES566YESYES-3.IBPluginDependency112.IBPluginDependency112.ImportedFromIB2124.IBPluginDependency124.ImportedFromIB2125.IBPluginDependency125.ImportedFromIB2125.editorWindowContentRectSynchronizationRect126.IBPluginDependency126.ImportedFromIB2129.IBPluginDependency129.ImportedFromIB2130.IBPluginDependency130.ImportedFromIB2130.editorWindowContentRectSynchronizationRect131.IBPluginDependency131.ImportedFromIB2134.IBPluginDependency134.ImportedFromIB2136.IBPluginDependency136.ImportedFromIB2143.IBPluginDependency143.ImportedFromIB2144.IBPluginDependency144.ImportedFromIB2145.IBPluginDependency145.ImportedFromIB2149.IBPluginDependency149.ImportedFromIB2150.IBPluginDependency150.ImportedFromIB219.IBPluginDependency19.ImportedFromIB2195.IBPluginDependency195.ImportedFromIB2196.IBPluginDependency196.ImportedFromIB2197.IBPluginDependency197.ImportedFromIB2198.IBPluginDependency198.ImportedFromIB2199.IBPluginDependency199.ImportedFromIB2200.IBEditorWindowLastContentRect200.IBPluginDependency200.ImportedFromIB2200.editorWindowContentRectSynchronizationRect201.IBPluginDependency201.ImportedFromIB2202.IBPluginDependency202.ImportedFromIB2203.IBPluginDependency203.ImportedFromIB2204.IBPluginDependency204.ImportedFromIB2205.IBEditorWindowLastContentRect205.IBPluginDependency205.ImportedFromIB2205.editorWindowContentRectSynchronizationRect206.IBPluginDependency206.ImportedFromIB2207.IBPluginDependency207.ImportedFromIB2208.IBPluginDependency208.ImportedFromIB2209.IBPluginDependency209.ImportedFromIB2210.IBPluginDependency210.ImportedFromIB2211.IBPluginDependency211.ImportedFromIB2212.IBPluginDependency212.ImportedFromIB2212.editorWindowContentRectSynchronizationRect213.IBPluginDependency213.ImportedFromIB2214.IBPluginDependency214.ImportedFromIB2215.IBPluginDependency215.ImportedFromIB2216.IBPluginDependency216.ImportedFromIB2217.IBPluginDependency217.ImportedFromIB2218.IBPluginDependency218.ImportedFromIB2219.IBPluginDependency219.ImportedFromIB2220.IBEditorWindowLastContentRect220.IBPluginDependency220.ImportedFromIB2220.editorWindowContentRectSynchronizationRect221.IBPluginDependency221.ImportedFromIB223.IBPluginDependency23.ImportedFromIB2236.IBPluginDependency236.ImportedFromIB2239.IBPluginDependency239.ImportedFromIB224.IBEditorWindowLastContentRect24.IBPluginDependency24.ImportedFromIB224.editorWindowContentRectSynchronizationRect29.IBEditorWindowLastContentRect29.IBPluginDependency29.ImportedFromIB229.WindowOrigin29.editorWindowContentRectSynchronizationRect295.IBPluginDependency296.IBEditorWindowLastContentRect296.IBPluginDependency296.editorWindowContentRectSynchronizationRect297.IBPluginDependency298.IBPluginDependency346.IBPluginDependency346.ImportedFromIB2348.IBPluginDependency348.ImportedFromIB2349.IBEditorWindowLastContentRect349.IBPluginDependency349.ImportedFromIB2349.editorWindowContentRectSynchronizationRect350.IBPluginDependency350.ImportedFromIB2351.IBPluginDependency351.ImportedFromIB2354.IBPluginDependency354.ImportedFromIB2371.IBEditorWindowLastContentRect371.IBPluginDependency371.IBWindowTemplateEditedContentRect371.NSWindowTemplate.visibleAtLaunch371.editorWindowContentRectSynchronizationRect371.windowTemplate.hasMinSize371.windowTemplate.maxSize371.windowTemplate.minSize372.IBPluginDependency375.IBPluginDependency376.IBEditorWindowLastContentRect376.IBPluginDependency377.IBPluginDependency388.IBEditorWindowLastContentRect388.IBPluginDependency389.IBPluginDependency390.IBPluginDependency391.IBPluginDependency392.IBPluginDependency393.IBPluginDependency394.IBPluginDependency395.IBPluginDependency396.IBPluginDependency397.IBPluginDependency398.IBPluginDependency399.IBPluginDependency400.IBPluginDependency401.IBPluginDependency402.IBPluginDependency403.IBPluginDependency404.IBPluginDependency405.IBPluginDependency406.IBPluginDependency407.IBPluginDependency408.IBPluginDependency409.IBPluginDependency410.IBPluginDependency411.IBPluginDependency412.IBPluginDependency413.IBPluginDependency414.IBPluginDependency415.IBPluginDependency416.IBPluginDependency417.IBPluginDependency418.IBPluginDependency419.IBPluginDependency450.IBPluginDependency451.IBEditorWindowLastContentRect451.IBPluginDependency452.IBPluginDependency453.IBPluginDependency454.IBPluginDependency457.IBPluginDependency459.IBPluginDependency460.IBPluginDependency462.IBPluginDependency465.IBPluginDependency466.IBPluginDependency485.IBPluginDependency490.IBPluginDependency491.IBEditorWindowLastContentRect491.IBPluginDependency492.IBPluginDependency496.IBPluginDependency497.IBEditorWindowLastContentRect497.IBPluginDependency498.IBPluginDependency499.IBPluginDependency5.IBPluginDependency5.ImportedFromIB2500.IBPluginDependency501.IBPluginDependency502.IBPluginDependency503.IBPluginDependency504.IBPluginDependency505.IBPluginDependency506.IBPluginDependency507.IBPluginDependency508.IBEditorWindowLastContentRect508.IBPluginDependency509.IBPluginDependency510.IBPluginDependency511.IBPluginDependency512.IBPluginDependency513.IBPluginDependency514.IBPluginDependency515.IBPluginDependency516.IBPluginDependency517.IBPluginDependency533.CustomClassName533.IBPluginDependency533.IBViewBoundsToFrameTransform534.IBPluginDependency539.IBPluginDependency540.IBPluginDependency541.IBEditorWindowLastContentRect541.IBPluginDependency542.IBPluginDependency543.IBPluginDependency544.IBPluginDependency547.IBPluginDependency548.IBPluginDependency549.IBPluginDependency550.IBPluginDependency551.IBPluginDependency551.IBViewBoundsToFrameTransform552.IBPluginDependency557.IBPluginDependency557.IBViewBoundsToFrameTransform558.IBPluginDependency56.IBPluginDependency56.ImportedFromIB2565.IBPluginDependency566.IBPluginDependency567.IBPluginDependency567.IBViewBoundsToFrameTransform568.IBPluginDependency57.IBEditorWindowLastContentRect57.IBPluginDependency57.ImportedFromIB257.editorWindowContentRectSynchronizationRect58.IBPluginDependency58.ImportedFromIB272.IBPluginDependency72.ImportedFromIB273.IBPluginDependency73.ImportedFromIB274.IBPluginDependency74.ImportedFromIB275.IBPluginDependency75.ImportedFromIB277.IBPluginDependency77.ImportedFromIB278.IBPluginDependency78.ImportedFromIB279.IBPluginDependency79.ImportedFromIB280.IBPluginDependency80.ImportedFromIB281.IBEditorWindowLastContentRect81.IBPluginDependency81.ImportedFromIB281.editorWindowContentRectSynchronizationRect82.IBPluginDependency82.ImportedFromIB283.IBPluginDependency83.ImportedFromIB292.IBPluginDependency92.ImportedFromIB2YEScom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugin{{522, 812}, {146, 23}}com.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugin{{436, 809}, {64, 6}}com.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugin{{753, 187}, {275, 113}}com.apple.InterfaceBuilder.CocoaPlugin{{608, 612}, {275, 83}}com.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugin{{547, 180}, {254, 283}}com.apple.InterfaceBuilder.CocoaPlugin{{187, 434}, {243, 243}}com.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugin{{608, 612}, {167, 43}}com.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugin{{753, 217}, {238, 103}}com.apple.InterfaceBuilder.CocoaPlugin{{608, 612}, {241, 103}}com.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.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.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugin{{746, 287}, {220, 133}}com.apple.InterfaceBuilder.CocoaPlugin{{608, 612}, {215, 63}}com.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.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.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugin{{591, 420}, {83, 43}}com.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugin{{523, 2}, {178, 283}}com.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugin{{753, 197}, {170, 63}}com.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugin{{725, 289}, {246, 23}}com.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugin{{674, 260}, {204, 183}}com.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugin{{878, 180}, {164, 173}}com.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPluginTimedImageViewcom.apple.InterfaceBuilder.CocoaPluginAUGIAABBkAAAAcom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugin{{307, 633}, {262, 143}}com.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPluginP4AAAL+AAABDLgAAwuQAAAcom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPluginP4AAAL+AAABCrAAAwsAAAAcom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPluginP4AAAL+AAABDGgAAwlgAAAcom.apple.InterfaceBuilder.CocoaPlugin{{392, 653}, {201, 183}}com.apple.InterfaceBuilder.CocoaPlugin{{23, 794}, {245, 183}}com.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugin{{452, 109}, {196, 203}}com.apple.InterfaceBuilder.CocoaPlugin{{145, 474}, {199, 203}}com.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPluginYESYESYESYES571YESImageLabAppDelegateNSObjectYESYESredraw:switchImage:YESididYESYESredraw:switchImage:YESredraw:idswitchImage:idYESYESimageViewrecacheIndicatortimeLabelwindowYESNSImageViewNSButtonNSTextFieldNSWindowYESYESimageViewrecacheIndicatortimeLabelwindowYESimageViewNSImageViewrecacheIndicatorNSButtontimeLabelNSTextFieldwindowNSWindowIBProjectSourceExamples/ImageLab/ImageLabAppDelegate.hNSObjectIBProjectSourceNSObject-NoodlePerformWhenIdle.hNSObjectIBProjectSourceNSTableView-NoodleExtensions.hNSObjectIBProjectSourceNoodleGlue.hNSResponderYESYEScancelModal:confirmModal:YESididYESYEScancelModal:confirmModal:YEScancelModal:idconfirmModal:idIBProjectSourceNSResponder-NoodleModalExtensions.hNSTableViewscrollToStickyRow:idscrollToStickyRow:scrollToStickyRow:idNSWindowYESYEScancelModal:confirmModal:YESididYESYEScancelModal:confirmModal:YEScancelModal:idconfirmModal:idNSWindowIBProjectSourceNSWindow-NoodleEffects.hTimedImageViewNSImageViewYESYESlabelredrawIndicatorYESididYESYESlabelredrawIndicatorYESlabelidredrawIndicatoridIBProjectSourceExamples/ImageLab/TimedImageView.hYESNSActionCellNSCellIBFrameworkSourceAppKit.framework/Headers/NSActionCell.hNSApplicationNSResponderIBFrameworkSourceAppKit.framework/Headers/NSApplication.hNSApplicationIBFrameworkSourceAppKit.framework/Headers/NSApplicationScripting.hNSApplicationIBFrameworkSourceAppKit.framework/Headers/NSColorPanel.hNSApplicationIBFrameworkSourceAppKit.framework/Headers/NSHelpManager.hNSApplicationIBFrameworkSourceAppKit.framework/Headers/NSPageLayout.hNSApplicationIBFrameworkSourceAppKit.framework/Headers/NSUserInterfaceItemSearching.hNSBrowserNSControlIBFrameworkSourceAppKit.framework/Headers/NSBrowser.hNSButtonNSControlIBFrameworkSourceAppKit.framework/Headers/NSButton.hNSButtonCellNSActionCellIBFrameworkSourceAppKit.framework/Headers/NSButtonCell.hNSCellNSObjectIBFrameworkSourceAppKit.framework/Headers/NSCell.hNSControlNSViewIBFrameworkSourceAppKit.framework/Headers/NSControl.hNSDocumentNSObjectYESYESprintDocument:revertDocumentToSaved:runPageLayout:saveDocument:saveDocumentAs:saveDocumentTo:YESididididididYESYESprintDocument:revertDocumentToSaved:runPageLayout:saveDocument:saveDocumentAs:saveDocumentTo:YESprintDocument:idrevertDocumentToSaved:idrunPageLayout:idsaveDocument:idsaveDocumentAs:idsaveDocumentTo:idIBFrameworkSourceAppKit.framework/Headers/NSDocument.hNSDocumentIBFrameworkSourceAppKit.framework/Headers/NSDocumentScripting.hNSDocumentControllerNSObjectYESYESclearRecentDocuments:newDocument:openDocument:saveAllDocuments:YESididididYESYESclearRecentDocuments:newDocument:openDocument:saveAllDocuments:YESclearRecentDocuments:idnewDocument:idopenDocument:idsaveAllDocuments:idIBFrameworkSourceAppKit.framework/Headers/NSDocumentController.hNSFontManagerNSObjectIBFrameworkSourceAppKit.framework/Headers/NSFontManager.hNSFormatterNSObjectIBFrameworkSourceFoundation.framework/Headers/NSFormatter.hNSImageCellNSCellIBFrameworkSourceAppKit.framework/Headers/NSImageCell.hNSImageViewNSControlIBFrameworkSourceAppKit.framework/Headers/NSImageView.hNSMatrixNSControlIBFrameworkSourceAppKit.framework/Headers/NSMatrix.hNSMenuNSObjectIBFrameworkSourceAppKit.framework/Headers/NSMenu.hNSMenuItemNSObjectIBFrameworkSourceAppKit.framework/Headers/NSMenuItem.hNSMenuItemCellNSButtonCellIBFrameworkSourceAppKit.framework/Headers/NSMenuItemCell.hNSMovieViewNSViewIBFrameworkSourceAppKit.framework/Headers/NSMovieView.hNSObjectIBFrameworkSourceAppKit.framework/Headers/NSAccessibility.hNSObjectNSObjectNSObjectNSObjectNSObjectIBFrameworkSourceAppKit.framework/Headers/NSDictionaryController.hNSObjectIBFrameworkSourceAppKit.framework/Headers/NSDragging.hNSObjectNSObjectIBFrameworkSourceAppKit.framework/Headers/NSFontPanel.hNSObjectIBFrameworkSourceAppKit.framework/Headers/NSKeyValueBinding.hNSObjectNSObjectIBFrameworkSourceAppKit.framework/Headers/NSNibLoading.hNSObjectIBFrameworkSourceAppKit.framework/Headers/NSOutlineView.hNSObjectIBFrameworkSourceAppKit.framework/Headers/NSPasteboard.hNSObjectIBFrameworkSourceAppKit.framework/Headers/NSSavePanel.hNSObjectIBFrameworkSourceAppKit.framework/Headers/NSTableView.hNSObjectIBFrameworkSourceAppKit.framework/Headers/NSToolbarItem.hNSObjectIBFrameworkSourceAppKit.framework/Headers/NSView.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSArchiver.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSClassDescription.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSError.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSFileManager.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSKeyValueCoding.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSKeyValueObserving.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSKeyedArchiver.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSObject.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSObjectScripting.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSPortCoder.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSRunLoop.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSScriptClassDescription.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSScriptKeyValueCoding.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSScriptObjectSpecifiers.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSScriptWhoseTests.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSThread.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSURL.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSURLConnection.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSURLDownload.hNSObjectIBFrameworkSourceQuartzCore.framework/Headers/CAAnimation.hNSObjectIBFrameworkSourceQuartzCore.framework/Headers/CALayer.hNSObjectIBFrameworkSourceQuartzCore.framework/Headers/CIImageProvider.hNSPopUpButtonNSButtonIBFrameworkSourceAppKit.framework/Headers/NSPopUpButton.hNSPopUpButtonCellNSMenuItemCellIBFrameworkSourceAppKit.framework/Headers/NSPopUpButtonCell.hNSResponderIBFrameworkSourceAppKit.framework/Headers/NSInterfaceStyle.hNSResponderNSObjectIBFrameworkSourceAppKit.framework/Headers/NSResponder.hNSTableViewNSControlNSTextNSViewIBFrameworkSourceAppKit.framework/Headers/NSText.hNSTextFieldNSControlIBFrameworkSourceAppKit.framework/Headers/NSTextField.hNSTextFieldCellNSActionCellIBFrameworkSourceAppKit.framework/Headers/NSTextFieldCell.hNSTextViewNSTextIBFrameworkSourceAppKit.framework/Headers/NSTextView.hNSViewIBFrameworkSourceAppKit.framework/Headers/NSClipView.hNSViewNSViewIBFrameworkSourceAppKit.framework/Headers/NSRulerView.hNSViewNSResponderNSWindowIBFrameworkSourceAppKit.framework/Headers/NSDrawer.hNSWindowNSResponderIBFrameworkSourceAppKit.framework/Headers/NSWindow.hNSWindowIBFrameworkSourceAppKit.framework/Headers/NSWindowScripting.h0IBCocoaFrameworkcom.apple.InterfaceBuilder.CocoaPlugin.macosxcom.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3YES../../../NoodleKit.xcodeproj3YESYESNSMenuCheckmarkNSMenuMixedStateNSStatusAvailabletestYES{9, 8}{7, 2}{16, 16}{64, 64}
================================================
FILE: Examples/ImageLab/ImageLab-Info.plist
================================================
CFBundleDevelopmentRegionEnglishCFBundleExecutable${EXECUTABLE_NAME}CFBundleIdentifiercom.yourcompany.${PRODUCT_NAME:rfc1034identifier}CFBundleInfoDictionaryVersion6.0CFBundlePackageTypeAPPLCFBundleShortVersionString1.0CFBundleSignature????CFBundleVersion1LSMinimumSystemVersion${MACOSX_DEPLOYMENT_TARGET}NSMainNibFileMainMenuNSPrincipalClassNSApplication
================================================
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
================================================
106011D50b21821138.32568.00com.apple.InterfaceBuilder.CocoaPlugin2182YESNSViewNSMenuNSScrollViewNSWindowTemplateNSMenuItemNSTextViewNSScrollerNSCustomObjectYEScom.apple.InterfaceBuilder.CocoaPluginPluginDependencyRecalculationVersionYESNSApplicationFirstResponderNSApplicationAMainMenuYESLine View Test10485762147483647NSImageNSMenuCheckmarkNSImageNSMenuMixedStatesubmenuAction:Line View TestYESAbout Line View Test2147483647YESYES10485762147483647Preferences…,10485762147483647YESYES10485762147483647Services10485762147483647submenuAction:ServicesYES_NSServicesMenuYESYES10485762147483647Hide Line View Testh10485762147483647Hide Othersh15728642147483647Show All10485762147483647YESYES10485762147483647Quit Line View Testq10485762147483647_NSAppleMenuFile10485762147483647submenuAction:FileYESNewn10485762147483647Open…o10485762147483647Open Recent10485762147483647submenuAction:Open RecentYESClear Menu10485762147483647_NSRecentDocumentsMenuYESYES10485762147483647Closew10485762147483647Saves10485762147483647Save As…S11796482147483647Revert to Saved2147483647YESYES10485762147483647Page Setup...P11796482147483647Print…p10485762147483647Edit10485762147483647submenuAction:EditYESUndoz10485762147483647RedoZ11796482147483647YESYES10485762147483647Cutx10485762147483647Copyc10485762147483647Pastev10485762147483647Delete10485762147483647Select Alla10485762147483647YESYES10485762147483647Find10485762147483647submenuAction:FindYESFind…f104857621474836471Find Nextg104857621474836472Find PreviousG117964821474836473Use Selection for Finde104857621474836477Jump to Selectionj10485762147483647Spelling and Grammar10485762147483647submenuAction:Spelling and GrammarYESShow Spelling…:10485762147483647Check Spelling;10485762147483647Check Spelling While Typing10485762147483647Check Grammar With Spelling10485762147483647Substitutions10485762147483647submenuAction:SubstitutionsYESSmart Copy/Pastef104857621474836471Smart Quotesg104857621474836472Smart LinksG117964821474836473Speech10485762147483647submenuAction:SpeechYESStart Speaking10485762147483647Stop Speaking10485762147483647View10485762147483647submenuAction:ViewYESShow Toolbart15728642147483647Customize Toolbar…10485762147483647Window10485762147483647submenuAction:WindowYESMinimizem10485762147483647Zoom10485762147483647YESYES10485762147483647Bring All to Front10485762147483647_NSWindowsMenuHelp10485762147483647submenuAction:HelpYESNewApplication Help?10485762147483647_NSMainMenu152{{227, 288}, {428, 456}}1946157056WindowNSWindow256YES274YES2304YES2322YESYESApple HTML pasteboard typeApple PDF pasteboard typeApple PICT pasteboard typeApple PNG pasteboard typeApple URL pasteboard typeCorePasteboardFlavorType 0x6D6F6F76NSColor pasteboard typeNSFilenamesPboardTypeNSStringPboardTypeNeXT Encapsulated PostScript v1.2 pasteboard typeNeXT RTFD pasteboard typeNeXT Rich Text Format v1.0 pasteboard typeNeXT TIFF v4.0 pasteboard typeNeXT font pasteboard typeNeXT ruler pasteboard typeWebURLsWithTitlesPboardTypepublic.url{428, 14}YES642816711936303MQAYESYESNSBackgroundColorNSColorYES6SystemselectedTextBackgroundColor3MC42NjY2NjY2NjY3AA6SystemselectedTextColor3MAAYESYESNSColorNSUnderlineYES1MCAwIDEAA16{858, 10000000}{223, 0}{{1, 1}, {428, 456}}{4, 5}79691776YESYESfile://localhost/Applications/Xcode.app/Contents/SharedFrameworks/DVTKit.framework/Resources/DVTIbeamCursor.tiff3MCAwAA4-2147483392{{282, 1}, {15, 188}}_doScroller:0.98876399999999998-2147483392{{-100, -100}, {87, 18}}1_doScroller:10.94565220000000005{{-1, -1}, {430, 458}}133650{428, 456}{{0, 0}, {1440, 878}}{10000000000000, 10000000000000}YESControllerYESorderFrontStandardAboutPanel:142performMiniaturize:37arrangeInFront:39print:86runPageLayout:87clearRecentDocuments:127performClose:193toggleContinuousSpellChecking:222undo:223copy:224checkSpelling:225paste:226stopSpeaking:227cut:228showGuessPanel:230redo:231selectAll:232startSpeaking:233delete:235performZoom:240performFindPanelAction:241centerSelectionInVisibleArea:245toggleGrammarChecking:347toggleSmartInsertDelete:355toggleAutomaticQuoteSubstitution:356toggleAutomaticLinkDetection:357showHelp:360saveDocument:362saveDocumentAs:363revertDocumentToSaved:364runToolbarCustomizationPalette:365toggleToolbarShown:366hide:367hideOtherApplications:368terminate:369unhideAllApplications:370newDocument:373openDocument:374initialFirstResponder385scrollView405scriptView406YES0YES-2File's Owner-1First Responder-3Application29YESMainMenu19YES56YES103YES1217YES83YES81YES75380878672829124YES77573179711210742125YES126205YES202198207214199203197206215218YES216YES200YES219201204220YES213210221208209106YES211157YES581341501361111144129121143236131YES14914513024YES92523923295YES296YES297298211YES212YES195196346348YES349YES350351354371YES372YES375YES376377378379YESYES-1.IBPluginDependency-2.IBPluginDependency-3.IBPluginDependency103.IBPluginDependency106.IBPluginDependency111.IBPluginDependency112.IBPluginDependency124.IBPluginDependency125.IBPluginDependency126.IBPluginDependency129.IBPluginDependency130.IBPluginDependency131.IBPluginDependency134.IBPluginDependency136.IBPluginDependency143.IBPluginDependency144.IBPluginDependency145.IBPluginDependency149.IBPluginDependency150.IBPluginDependency19.IBPluginDependency195.IBPluginDependency196.IBPluginDependency197.IBPluginDependency198.IBPluginDependency199.IBPluginDependency200.IBPluginDependency201.IBPluginDependency202.IBPluginDependency203.IBPluginDependency204.IBPluginDependency205.IBPluginDependency206.IBPluginDependency207.IBPluginDependency208.IBPluginDependency209.IBPluginDependency210.IBPluginDependency211.IBPluginDependency212.IBPluginDependency213.IBPluginDependency214.IBPluginDependency215.IBPluginDependency216.IBPluginDependency217.IBPluginDependency218.IBPluginDependency219.IBPluginDependency220.IBPluginDependency221.IBPluginDependency23.IBPluginDependency236.IBPluginDependency239.IBPluginDependency24.IBPluginDependency29.IBPluginDependency295.IBPluginDependency296.IBPluginDependency297.IBPluginDependency298.IBPluginDependency346.IBPluginDependency348.IBPluginDependency349.IBPluginDependency350.IBPluginDependency351.IBPluginDependency354.IBPluginDependency371.IBPluginDependency371.IBWindowTemplateEditedContentRect371.NSWindowTemplate.visibleAtLaunch372.IBPluginDependency375.IBPluginDependency376.IBPluginDependency377.IBPluginDependency378.IBPluginDependency379.IBPluginDependency5.IBPluginDependency56.IBPluginDependency57.IBPluginDependency58.IBPluginDependency72.IBPluginDependency73.IBPluginDependency74.IBPluginDependency75.IBPluginDependency77.IBPluginDependency78.IBPluginDependency79.IBPluginDependency80.IBPluginDependency81.IBPluginDependency82.IBPluginDependency83.IBPluginDependency92.IBPluginDependencyYEScom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugin{{73, 556}, {470, 498}}com.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPluginYESYES409YESControllerNSObjectYESYESdoModal:doSheet:toggleWindow:YESidididYESYESdoModal:doSheet:toggleWindow:YESdoModal:iddoSheet:idtoggleWindow:idYESYES_iPhoneTableView_stickyRowTableView_tableView_windowalertfieldscriptViewscrollViewwindowYESNSTableViewNSTableViewNoodleTableViewidididNSTextViewNSScrollViewidYESYES_iPhoneTableView_stickyRowTableView_tableView_windowalertfieldscriptViewscrollViewwindowYES_iPhoneTableViewNSTableView_stickyRowTableViewNSTableView_tableViewNoodleTableView_windowidalertidfieldidscriptViewNSTextViewscrollViewNSScrollViewwindowidIBProjectSource./Classes/Controller.hNSDocumentYESYESprintDocument:revertDocumentToSaved:runPageLayout:saveDocument:saveDocumentAs:saveDocumentTo:YESididididididYESYESprintDocument:revertDocumentToSaved:runPageLayout:saveDocument:saveDocumentAs:saveDocumentTo:YESprintDocument:idrevertDocumentToSaved:idrunPageLayout:idsaveDocument:idsaveDocumentAs:idsaveDocumentTo:idIBProjectSource./Classes/NSDocument.hNSTableViewscrollToStickyRow:idscrollToStickyRow:scrollToStickyRow:idIBProjectSource./Classes/NSTableView.hNoodleTableViewNSTableViewIBProjectSource./Classes/NoodleTableView.h0IBCocoaFrameworkcom.apple.InterfaceBuilder.CocoaPlugin.macosxcom.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3YES3YESYESNSMenuCheckmarkNSMenuMixedStateYES{11, 11}{10, 3}
================================================
FILE: Examples/LineNumberView/LineNumberView-Info.plist
================================================
CFBundleDevelopmentRegionEnglishCFBundleExecutable${EXECUTABLE_NAME}CFBundleIdentifiercom.noodlesoft.${PRODUCT_NAME:rfc1034identifier}CFBundleInfoDictionaryVersion6.0CFBundlePackageTypeAPPLCFBundleShortVersionString1.0CFBundleSignature????CFBundleVersion1LSMinimumSystemVersion${MACOSX_DEPLOYMENT_TARGET}NSMainNibFileMainMenuNSPrincipalClassNSApplication
================================================
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
================================================
010B5047321038.2437.00com.apple.InterfaceBuilder.CocoaPlugin732YESYEScom.apple.InterfaceBuilder.CocoaPluginYESYESYESYESNSApplicationFirstResponderNSApplicationAMainMenuYESNewApplication10485762147483647NSImageNSMenuCheckmarkNSImageNSMenuMixedStatesubmenuAction:NewApplicationYESAbout NewApplication2147483647YESYES10485762147483647Preferences…,10485762147483647YESYES10485762147483647Services10485762147483647submenuAction:ServicesYES_NSServicesMenuYESYES10485762147483647Hide NewApplicationh10485762147483647Hide Othersh15728642147483647Show All10485762147483647YESYES10485762147483647Quit NewApplicationq10485762147483647_NSAppleMenuFile10485762147483647submenuAction:FileYESNewn10485762147483647Open…o10485762147483647Open Recent10485762147483647submenuAction:Open RecentYESClear Menu10485762147483647_NSRecentDocumentsMenuYESYES10485762147483647Closew10485762147483647Saves10485762147483647Save As…S11796482147483647Revert to Saved2147483647YESYES10485762147483647Page Setup...P11796482147483647Print…p10485762147483647Edit10485762147483647submenuAction:EditYESUndoz10485762147483647RedoZ11796482147483647YESYES10485762147483647Cutx10485762147483647Copyc10485762147483647Pastev10485762147483647Delete10485762147483647Select Alla10485762147483647YESYES10485762147483647Find10485762147483647submenuAction:FindYESFind…f104857621474836471Find Nextg104857621474836472Find PreviousG117964821474836473Use Selection for Finde104857621474836477Jump to Selectionj10485762147483647Spelling and Grammar10485762147483647submenuAction:Spelling and GrammarYESShow Spelling…:10485762147483647Check Spelling;10485762147483647Check Spelling While Typing10485762147483647Check Grammar With Spelling10485762147483647Substitutions10485762147483647submenuAction:SubstitutionsYESSmart Copy/Pastef104857621474836471Smart Quotesg104857621474836472Smart LinksG117964821474836473Speech10485762147483647submenuAction:SpeechYESStart Speaking10485762147483647Stop Speaking10485762147483647Format10485762147483647submenuAction:FormatYESShow Fontst10485762147483647Show ColorsC11796482147483647View10485762147483647submenuAction:ViewYESShow Toolbart15728642147483647Customize Toolbar…10485762147483647Window10485762147483647submenuAction:WindowYESMinimizem10485762147483647Zoom10485762147483647YESYES10485762147483647Bring All to Front10485762147483647_NSWindowsMenuHelp10485762147483647submenuAction:HelpYESNewApplication Help?10485762147483647_NSMainMenu152{{335, 536}, {306, 214}}1946157056Modal Testing ThingyNSWindow{1.79769e+308, 1.79769e+308}256YES256{{57, 25}, {192, 32}}YES12YES67239424134217728ModalLucidaGrande131044-203828403312002567239424134217728Sheet-2038284033120025{96, 32}{0, 0}-208037478467239424134217728Button-2038284033120025-1-16SystemcontrolColor3MC42NjY2NjY2NjY3AA268{{73, 112}, {160, 44}}YES67239488138413056LucidaGrande36166SystemcontrolTextColor3MAA{306, 214}{{0, 0}, {1920, 1178}}{1.79769e+308, 1.79769e+308}Controller12{{196, 369}, {336, 141}}-1543503872NSPanel{1.79769e+308, 1.79769e+308}256YES256{{155, 11}, {172, 32}}YES12YES67239424134217728Cancel-20382840331Gw20025-1006502400134217728OK-20382840331DQ20025{86, 32}{0, 0}-208037478467239424134217728Button-2038284033120025-1-1268{{148, 80}, {31, 17}}YES67239488272630784Ok?268YESYESApple PDF pasteboard typeApple PICT pasteboard typeApple PNG pasteboard typeNSFilenamesPboardTypeNeXT Encapsulated PostScript v1.2 pasteboard typeNeXT TIFF v4.0 pasteboard type{{20, 57}, {64, 64}}YES13056033554432NSImageNSApplicationIcon000NOYES{336, 141}{{0, 0}, {1920, 1178}}{1.79769e+308, 1.79769e+308}YESperformMiniaturize:37arrangeInFront:39print:86runPageLayout:87clearRecentDocuments:127orderFrontStandardAboutPanel:142performClose:193toggleContinuousSpellChecking:222undo:223copy:224checkSpelling:225paste:226stopSpeaking:227cut:228showGuessPanel:230redo:231selectAll:232startSpeaking:233delete:235performZoom:240performFindPanelAction:241centerSelectionInVisibleArea:245toggleGrammarChecking:347toggleSmartInsertDelete:355toggleAutomaticQuoteSubstitution:356toggleAutomaticLinkDetection:357showHelp:360orderFrontColorPanel:361saveDocument:362saveDocumentAs:363revertDocumentToSaved:364runToolbarCustomizationPalette:365toggleToolbarShown:366hide:367hideOtherApplications:368terminate:369unhideAllApplications:370newDocument:373openDocument:374confirmModal:388cancelModal:389alert392window393doModal:408doSheet:409field412delegate415YES0-2File's Owner-1First Responder-3Application29YESMainMenu19YES56YES103YES1217YES83YES81YES75380878672829124YES77573179711210742125YES126205YES202198207214199203197206215218YES216YES200YES219201204220YES213210221208209106YES211157YES581341501361111144129121143236131YES14914513024YES92523923295YES296YES297298299YES300YES344345211YES212YES195196346348YES349YES350351354371YES372YES375377YES378YES381YES382380386396YES397395407410YES411413YES414416YES417YESYES-3.IBPluginDependency103.IBPluginDependency103.ImportedFromIB2106.IBPluginDependency106.ImportedFromIB2106.editorWindowContentRectSynchronizationRect111.IBPluginDependency111.ImportedFromIB2112.IBPluginDependency112.ImportedFromIB2124.IBPluginDependency124.ImportedFromIB2125.IBPluginDependency125.ImportedFromIB2125.editorWindowContentRectSynchronizationRect126.IBPluginDependency126.ImportedFromIB2129.IBPluginDependency129.ImportedFromIB2130.IBPluginDependency130.ImportedFromIB2130.editorWindowContentRectSynchronizationRect131.IBPluginDependency131.ImportedFromIB2134.IBPluginDependency134.ImportedFromIB2136.IBPluginDependency136.ImportedFromIB2143.IBPluginDependency143.ImportedFromIB2144.IBPluginDependency144.ImportedFromIB2145.IBPluginDependency145.ImportedFromIB2149.IBPluginDependency149.ImportedFromIB2150.IBPluginDependency150.ImportedFromIB219.IBPluginDependency19.ImportedFromIB2195.IBPluginDependency195.ImportedFromIB2196.IBPluginDependency196.ImportedFromIB2197.IBPluginDependency197.ImportedFromIB2198.IBPluginDependency198.ImportedFromIB2199.IBPluginDependency199.ImportedFromIB2200.IBPluginDependency200.ImportedFromIB2200.editorWindowContentRectSynchronizationRect201.IBPluginDependency201.ImportedFromIB2202.IBPluginDependency202.ImportedFromIB2203.IBPluginDependency203.ImportedFromIB2204.IBPluginDependency204.ImportedFromIB2205.IBPluginDependency205.ImportedFromIB2205.editorWindowContentRectSynchronizationRect206.IBPluginDependency206.ImportedFromIB2207.IBPluginDependency207.ImportedFromIB2208.IBPluginDependency208.ImportedFromIB2209.IBPluginDependency209.ImportedFromIB2210.IBPluginDependency210.ImportedFromIB2211.IBPluginDependency211.ImportedFromIB2212.IBPluginDependency212.ImportedFromIB2212.editorWindowContentRectSynchronizationRect213.IBPluginDependency213.ImportedFromIB2214.IBPluginDependency214.ImportedFromIB2215.IBPluginDependency215.ImportedFromIB2216.IBPluginDependency216.ImportedFromIB2217.IBPluginDependency217.ImportedFromIB2218.IBPluginDependency218.ImportedFromIB2219.IBPluginDependency219.ImportedFromIB2220.IBPluginDependency220.ImportedFromIB2220.editorWindowContentRectSynchronizationRect221.IBPluginDependency221.ImportedFromIB223.IBPluginDependency23.ImportedFromIB2236.IBPluginDependency236.ImportedFromIB2239.IBPluginDependency239.ImportedFromIB224.IBPluginDependency24.ImportedFromIB224.editorWindowContentRectSynchronizationRect29.IBEditorWindowLastContentRect29.IBPluginDependency29.ImportedFromIB229.WindowOrigin29.editorWindowContentRectSynchronizationRect295.IBPluginDependency296.IBPluginDependency296.editorWindowContentRectSynchronizationRect297.IBPluginDependency298.IBPluginDependency299.IBPluginDependency300.IBPluginDependency300.editorWindowContentRectSynchronizationRect344.IBPluginDependency345.IBPluginDependency346.IBPluginDependency346.ImportedFromIB2348.IBPluginDependency348.ImportedFromIB2349.IBPluginDependency349.ImportedFromIB2349.editorWindowContentRectSynchronizationRect350.IBPluginDependency350.ImportedFromIB2351.IBPluginDependency351.ImportedFromIB2354.IBPluginDependency354.ImportedFromIB2371.IBEditorWindowLastContentRect371.IBPluginDependency371.IBWindowTemplateEditedContentRect371.NSWindowTemplate.visibleAtLaunch371.editorWindowContentRectSynchronizationRect372.IBPluginDependency377.IBEditorWindowLastContentRect377.IBPluginDependency377.IBWindowTemplateEditedContentRect377.NSWindowTemplate.visibleAtLaunch377.editorWindowContentRectSynchronizationRect378.IBPluginDependency380.IBPluginDependency381.IBPluginDependency382.IBPluginDependency386.IBPluginDependency395.IBPluginDependency396.IBPluginDependency397.IBPluginDependency407.IBPluginDependency410.IBPluginDependency411.IBPluginDependency413.IBPluginDependency414.IBPluginDependency416.IBPluginDependency417.IBPluginDependency5.IBPluginDependency5.ImportedFromIB256.IBPluginDependency56.ImportedFromIB257.IBPluginDependency57.ImportedFromIB257.editorWindowContentRectSynchronizationRect58.IBPluginDependency58.ImportedFromIB272.IBPluginDependency72.ImportedFromIB273.IBPluginDependency73.ImportedFromIB274.IBPluginDependency74.ImportedFromIB275.IBPluginDependency75.ImportedFromIB277.IBPluginDependency77.ImportedFromIB278.IBPluginDependency78.ImportedFromIB279.IBPluginDependency79.ImportedFromIB280.IBPluginDependency80.ImportedFromIB281.IBPluginDependency81.ImportedFromIB281.editorWindowContentRectSynchronizationRect82.IBPluginDependency82.ImportedFromIB283.IBPluginDependency83.ImportedFromIB292.IBPluginDependency92.ImportedFromIB2YEScom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugin{{596, 852}, {216, 23}}com.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugin{{522, 812}, {146, 23}}com.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugin{{436, 809}, {64, 6}}com.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugin{{608, 612}, {275, 83}}com.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugin{{187, 434}, {243, 243}}com.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugin{{608, 612}, {167, 43}}com.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugin{{608, 612}, {241, 103}}com.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugin{{525, 802}, {197, 73}}{{21, 1080}, {478, 20}}com.apple.InterfaceBuilder.CocoaPlugin{74, 862}{{6, 978}, {478, 20}}com.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugin{{475, 832}, {234, 43}}com.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugin{{231, 634}, {176, 43}}com.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugin{{608, 612}, {215, 63}}com.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.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.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugin{{23, 794}, {245, 183}}com.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugin{{145, 474}, {199, 203}}com.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPluginYESYESYESYES417YESControllerNSObjectYESYESscriptViewscrollViewYESNSTextViewNSScrollViewIBProjectSourceExamples/LineNumberView/Controller.hControllerNSObjectYESYESdoModal:doSheet:YESididYESYESalertfieldwindowYESidididIBProjectSourceExamples/ModalResponder/Controller.hControllerNSObjectYESYES_iPhoneTableView_stickyRowTableViewYESNSTableViewNSTableViewIBProjectSourceExamples/StickyRowTableView Revue/Controller.hControllerNSObjecttoggleWindow:id_windowidIBProjectSourceExamples/Window Effects/Controller.hControllerNSObjectIBUserSourceFirstResponderNSObjectYESYEScancelModal:cancelSheet:confirmModal:confirmSheet:YESididididIBUserSourceNSObjectIBProjectSourceNSObject-NoodlePerformWhenIdle.hNSObjectIBProjectSourceNoodleStickyRowTableView.hNSResponderYESYEScancelModal:confirmModal:YESididIBProjectSourceNSResponder-NoodleModalExtensions.hNSResponderNSObjectYESYEScancelSheet:confirmSheet:YESididIBUserSourceNSTableViewscrollToStickyRow:idNSWindowYESYEScancelModal:confirmModal:YESididNSWindowIBProjectSourceNSWindow-NoodleEffects.hYESNSActionCellNSCellIBFrameworkSourceAppKit.framework/Headers/NSActionCell.hNSApplicationNSResponderIBFrameworkSourceAppKit.framework/Headers/NSApplication.hNSApplicationIBFrameworkSourceAppKit.framework/Headers/NSApplicationScripting.hNSApplicationIBFrameworkSourceAppKit.framework/Headers/NSColorPanel.hNSApplicationIBFrameworkSourceAppKit.framework/Headers/NSHelpManager.hNSApplicationIBFrameworkSourceAppKit.framework/Headers/NSPageLayout.hNSApplicationIBFrameworkSourceAppKit.framework/Headers/NSUserInterfaceItemSearching.hNSBrowserNSControlIBFrameworkSourceAppKit.framework/Headers/NSBrowser.hNSButtonCellNSActionCellIBFrameworkSourceAppKit.framework/Headers/NSButtonCell.hNSCellNSObjectIBFrameworkSourceAppKit.framework/Headers/NSCell.hNSControlNSViewIBFrameworkSourceAppKit.framework/Headers/NSControl.hNSDocumentNSObjectYESYESprintDocument:revertDocumentToSaved:runPageLayout:saveDocument:saveDocumentAs:saveDocumentTo:YESididididididIBFrameworkSourceAppKit.framework/Headers/NSDocument.hNSDocumentIBFrameworkSourceAppKit.framework/Headers/NSDocumentScripting.hNSDocumentControllerNSObjectYESYESclearRecentDocuments:newDocument:openDocument:saveAllDocuments:YESididididIBFrameworkSourceAppKit.framework/Headers/NSDocumentController.hNSFormatterNSObjectIBFrameworkSourceFoundation.framework/Headers/NSFormatter.hNSImageCellNSCellIBFrameworkSourceAppKit.framework/Headers/NSImageCell.hNSImageViewNSControlIBFrameworkSourceAppKit.framework/Headers/NSImageView.hNSMatrixNSControlIBFrameworkSourceAppKit.framework/Headers/NSMatrix.hNSMenuNSObjectIBFrameworkSourceAppKit.framework/Headers/NSMenu.hNSMenuItemNSObjectIBFrameworkSourceAppKit.framework/Headers/NSMenuItem.hNSMovieViewNSViewIBFrameworkSourceAppKit.framework/Headers/NSMovieView.hNSObjectIBFrameworkSourceAppKit.framework/Headers/NSAccessibility.hNSObjectNSObjectNSObjectNSObjectNSObjectIBFrameworkSourceAppKit.framework/Headers/NSDictionaryController.hNSObjectIBFrameworkSourceAppKit.framework/Headers/NSDragging.hNSObjectIBFrameworkSourceAppKit.framework/Headers/NSFontManager.hNSObjectIBFrameworkSourceAppKit.framework/Headers/NSFontPanel.hNSObjectIBFrameworkSourceAppKit.framework/Headers/NSKeyValueBinding.hNSObjectNSObjectIBFrameworkSourceAppKit.framework/Headers/NSNibLoading.hNSObjectIBFrameworkSourceAppKit.framework/Headers/NSOutlineView.hNSObjectIBFrameworkSourceAppKit.framework/Headers/NSPasteboard.hNSObjectIBFrameworkSourceAppKit.framework/Headers/NSSavePanel.hNSObjectIBFrameworkSourceAppKit.framework/Headers/NSTableView.hNSObjectIBFrameworkSourceAppKit.framework/Headers/NSToolbarItem.hNSObjectIBFrameworkSourceAppKit.framework/Headers/NSView.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSArchiver.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSClassDescription.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSError.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSFileManager.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSKeyValueCoding.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSKeyValueObserving.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSKeyedArchiver.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSObject.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSObjectScripting.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSPortCoder.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSRunLoop.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSScriptClassDescription.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSScriptKeyValueCoding.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSScriptObjectSpecifiers.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSScriptWhoseTests.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSThread.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSURL.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSURLConnection.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSURLDownload.hNSPanelNSWindowIBFrameworkSourceAppKit.framework/Headers/NSPanel.hNSResponderIBFrameworkSourceAppKit.framework/Headers/NSInterfaceStyle.hNSResponderNSObjectIBFrameworkSourceAppKit.framework/Headers/NSResponder.hNSScrollViewNSViewIBFrameworkSourceAppKit.framework/Headers/NSScrollView.hNSTableViewNSControlNSTextNSViewIBFrameworkSourceAppKit.framework/Headers/NSText.hNSTextFieldNSControlIBFrameworkSourceAppKit.framework/Headers/NSTextField.hNSTextFieldCellNSActionCellIBFrameworkSourceAppKit.framework/Headers/NSTextFieldCell.hNSTextViewNSTextIBFrameworkSourceAppKit.framework/Headers/NSTextView.hNSViewIBFrameworkSourceAppKit.framework/Headers/NSClipView.hNSViewNSViewIBFrameworkSourceAppKit.framework/Headers/NSRulerView.hNSViewNSResponderNSWindowIBFrameworkSourceAppKit.framework/Headers/NSDrawer.hNSWindowNSResponderIBFrameworkSourceAppKit.framework/Headers/NSWindow.hNSWindowIBFrameworkSourceAppKit.framework/Headers/NSWindowScripting.h0com.apple.InterfaceBuilder.CocoaPlugin.macosxcom.apple.InterfaceBuilder.CocoaPlugin.macosxcom.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3YES../../ModalResponderTest.xcodeproj3
================================================
FILE: Examples/ModalResponder/ModalResponder-Info.plist
================================================
CFBundleDevelopmentRegionEnglishCFBundleExecutable${EXECUTABLE_NAME}CFBundleIdentifiercom.noodlesoft.${PRODUCT_NAME:rfc1034identifier}CFBundleInfoDictionaryVersion6.0CFBundlePackageTypeAPPLCFBundleShortVersionString1.0CFBundleSignature????CFBundleVersion1LSMinimumSystemVersion${MACOSX_DEPLOYMENT_TARGET}NSMainNibFileMainMenuNSPrincipalClassNSApplication
================================================
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
================================================
105010B5047401038.2437.00com.apple.InterfaceBuilder.CocoaPlugin740YESYEScom.apple.InterfaceBuilder.CocoaPluginYESYESYESYESNSApplicationFirstResponderNSApplicationAMainMenuYESNoodleStickyRowTableView Test10485762147483647NSImageNSMenuCheckmarkNSImageNSMenuMixedStatesubmenuAction:NoodleStickyRowTableView TestYESAbout NoodleStickyRowTableViewTest2147483647YESYES10485762147483647Preferences…,10485762147483647YESYES10485762147483647Services10485762147483647submenuAction:ServicesYES_NSServicesMenuYESYES10485762147483647Hide NoodleStickyRowTableViewTesth10485762147483647Hide Othersh15728642147483647Show All10485762147483647YESYES10485762147483647Quit NoodleStickyRowTableViewTestq10485762147483647_NSAppleMenuFile10485762147483647submenuAction:FileYESNewn10485762147483647Open…o10485762147483647Open Recent10485762147483647submenuAction:Open RecentYESClear Menu10485762147483647_NSRecentDocumentsMenuYESYES10485762147483647Closew10485762147483647Saves10485762147483647Save As…S11796482147483647Revert to Saved2147483647YESYES10485762147483647Page Setup...P11796482147483647Print…p10485762147483647Edit10485762147483647submenuAction:EditYESUndoz10485762147483647RedoZ11796482147483647YESYES10485762147483647Cutx10485762147483647Copyc10485762147483647Pastev10485762147483647Delete10485762147483647Select Alla10485762147483647YESYES10485762147483647Find10485762147483647submenuAction:FindYESFind…f104857621474836471Find Nextg104857621474836472Find PreviousG117964821474836473Use Selection for Finde104857621474836477Jump to Selectionj10485762147483647Spelling and Grammar10485762147483647submenuAction:Spelling and GrammarYESShow Spelling…:10485762147483647Check Spelling;10485762147483647Check Spelling While Typing10485762147483647Check Grammar With Spelling10485762147483647Substitutions10485762147483647submenuAction:SubstitutionsYESSmart Copy/Pastef104857621474836471Smart Quotesg104857621474836472Smart LinksG117964821474836473Speech10485762147483647submenuAction:SpeechYESStart Speaking10485762147483647Stop Speaking10485762147483647Format2147483647submenuAction:FormatYESFont2147483647submenuAction:FontYESShow Fontst10485762147483647Boldb104857621474836472Italici104857621474836471Underlineu10485762147483647YESYES2147483647Bigger+104857621474836473Smaller-104857621474836474YESYES2147483647Kern2147483647submenuAction:KernYESUse Default2147483647Use None2147483647Tighten2147483647Loosen2147483647Ligature2147483647submenuAction:LigatureYESUse Default2147483647Use None2147483647Use All2147483647Baseline2147483647submenuAction:BaselineYESUse Default2147483647Superscript2147483647Subscript2147483647Raise2147483647Lower2147483647YESYES2147483647Show ColorsC10485762147483647YESYES2147483647Copy Stylec15728642147483647Paste Stylev15728642147483647_NSFontMenuText2147483647submenuAction:TextYESAlign Left{10485762147483647Center|10485762147483647Justify2147483647Align Right}10485762147483647YESYES2147483647Show Ruler2147483647Copy Rulerc13107202147483647Paste Rulerv13107202147483647View10485762147483647submenuAction:ViewYESShow Toolbart15728642147483647Customize Toolbar…10485762147483647Window10485762147483647submenuAction:WindowYESMinimizem10485762147483647Zoom10485762147483647YESYES10485762147483647Bring All to Front10485762147483647_NSWindowsMenuHelp10485762147483647submenuAction:HelpYESNewApplication Help?10485762147483647_NSMainMenu152{{237, 530}, {286, 358}}1946157056NoodleStickyRowTableViewNSWindow{1.79769e+308, 1.79769e+308}256YES274YES2304YES256{229, 316}YES256{{424, 0}, {16, 17}}YESfoo226401000756280962048LucidaGrande1131003MC4zMzMzMzI5OQA6SystemheaderTextColor3MAA3377720962048Text CellLucidaGrande1310446SystemcontrolBackgroundColor3MC42NjY2NjY2NjY3AA6SystemcontrolTextColor3YESYES326SystemgridColor3MC41AA22-7675576324150YES0{{1, 1}, {229, 316}}4256{{230, 1}, {15, 316}}_doScroller:0.99680511182108622-2147483392{{-100, -100}, {423, 15}}1_doScroller:0.99764150943396224{{20, 20}, {246, 318}}18QSAAAEEgAABBwAAAQcAAAA{286, 358}{{0, 0}, {1920, 1178}}{1.79769e+308, 1.79769e+308}152{{542, 532}, {286, 358}}1946157056NoodleIPhoneTableViewNSWindow{1.79769e+308, 1.79769e+308}256YES274YES2304YES256{229, 316}YES256{{424, 0}, {16, 17}}YESfoo2264010007562809620483MC4zMzMzMzI5OQA3377720962048Text Cell3YESYES3222-7675576324150YES0{{1, 1}, {229, 316}}4256{{230, 1}, {15, 316}}_doScroller:0.99668874172185429-2147483392{{-100, -100}, {423, 15}}1_doScroller:0.99764150943396224{{20, 20}, {246, 318}}18QSAAAEEgAABBwAAAQcAAAA{286, 358}{{0, 0}, {1920, 1178}}{1.79769e+308, 1.79769e+308}NSFontManagerControllerYESperformMiniaturize:37arrangeInFront:39print:86runPageLayout:87clearRecentDocuments:127orderFrontStandardAboutPanel:142performClose:193toggleContinuousSpellChecking:222undo:223copy:224checkSpelling:225paste:226stopSpeaking:227cut:228showGuessPanel:230redo:231selectAll:232startSpeaking:233delete:235performZoom:240performFindPanelAction:241centerSelectionInVisibleArea:245toggleGrammarChecking:347toggleSmartInsertDelete:355toggleAutomaticQuoteSubstitution:356toggleAutomaticLinkDetection:357showHelp:360saveDocument:362saveDocumentAs:363revertDocumentToSaved:364runToolbarCustomizationPalette:365toggleToolbarShown:366hide:367hideOtherApplications:368unhideAllApplications:370newDocument:373openDocument:374addFontTrait:421addFontTrait:422modifyFont:423orderFrontFontPanel:424modifyFont:425raiseBaseline:426lowerBaseline:427copyFont:428subscript:429superscript:430tightenKerning:431underline:432orderFrontColorPanel:433useAllLigatures:434loosenKerning:435pasteFont:436unscript:437useStandardKerning:438useStandardLigatures:439turnOffLigatures:440turnOffKerning:441alignLeft:442alignJustified:443copyRuler:444alignCenter:445toggleRuler:446alignRight:447pasteRuler:448terminate:449delegate541dataSource542dataSource554delegate555_stickyRowTableView556_iPhoneTableView557YES0-2File's Owner-1First Responder-3Application29YESMainMenu19YES56YES103YES1217YES83YES81YES75380878672829124YES77573179711210742125YES126205YES202198207214199203197206215218YES216YES200YES219201204220YES213210221208209106YES211157YES581341501361111144129121143236131YES14914513024YES92523923295YES296YES297298211YES212YES195196346348YES349YES350351354371YESNoodleStickyRowTableViewWindow372YES375YES376YES377YES378YES379YES380381382383384385386387388YES389390391392393394395396397YES398YES399YES400401402403404405YES406407408409410411YES412413414415YES416417418419420450YES451452453YES455YES458459527YESNoodleIPhoneTableViewWindow528YES529YES533YES534535537YES538YESYES-3.IBPluginDependency103.IBPluginDependency103.ImportedFromIB2106.IBPluginDependency106.ImportedFromIB2106.editorWindowContentRectSynchronizationRect111.IBPluginDependency111.ImportedFromIB2112.IBPluginDependency112.ImportedFromIB2124.IBPluginDependency124.ImportedFromIB2125.IBPluginDependency125.ImportedFromIB2125.editorWindowContentRectSynchronizationRect126.IBPluginDependency126.ImportedFromIB2129.IBPluginDependency129.ImportedFromIB2130.IBPluginDependency130.ImportedFromIB2130.editorWindowContentRectSynchronizationRect131.IBPluginDependency131.ImportedFromIB2134.IBPluginDependency134.ImportedFromIB2136.IBPluginDependency136.ImportedFromIB2143.IBPluginDependency143.ImportedFromIB2144.IBPluginDependency144.ImportedFromIB2145.IBPluginDependency145.ImportedFromIB2149.IBPluginDependency149.ImportedFromIB2150.IBPluginDependency150.ImportedFromIB219.IBPluginDependency19.ImportedFromIB2195.IBPluginDependency195.ImportedFromIB2196.IBPluginDependency196.ImportedFromIB2197.IBPluginDependency197.ImportedFromIB2198.IBPluginDependency198.ImportedFromIB2199.IBPluginDependency199.ImportedFromIB2200.IBPluginDependency200.ImportedFromIB2200.editorWindowContentRectSynchronizationRect201.IBPluginDependency201.ImportedFromIB2202.IBPluginDependency202.ImportedFromIB2203.IBPluginDependency203.ImportedFromIB2204.IBPluginDependency204.ImportedFromIB2205.IBPluginDependency205.ImportedFromIB2205.editorWindowContentRectSynchronizationRect206.IBPluginDependency206.ImportedFromIB2207.IBPluginDependency207.ImportedFromIB2208.IBPluginDependency208.ImportedFromIB2209.IBPluginDependency209.ImportedFromIB2210.IBPluginDependency210.ImportedFromIB2211.IBPluginDependency211.ImportedFromIB2212.IBPluginDependency212.ImportedFromIB2212.editorWindowContentRectSynchronizationRect213.IBPluginDependency213.ImportedFromIB2214.IBPluginDependency214.ImportedFromIB2215.IBPluginDependency215.ImportedFromIB2216.IBPluginDependency216.ImportedFromIB2217.IBPluginDependency217.ImportedFromIB2218.IBPluginDependency218.ImportedFromIB2219.IBPluginDependency219.ImportedFromIB2220.IBPluginDependency220.ImportedFromIB2220.editorWindowContentRectSynchronizationRect221.IBPluginDependency221.ImportedFromIB223.IBPluginDependency23.ImportedFromIB2236.IBPluginDependency236.ImportedFromIB2239.IBPluginDependency239.ImportedFromIB224.IBPluginDependency24.ImportedFromIB224.editorWindowContentRectSynchronizationRect29.IBEditorWindowLastContentRect29.IBPluginDependency29.ImportedFromIB229.WindowOrigin29.editorWindowContentRectSynchronizationRect295.IBPluginDependency296.IBPluginDependency296.editorWindowContentRectSynchronizationRect297.IBPluginDependency298.IBPluginDependency346.IBPluginDependency346.ImportedFromIB2348.IBPluginDependency348.ImportedFromIB2349.IBPluginDependency349.ImportedFromIB2349.editorWindowContentRectSynchronizationRect350.IBPluginDependency350.ImportedFromIB2351.IBPluginDependency351.ImportedFromIB2354.IBPluginDependency354.ImportedFromIB2371.IBEditorWindowLastContentRect371.IBPluginDependency371.IBWindowTemplateEditedContentRect371.NSWindowTemplate.visibleAtLaunch371.editorWindowContentRectSynchronizationRect371.windowTemplate.maxSize372.IBPluginDependency375.IBPluginDependency376.IBEditorWindowLastContentRect376.IBPluginDependency377.IBPluginDependency378.IBPluginDependency379.IBPluginDependency380.IBPluginDependency381.IBPluginDependency382.IBPluginDependency383.IBPluginDependency384.IBPluginDependency385.IBPluginDependency386.IBPluginDependency387.IBPluginDependency388.IBEditorWindowLastContentRect388.IBPluginDependency389.IBPluginDependency390.IBPluginDependency391.IBPluginDependency392.IBPluginDependency393.IBPluginDependency394.IBPluginDependency395.IBPluginDependency396.IBPluginDependency397.IBPluginDependency398.IBPluginDependency399.IBPluginDependency400.IBPluginDependency401.IBPluginDependency402.IBPluginDependency403.IBPluginDependency404.IBPluginDependency405.IBPluginDependency406.IBPluginDependency407.IBPluginDependency408.IBPluginDependency409.IBPluginDependency410.IBPluginDependency411.IBPluginDependency412.IBPluginDependency413.IBPluginDependency414.IBPluginDependency415.IBPluginDependency416.IBPluginDependency417.IBPluginDependency418.IBPluginDependency419.IBPluginDependency450.IBPluginDependency451.IBPluginDependency452.IBPluginDependency453.CustomClassName453.IBPluginDependency455.IBPluginDependency458.IBPluginDependency5.IBPluginDependency5.ImportedFromIB2527.IBEditorWindowLastContentRect527.IBPluginDependency527.IBWindowTemplateEditedContentRect527.NSWindowTemplate.visibleAtLaunch527.editorWindowContentRectSynchronizationRect527.windowTemplate.maxSize528.IBPluginDependency529.IBPluginDependency533.CustomClassName533.IBPluginDependency534.IBPluginDependency535.IBPluginDependency537.IBPluginDependency538.IBPluginDependency56.IBPluginDependency56.ImportedFromIB257.IBEditorWindowLastContentRect57.IBPluginDependency57.ImportedFromIB257.editorWindowContentRectSynchronizationRect58.IBPluginDependency58.ImportedFromIB272.IBPluginDependency72.ImportedFromIB273.IBPluginDependency73.ImportedFromIB274.IBPluginDependency74.ImportedFromIB275.IBPluginDependency75.ImportedFromIB277.IBPluginDependency77.ImportedFromIB278.IBPluginDependency78.ImportedFromIB279.IBPluginDependency79.ImportedFromIB280.IBPluginDependency80.ImportedFromIB281.IBPluginDependency81.ImportedFromIB281.editorWindowContentRectSynchronizationRect82.IBPluginDependency82.ImportedFromIB283.IBPluginDependency83.ImportedFromIB292.IBPluginDependency92.ImportedFromIB2YEScom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugin{{596, 852}, {216, 23}}com.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugin{{522, 812}, {146, 23}}com.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugin{{436, 809}, {64, 6}}com.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugin{{608, 612}, {275, 83}}com.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugin{{187, 434}, {243, 243}}com.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugin{{608, 612}, {167, 43}}com.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugin{{608, 612}, {241, 103}}com.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugin{{525, 802}, {197, 73}}{{207, 285}, {599, 20}}com.apple.InterfaceBuilder.CocoaPlugin{74, 862}{{6, 978}, {478, 20}}com.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugin{{475, 832}, {234, 43}}com.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugin{{608, 612}, {215, 63}}com.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.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.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugin{{437, 242}, {86, 43}}com.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugin{{523, 2}, {178, 283}}com.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPluginNoodleTableViewcom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.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.CocoaPlugincom.apple.InterfaceBuilder.CocoaPluginNoodleIPhoneTableViewcom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugin{{219, 102}, {350, 183}}com.apple.InterfaceBuilder.CocoaPlugin{{23, 794}, {245, 183}}com.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugin{{145, 474}, {199, 203}}com.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPluginYESYESYESYES557YESControllerNSObjectYESYESscriptViewscrollViewYESNSTextViewNSScrollViewIBProjectSourceExamples/LineNumberView/Controller.hControllerNSObjectYESYESdoModal:doSheet:YESididYESYESalertfieldwindowYESidididIBProjectSourceExamples/ModalResponder/Controller.hControllerNSObjectYESYES_iPhoneTableView_stickyRowTableViewYESNSTableViewNSTableViewIBProjectSourceExamples/StickyRowTableView Revue/Controller.hControllerNSObjecttoggleWindow:id_windowidIBProjectSourceExamples/Window Effects/Controller.hControllerNSObject_tableViewNoodleTableViewIBProjectSourceExamples/iToonz/Controller.hNSObjectIBProjectSourceNSObject-NoodlePerformWhenIdle.hNSObjectIBProjectSourceNSTableView-NoodleExtensions.hNSObjectIBProjectSourceNoodleStickyRowTableView.hNSResponderYESYEScancelModal:confirmModal:YESididIBProjectSourceNSResponder-NoodleModalExtensions.hNSTableColumnNSTableViewscrollToStickyRow:idNSTableViewscrollToStickyRow:idNSWindowYESYEScancelModal:confirmModal:YESididNSWindowIBProjectSourceNSWindow-NoodleEffects.hNoodleIPhoneTableViewNSTableViewIBProjectSourceNoodleIPhoneTableView.hNoodleTableViewNSTableViewIBProjectSourceNoodleTableView.hYESNSActionCellNSCellIBFrameworkSourceAppKit.framework/Headers/NSActionCell.hNSApplicationNSResponderIBFrameworkSourceAppKit.framework/Headers/NSApplication.hNSApplicationIBFrameworkSourceAppKit.framework/Headers/NSApplicationScripting.hNSApplicationIBFrameworkSourceAppKit.framework/Headers/NSColorPanel.hNSApplicationIBFrameworkSourceAppKit.framework/Headers/NSHelpManager.hNSApplicationIBFrameworkSourceAppKit.framework/Headers/NSPageLayout.hNSApplicationIBFrameworkSourceAppKit.framework/Headers/NSUserInterfaceItemSearching.hNSBrowserNSControlIBFrameworkSourceAppKit.framework/Headers/NSBrowser.hNSCellNSObjectIBFrameworkSourceAppKit.framework/Headers/NSCell.hNSControlNSViewIBFrameworkSourceAppKit.framework/Headers/NSControl.hNSDocumentNSObjectYESYESprintDocument:revertDocumentToSaved:runPageLayout:saveDocument:saveDocumentAs:saveDocumentTo:YESididididididIBFrameworkSourceAppKit.framework/Headers/NSDocument.hNSDocumentIBFrameworkSourceAppKit.framework/Headers/NSDocumentScripting.hNSDocumentControllerNSObjectYESYESclearRecentDocuments:newDocument:openDocument:saveAllDocuments:YESididididIBFrameworkSourceAppKit.framework/Headers/NSDocumentController.hNSFontManagerNSObjectIBFrameworkSourceAppKit.framework/Headers/NSFontManager.hNSFormatterNSObjectIBFrameworkSourceFoundation.framework/Headers/NSFormatter.hNSMatrixNSControlIBFrameworkSourceAppKit.framework/Headers/NSMatrix.hNSMenuNSObjectIBFrameworkSourceAppKit.framework/Headers/NSMenu.hNSMenuItemNSObjectIBFrameworkSourceAppKit.framework/Headers/NSMenuItem.hNSMovieViewNSViewIBFrameworkSourceAppKit.framework/Headers/NSMovieView.hNSObjectIBFrameworkSourceAppKit.framework/Headers/NSAccessibility.hNSObjectNSObjectNSObjectNSObjectNSObjectIBFrameworkSourceAppKit.framework/Headers/NSDictionaryController.hNSObjectIBFrameworkSourceAppKit.framework/Headers/NSDragging.hNSObjectNSObjectIBFrameworkSourceAppKit.framework/Headers/NSFontPanel.hNSObjectIBFrameworkSourceAppKit.framework/Headers/NSKeyValueBinding.hNSObjectNSObjectIBFrameworkSourceAppKit.framework/Headers/NSNibLoading.hNSObjectIBFrameworkSourceAppKit.framework/Headers/NSOutlineView.hNSObjectIBFrameworkSourceAppKit.framework/Headers/NSPasteboard.hNSObjectIBFrameworkSourceAppKit.framework/Headers/NSSavePanel.hNSObjectIBFrameworkSourceAppKit.framework/Headers/NSTableView.hNSObjectIBFrameworkSourceAppKit.framework/Headers/NSToolbarItem.hNSObjectIBFrameworkSourceAppKit.framework/Headers/NSView.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSArchiver.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSClassDescription.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSError.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSFileManager.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSKeyValueCoding.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSKeyValueObserving.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSKeyedArchiver.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSObject.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSObjectScripting.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSPortCoder.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSRunLoop.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSScriptClassDescription.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSScriptKeyValueCoding.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSScriptObjectSpecifiers.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSScriptWhoseTests.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSThread.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSURL.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSURLConnection.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSURLDownload.hNSResponderIBFrameworkSourceAppKit.framework/Headers/NSInterfaceStyle.hNSResponderNSObjectIBFrameworkSourceAppKit.framework/Headers/NSResponder.hNSScrollViewNSViewIBFrameworkSourceAppKit.framework/Headers/NSScrollView.hNSScrollerNSControlIBFrameworkSourceAppKit.framework/Headers/NSScroller.hNSTableColumnNSObjectIBFrameworkSourceAppKit.framework/Headers/NSTableColumn.hNSTableViewNSControlNSTextNSViewIBFrameworkSourceAppKit.framework/Headers/NSText.hNSTextFieldCellNSActionCellIBFrameworkSourceAppKit.framework/Headers/NSTextFieldCell.hNSTextViewNSTextIBFrameworkSourceAppKit.framework/Headers/NSTextView.hNSViewIBFrameworkSourceAppKit.framework/Headers/NSClipView.hNSViewNSViewIBFrameworkSourceAppKit.framework/Headers/NSRulerView.hNSViewNSResponderNSWindowIBFrameworkSourceAppKit.framework/Headers/NSDrawer.hNSWindowNSResponderIBFrameworkSourceAppKit.framework/Headers/NSWindow.hNSWindowIBFrameworkSourceAppKit.framework/Headers/NSWindowScripting.h0com.apple.InterfaceBuilder.CocoaPlugin.macosxcom.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3YES../../../NoodleKit.xcodeproj3
================================================
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
================================================
CFBundleDevelopmentRegionEnglishCFBundleExecutable${EXECUTABLE_NAME}CFBundleIdentifiercom.noodlesoft.${PRODUCT_NAME:rfc1034identifier}CFBundleInfoDictionaryVersion6.0CFBundlePackageTypeAPPLCFBundleShortVersionString1.0CFBundleSignature????CFBundleVersion1LSMinimumSystemVersion${MACOSX_DEPLOYMENT_TARGET}NSMainNibFileMainMenuNSPrincipalClassNSApplication
================================================
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
================================================
105010F5697621038.29461.00com.apple.InterfaceBuilder.CocoaPlugin762YESYEScom.apple.InterfaceBuilder.CocoaPluginYESYESYESYESNSApplicationFirstResponderNSApplicationAMainMenuYESTimeLab10485762147483647NSImageNSMenuCheckmarkNSImageNSMenuMixedStatesubmenuAction:TimeLabYESAbout TimeLab2147483647YESYES10485762147483647Preferences…,10485762147483647YESYES10485762147483647Services10485762147483647submenuAction:ServicesYES_NSServicesMenuYESYES10485762147483647Hide TimeLabh10485762147483647Hide Othersh15728642147483647Show All10485762147483647YESYES10485762147483647Quit TimeLabq10485762147483647_NSAppleMenuFile10485762147483647submenuAction:FileYESNewn10485762147483647Open…o10485762147483647Open Recent10485762147483647submenuAction:Open RecentYESClear Menu10485762147483647_NSRecentDocumentsMenuYESYES10485762147483647Closew10485762147483647Saves10485762147483647Save As…S11796482147483647Revert to Saved2147483647YESYES10485762147483647Page Setup...P11796482147483647Print…p10485762147483647Edit10485762147483647submenuAction:EditYESUndoz10485762147483647RedoZ11796482147483647YESYES10485762147483647Cutx10485762147483647Copyc10485762147483647Pastev10485762147483647Paste and Match StyleV15728642147483647Delete10485762147483647Select Alla10485762147483647YESYES10485762147483647Find10485762147483647submenuAction:FindYESFind…f104857621474836471Find Nextg104857621474836472Find PreviousG117964821474836473Use Selection for Finde104857621474836477Jump to Selectionj10485762147483647Spelling and Grammar10485762147483647submenuAction:Spelling and GrammarYESShow Spelling and Grammar:10485762147483647Check Document Now;10485762147483647YESYES2147483647Check Spelling While Typing10485762147483647Check Grammar With Spelling10485762147483647Correct Spelling Automatically2147483647Substitutions10485762147483647submenuAction:SubstitutionsYESShow Substitutions2147483647YESYES2147483647Smart Copy/Pastef104857621474836471Smart Quotesg104857621474836472Smart Dashes2147483647Smart LinksG117964821474836473Text Replacement2147483647Transformations2147483647submenuAction:TransformationsYESMake Upper Case2147483647Make Lower Case2147483647Capitalize2147483647Speech10485762147483647submenuAction:SpeechYESStart Speaking10485762147483647Stop Speaking10485762147483647Format2147483647submenuAction:FormatYESFont2147483647submenuAction:FontYESShow Fontst10485762147483647Boldb104857621474836472Italici104857621474836471Underlineu10485762147483647YESYES2147483647Bigger+104857621474836473Smaller-104857621474836474YESYES2147483647Kern2147483647submenuAction:KernYESUse Default2147483647Use None2147483647Tighten2147483647Loosen2147483647Ligature2147483647submenuAction:LigatureYESUse Default2147483647Use None2147483647Use All2147483647Baseline2147483647submenuAction:BaselineYESUse Default2147483647Superscript2147483647Subscript2147483647Raise2147483647Lower2147483647YESYES2147483647Show ColorsC10485762147483647YESYES2147483647Copy Stylec15728642147483647Paste Stylev15728642147483647_NSFontMenuText2147483647submenuAction:TextYESAlign Left{10485762147483647Center|10485762147483647Justify2147483647Align Right}10485762147483647YESYES2147483647Writing Direction2147483647submenuAction:Writing DirectionYESYESParagraph2147483647CURlZmF1bHQ2147483647CUxlZnQgdG8gUmlnaHQ2147483647CVJpZ2h0IHRvIExlZnQ2147483647YESYES2147483647YESSelection2147483647CURlZmF1bHQ2147483647CUxlZnQgdG8gUmlnaHQ2147483647CVJpZ2h0IHRvIExlZnQ2147483647YESYES2147483647Show Ruler2147483647Copy Rulerc13107202147483647Paste Rulerv13107202147483647View10485762147483647submenuAction:ViewYESShow Toolbart15728642147483647Customize Toolbar…10485762147483647Window10485762147483647submenuAction:WindowYESMinimizem10485762147483647Zoom10485762147483647YESYES10485762147483647Bring All to Front10485762147483647_NSWindowsMenuHelp2147483647submenuAction:HelpYESTimeLab Help?10485762147483647_NSHelpMenu_NSMainMenu72{{335, 315}, {583, 435}}1954021376Timer TestNSWindow{1.79769e+308, 1.79769e+308}256YES268{{73, 236}, {278, 148}}YES714337280-595929600US/PacificVFppZgAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABAAAAAAAAAC5AAAABAAAABCepkign7sVkKCGKqChmveQ
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 %zLucidaGrande1310440.023816SystemcontrolBackgroundColor3MC42NjY2NjY2NjY3AA6SystemcontrolTextColor3MAA268{{241, 393}, {104, 27}}YES714337280-595929600US/PacificVFppZgAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABAAAAAAAAAC5AAAABAAAABCepkign7sVkKCGKqChmveQ
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 %z0.014268{{94, 393}, {104, 27}}YES714337280-595929600US/PacificVFppZgAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABAAAAAAAAAC5AAAABAAAABCepkign7sVkKCGKqChmveQ
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 %z0.0224268{{17, 154}, {135, 17}}YES6828806471304192Date when timer set:6SystemcontrolColor268{{17, 129}, {135, 17}}YES6828806471304192Initial fire date:268{{17, 104}, {135, 17}}YES6828806471304192Current fire date:268{{17, 79}, {135, 17}}YES6828806471304192Actual fire date:268{{393, 292}, {107, 32}}YES67239424134217728Start timer-203828403312920025268{{238, 12}, {107, 32}}YES67239424134217728Refresh-203828403312920025268{{384, 154}, {182, 17}}YES68288064-2009070592YESYESdateStyleformatterBehaviortimeStyleYESMMM d, yyyy h:mm:ss aNO268{{384, 129}, {182, 17}}YES68288064-2009070592YESYESdateStyleformatterBehaviortimeStyleYESMMM d, yyyy h:mm:ss aNO268{{384, 104}, {182, 17}}YES68288064-2009070592YESYESdateStyleformatterBehaviortimeStyleYESMMM d, yyyy h:mm:ss aNO268{{384, 79}, {182, 17}}YES68288064-2009070592YESYESdateStyleformatterBehaviortimeStyleYESMMM d, yyyy h:mm:ss aNO268{{171, 154}, {182, 17}}YES68288064-2009070592YESYESdateStyleformatterBehaviortimeStyleYESMMM d, yyyy h:mm:ss aNO268{{171, 129}, {182, 17}}YES68288064-2009070592YESYESdateStyleformatterBehaviortimeStyleYESMMM d, yyyy h:mm:ss aNO268{{171, 104}, {182, 17}}YES68288064-2009070592YESYESdateStyleformatterBehaviortimeStyleYESMMM d, yyyy h:mm:ss aNO268{{171, 79}, {182, 17}}YES68288064-2009070592YESYESdateStyleformatterBehaviortimeStyleYESMMM d, yyyy h:mm:ss aNO268{{216, 179}, {91, 17}}YES68288064272630784Normal Timer268{{424, 179}, {101, 17}}YES68288064272630784Absolute Timer12{{20, 215}, {543, 5}}{0, 0}672394240Box6SystemtextBackgroundColor3MQA3MCAwLjgwMDAwMDAxMTkAA320NO{583, 435}{{0, 0}, {1920, 1178}}{1.79769e+308, 1.79769e+308}TimerLabAppDelegateNSFontManagerYESperformMiniaturize:37arrangeInFront:39print:86runPageLayout:87clearRecentDocuments:127orderFrontStandardAboutPanel:142performClose:193toggleContinuousSpellChecking:222undo:223copy:224checkSpelling:225paste:226stopSpeaking:227cut:228showGuessPanel:230redo:231selectAll:232startSpeaking:233delete:235performZoom:240performFindPanelAction:241centerSelectionInVisibleArea:245toggleGrammarChecking:347toggleSmartInsertDelete:355toggleAutomaticQuoteSubstitution:356toggleAutomaticLinkDetection:357saveDocument:362saveDocumentAs:363revertDocumentToSaved:364runToolbarCustomizationPalette:365toggleToolbarShown:366hide:367hideOtherApplications:368unhideAllApplications:370newDocument:373openDocument:374addFontTrait:421addFontTrait:422modifyFont:423orderFrontFontPanel:424modifyFont:425raiseBaseline:426lowerBaseline:427copyFont:428subscript:429superscript:430tightenKerning:431underline:432orderFrontColorPanel:433useAllLigatures:434loosenKerning:435pasteFont:436unscript:437useStandardKerning:438useStandardLigatures:439turnOffLigatures:440turnOffKerning:441terminate:449toggleAutomaticSpellingCorrection:456orderFrontSubstitutionsPanel:458toggleAutomaticDashSubstitution:461toggleAutomaticTextReplacement:463uppercaseWord:464capitalizeWord:467lowercaseWord:468pasteAsPlainText:486performFindPanelAction:487performFindPanelAction:488performFindPanelAction:489showHelp:493delegate495alignCenter:518pasteRuler:519toggleRuler:520alignRight:521copyRuler:522alignJustified:523alignLeft:524makeBaseWritingDirectionNatural:525makeBaseWritingDirectionLeftToRight:526makeBaseWritingDirectionRightToLeft:527makeTextWritingDirectionNatural:528makeTextWritingDirectionLeftToRight:529makeTextWritingDirectionRightToLeft:530_window533_initialDateField558_picker562startTimer:563_timePicker577_datePicker578_initialFireDateField607_regularInitialDateField611_regularInitialFireDateField612_regularCurrentFireDateField613_regularFireDateField614_currentFireDateField615_fireDateField616refresh:617syncPickers:618syncPickers:619syncPickers:620YES0-2File's Owner-1First Responder-3Application29YES19YES56YES217YES83YES81YES7580787282124YES77737911274125YES126205YES202198207214199203197206215218YES216YES200YES219201204220YES21321022120820957YES58134150136144129143236131YES14914513024YES92523923295YES296YES297298211YES212YES195196346348YES349YES350351354371YES372YES375YES376YES377YES388YES389390391392393394395396397YES398YES399YES400401402403404405YES406407408409410411YES412413414415YES416417418419420450YES451YES452453454457459460462465466485490YES491YES492494496YES497YES498499500501502503YES504505506507508YES509510511512513514515516517534YES535536YES537538YES539540YES541542YES543544YES545546YES547548YES549550YES551YES564565YES566YES567568YES569YES570571YES572YES573591YES592593YES594YES595YES596YES597YES598599YES600601YES602603YES604605YES606608YES609621YESYES-3.IBPluginDependency112.IBPluginDependency112.ImportedFromIB2124.IBPluginDependency124.ImportedFromIB2125.IBPluginDependency125.ImportedFromIB2125.editorWindowContentRectSynchronizationRect126.IBPluginDependency126.ImportedFromIB2129.IBPluginDependency129.ImportedFromIB2130.IBPluginDependency130.ImportedFromIB2130.editorWindowContentRectSynchronizationRect131.IBPluginDependency131.ImportedFromIB2134.IBPluginDependency134.ImportedFromIB2136.IBPluginDependency136.ImportedFromIB2143.IBPluginDependency143.ImportedFromIB2144.IBPluginDependency144.ImportedFromIB2145.IBPluginDependency145.ImportedFromIB2149.IBPluginDependency149.ImportedFromIB2150.IBPluginDependency150.ImportedFromIB219.IBPluginDependency19.ImportedFromIB2195.IBPluginDependency195.ImportedFromIB2196.IBPluginDependency196.ImportedFromIB2197.IBPluginDependency197.ImportedFromIB2198.IBPluginDependency198.ImportedFromIB2199.IBPluginDependency199.ImportedFromIB2200.IBEditorWindowLastContentRect200.IBPluginDependency200.ImportedFromIB2200.editorWindowContentRectSynchronizationRect201.IBPluginDependency201.ImportedFromIB2202.IBPluginDependency202.ImportedFromIB2203.IBPluginDependency203.ImportedFromIB2204.IBPluginDependency204.ImportedFromIB2205.IBEditorWindowLastContentRect205.IBPluginDependency205.ImportedFromIB2205.editorWindowContentRectSynchronizationRect206.IBPluginDependency206.ImportedFromIB2207.IBPluginDependency207.ImportedFromIB2208.IBPluginDependency208.ImportedFromIB2209.IBPluginDependency209.ImportedFromIB2210.IBPluginDependency210.ImportedFromIB2211.IBPluginDependency211.ImportedFromIB2212.IBPluginDependency212.ImportedFromIB2212.editorWindowContentRectSynchronizationRect213.IBPluginDependency213.ImportedFromIB2214.IBPluginDependency214.ImportedFromIB2215.IBPluginDependency215.ImportedFromIB2216.IBPluginDependency216.ImportedFromIB2217.IBPluginDependency217.ImportedFromIB2218.IBPluginDependency218.ImportedFromIB2219.IBPluginDependency219.ImportedFromIB2220.IBEditorWindowLastContentRect220.IBPluginDependency220.ImportedFromIB2220.editorWindowContentRectSynchronizationRect221.IBPluginDependency221.ImportedFromIB223.IBPluginDependency23.ImportedFromIB2236.IBPluginDependency236.ImportedFromIB2239.IBPluginDependency239.ImportedFromIB224.IBEditorWindowLastContentRect24.IBPluginDependency24.ImportedFromIB224.editorWindowContentRectSynchronizationRect29.IBEditorWindowLastContentRect29.IBPluginDependency29.ImportedFromIB229.WindowOrigin29.editorWindowContentRectSynchronizationRect295.IBPluginDependency296.IBEditorWindowLastContentRect296.IBPluginDependency296.editorWindowContentRectSynchronizationRect297.IBPluginDependency298.IBPluginDependency346.IBPluginDependency346.ImportedFromIB2348.IBPluginDependency348.ImportedFromIB2349.IBEditorWindowLastContentRect349.IBPluginDependency349.ImportedFromIB2349.editorWindowContentRectSynchronizationRect350.IBPluginDependency350.ImportedFromIB2351.IBPluginDependency351.ImportedFromIB2354.IBPluginDependency354.ImportedFromIB2371.IBEditorWindowLastContentRect371.IBPluginDependency371.IBWindowTemplateEditedContentRect371.NSWindowTemplate.visibleAtLaunch371.editorWindowContentRectSynchronizationRect371.windowTemplate.maxSize372.IBPluginDependency375.IBPluginDependency376.IBEditorWindowLastContentRect376.IBPluginDependency377.IBPluginDependency388.IBEditorWindowLastContentRect388.IBPluginDependency389.IBPluginDependency390.IBPluginDependency391.IBPluginDependency392.IBPluginDependency393.IBPluginDependency394.IBPluginDependency395.IBPluginDependency396.IBPluginDependency397.IBPluginDependency398.IBPluginDependency399.IBPluginDependency400.IBPluginDependency401.IBPluginDependency402.IBPluginDependency403.IBPluginDependency404.IBPluginDependency405.IBPluginDependency406.IBPluginDependency407.IBPluginDependency408.IBPluginDependency409.IBPluginDependency410.IBPluginDependency411.IBPluginDependency412.IBPluginDependency413.IBPluginDependency414.IBPluginDependency415.IBPluginDependency416.IBPluginDependency417.IBPluginDependency418.IBPluginDependency419.IBPluginDependency450.IBPluginDependency451.IBEditorWindowLastContentRect451.IBPluginDependency452.IBPluginDependency453.IBPluginDependency454.IBPluginDependency457.IBPluginDependency459.IBPluginDependency460.IBPluginDependency462.IBPluginDependency465.IBPluginDependency466.IBPluginDependency485.IBPluginDependency490.IBPluginDependency491.IBEditorWindowLastContentRect491.IBPluginDependency492.IBPluginDependency496.IBPluginDependency497.IBEditorWindowLastContentRect497.IBPluginDependency498.IBPluginDependency499.IBPluginDependency5.IBPluginDependency5.ImportedFromIB2500.IBPluginDependency501.IBPluginDependency502.IBPluginDependency503.IBPluginDependency504.IBPluginDependency505.IBPluginDependency506.IBPluginDependency507.IBPluginDependency508.IBEditorWindowLastContentRect508.IBPluginDependency509.IBPluginDependency510.IBPluginDependency511.IBPluginDependency512.IBPluginDependency513.IBPluginDependency514.IBPluginDependency515.IBPluginDependency516.IBPluginDependency517.IBPluginDependency534.IBPluginDependency535.IBPluginDependency536.IBPluginDependency537.IBPluginDependency538.IBPluginDependency539.IBPluginDependency540.IBAttributePlaceholdersKey540.IBPluginDependency541.IBPluginDependency542.IBAttributePlaceholdersKey542.IBPluginDependency543.IBPluginDependency544.IBAttributePlaceholdersKey544.IBPluginDependency545.IBPluginDependency546.IBAttributePlaceholdersKey546.IBPluginDependency547.IBPluginDependency548.IBAttributePlaceholdersKey548.IBPluginDependency549.IBPluginDependency550.IBPluginDependency551.IBPluginDependency56.IBPluginDependency56.ImportedFromIB2564.IBDateFormatterBehaviorMetadataKey564.IBPluginDependency565.IBPluginDependency566.IBPluginDependency567.IBDateFormatterBehaviorMetadataKey567.IBPluginDependency568.IBPluginDependency569.IBPluginDependency57.IBEditorWindowLastContentRect57.IBPluginDependency57.ImportedFromIB257.editorWindowContentRectSynchronizationRect570.IBDateFormatterBehaviorMetadataKey570.IBPluginDependency571.IBPluginDependency572.IBPluginDependency573.IBDateFormatterBehaviorMetadataKey573.IBPluginDependency58.IBPluginDependency58.ImportedFromIB2591.IBPluginDependency592.IBPluginDependency593.IBPluginDependency594.IBPluginDependency595.IBPluginDependency596.IBPluginDependency597.IBPluginDependency598.IBDateFormatterBehaviorMetadataKey598.IBPluginDependency599.IBPluginDependency600.IBDateFormatterBehaviorMetadataKey600.IBPluginDependency601.IBPluginDependency602.IBDateFormatterBehaviorMetadataKey602.IBPluginDependency603.IBPluginDependency604.IBDateFormatterBehaviorMetadataKey604.IBPluginDependency605.IBPluginDependency606.IBPluginDependency608.IBAttributePlaceholdersKey608.IBPluginDependency609.IBPluginDependency621.IBPluginDependency72.IBPluginDependency72.ImportedFromIB273.IBPluginDependency73.ImportedFromIB274.IBPluginDependency74.ImportedFromIB275.IBPluginDependency75.ImportedFromIB277.IBPluginDependency77.ImportedFromIB278.IBPluginDependency78.ImportedFromIB279.IBPluginDependency79.ImportedFromIB280.IBPluginDependency80.ImportedFromIB281.IBEditorWindowLastContentRect81.IBPluginDependency81.ImportedFromIB281.editorWindowContentRectSynchronizationRect82.IBPluginDependency82.ImportedFromIB283.IBPluginDependency83.ImportedFromIB292.IBPluginDependency92.ImportedFromIB2YEScom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugin{{522, 812}, {146, 23}}com.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugin{{436, 809}, {64, 6}}com.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugin{{753, 187}, {275, 113}}com.apple.InterfaceBuilder.CocoaPlugin{{608, 612}, {275, 83}}com.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugin{{547, 180}, {254, 283}}com.apple.InterfaceBuilder.CocoaPlugin{{187, 434}, {243, 243}}com.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugin{{608, 612}, {167, 43}}com.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugin{{753, 217}, {238, 103}}com.apple.InterfaceBuilder.CocoaPlugin{{608, 612}, {241, 103}}com.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.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.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugin{{746, 287}, {220, 133}}com.apple.InterfaceBuilder.CocoaPlugin{{608, 612}, {215, 63}}com.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.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.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugin{{591, 420}, {83, 43}}com.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugin{{523, 2}, {178, 283}}com.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugin{{753, 197}, {170, 63}}com.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugin{{725, 289}, {246, 23}}com.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugin{{674, 260}, {204, 183}}com.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugin{{878, 180}, {164, 173}}com.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPluginToolTipToolTipDate when you started the timercom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPluginToolTipToolTipThe initial date that was set for the timer to firecom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPluginToolTipToolTipWhat the timer currently considers to be its fire timecom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPluginToolTipToolTipThe date the timer actually firescom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPluginToolTipToolTipStart a timer using the time indicated on the left.com.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugin{{286, 129}, {275, 183}}com.apple.InterfaceBuilder.CocoaPlugin{{23, 794}, {245, 183}}com.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPluginToolTipToolTipClick to refresh the current fire date. Should normally update itself after time-changing events but you can do it manually here.com.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugin{{452, 109}, {196, 203}}com.apple.InterfaceBuilder.CocoaPlugin{{145, 474}, {199, 203}}com.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPluginYESYESYESYES621YESNSObjectIBProjectSourceNSObject-NoodlePerformWhenIdle.hNSObjectIBProjectSourceNSTableView-NoodleExtensions.hNSResponderYESYEScancelModal:confirmModal:YESididIBProjectSourceNSResponder-NoodleModalExtensions.hNSTableViewscrollToStickyRow:idNSWindowYESYEScancelModal:confirmModal:YESididNSWindowIBProjectSourceNSWindow-NoodleEffects.hTimerLabAppDelegateNSObjectYESYESrefresh:startTimer:syncPickers:YESidididYESYES_currentFireDateField_datePicker_fireDateField_initialDateField_initialFireDateField_picker_regularCurrentFireDateField_regularFireDateField_regularInitialDateField_regularInitialFireDateField_timePicker_windowwindowYESNSTextFieldNSDatePickerNSTextFieldNSTextFieldNSTextFieldNSDatePickerNSTextFieldNSTextFieldNSTextFieldNSTextFieldNSDatePickerNSWindowNSWindowIBProjectSourceExamples/TimerLab/TimerLabAppDelegate.hYESNSActionCellNSCellIBFrameworkSourceAppKit.framework/Headers/NSActionCell.hNSApplicationNSResponderIBFrameworkSourceAppKit.framework/Headers/NSApplication.hNSApplicationIBFrameworkSourceAppKit.framework/Headers/NSApplicationScripting.hNSApplicationIBFrameworkSourceAppKit.framework/Headers/NSColorPanel.hNSApplicationIBFrameworkSourceAppKit.framework/Headers/NSHelpManager.hNSApplicationIBFrameworkSourceAppKit.framework/Headers/NSPageLayout.hNSApplicationIBFrameworkSourceAppKit.framework/Headers/NSUserInterfaceItemSearching.hNSBoxNSViewIBFrameworkSourceAppKit.framework/Headers/NSBox.hNSBrowserNSControlIBFrameworkSourceAppKit.framework/Headers/NSBrowser.hNSButtonNSControlIBFrameworkSourceAppKit.framework/Headers/NSButton.hNSButtonCellNSActionCellIBFrameworkSourceAppKit.framework/Headers/NSButtonCell.hNSCellNSObjectIBFrameworkSourceAppKit.framework/Headers/NSCell.hNSControlNSViewIBFrameworkSourceAppKit.framework/Headers/NSControl.hNSDateFormatterNSFormatterIBFrameworkSourceFoundation.framework/Headers/NSDateFormatter.hNSDatePickerNSControlIBFrameworkSourceAppKit.framework/Headers/NSDatePicker.hNSDatePickerCellNSActionCellIBFrameworkSourceAppKit.framework/Headers/NSDatePickerCell.hNSDocumentNSObjectYESYESprintDocument:revertDocumentToSaved:runPageLayout:saveDocument:saveDocumentAs:saveDocumentTo:YESididididididIBFrameworkSourceAppKit.framework/Headers/NSDocument.hNSDocumentIBFrameworkSourceAppKit.framework/Headers/NSDocumentScripting.hNSDocumentControllerNSObjectYESYESclearRecentDocuments:newDocument:openDocument:saveAllDocuments:YESididididIBFrameworkSourceAppKit.framework/Headers/NSDocumentController.hNSFontManagerNSObjectIBFrameworkSourceAppKit.framework/Headers/NSFontManager.hNSFormatterNSObjectIBFrameworkSourceFoundation.framework/Headers/NSFormatter.hNSMatrixNSControlIBFrameworkSourceAppKit.framework/Headers/NSMatrix.hNSMenuNSObjectIBFrameworkSourceAppKit.framework/Headers/NSMenu.hNSMenuItemNSObjectIBFrameworkSourceAppKit.framework/Headers/NSMenuItem.hNSMovieViewNSViewIBFrameworkSourceAppKit.framework/Headers/NSMovieView.hNSObjectIBFrameworkSourceAppKit.framework/Headers/NSAccessibility.hNSObjectNSObjectNSObjectNSObjectNSObjectIBFrameworkSourceAppKit.framework/Headers/NSDictionaryController.hNSObjectIBFrameworkSourceAppKit.framework/Headers/NSDragging.hNSObjectNSObjectIBFrameworkSourceAppKit.framework/Headers/NSFontPanel.hNSObjectIBFrameworkSourceAppKit.framework/Headers/NSKeyValueBinding.hNSObjectNSObjectIBFrameworkSourceAppKit.framework/Headers/NSNibLoading.hNSObjectIBFrameworkSourceAppKit.framework/Headers/NSOutlineView.hNSObjectIBFrameworkSourceAppKit.framework/Headers/NSPasteboard.hNSObjectIBFrameworkSourceAppKit.framework/Headers/NSSavePanel.hNSObjectIBFrameworkSourceAppKit.framework/Headers/NSTableView.hNSObjectIBFrameworkSourceAppKit.framework/Headers/NSToolbarItem.hNSObjectIBFrameworkSourceAppKit.framework/Headers/NSView.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSArchiver.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSClassDescription.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSError.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSFileManager.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSKeyValueCoding.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSKeyValueObserving.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSKeyedArchiver.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSObject.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSObjectScripting.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSPortCoder.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSRunLoop.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSScriptClassDescription.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSScriptKeyValueCoding.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSScriptObjectSpecifiers.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSScriptWhoseTests.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSThread.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSURL.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSURLConnection.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSURLDownload.hNSResponderIBFrameworkSourceAppKit.framework/Headers/NSInterfaceStyle.hNSResponderNSObjectIBFrameworkSourceAppKit.framework/Headers/NSResponder.hNSTableViewNSControlNSTextNSViewIBFrameworkSourceAppKit.framework/Headers/NSText.hNSTextFieldNSControlIBFrameworkSourceAppKit.framework/Headers/NSTextField.hNSTextFieldCellNSActionCellIBFrameworkSourceAppKit.framework/Headers/NSTextFieldCell.hNSTextViewNSTextIBFrameworkSourceAppKit.framework/Headers/NSTextView.hNSViewIBFrameworkSourceAppKit.framework/Headers/NSClipView.hNSViewNSViewIBFrameworkSourceAppKit.framework/Headers/NSRulerView.hNSViewNSResponderNSWindowIBFrameworkSourceAppKit.framework/Headers/NSDrawer.hNSWindowNSResponderIBFrameworkSourceAppKit.framework/Headers/NSWindow.hNSWindowIBFrameworkSourceAppKit.framework/Headers/NSWindowScripting.h0IBCocoaFrameworkcom.apple.InterfaceBuilder.CocoaPlugin.macosxcom.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3YES../../../NoodleKit.xcodeproj3YESYESNSMenuCheckmarkNSMenuMixedStateYES{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
================================================
CFBundleDevelopmentRegionEnglishCFBundleExecutable${EXECUTABLE_NAME}CFBundleIdentifiercom.yourcompany.${PRODUCT_NAME:rfc1034identifier}CFBundleInfoDictionaryVersion6.0CFBundlePackageTypeAPPLCFBundleShortVersionString1.0CFBundleSignature????CFBundleVersion1LSMinimumSystemVersion${MACOSX_DEPLOYMENT_TARGET}NSMainNibFileMainMenuNSPrincipalClassNSApplication
================================================
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
================================================
105010B5047321038.2437.00com.apple.InterfaceBuilder.CocoaPlugin732YESYEScom.apple.InterfaceBuilder.CocoaPluginYESYESYESYESNSApplicationFirstResponderNSApplication312{{286, 641}, {214, 130}}-1065877504WindowNSWindowView{1.79769e+308, 1.79769e+308}{213, 107}256YES256{{51, 52}, {112, 32}}YES67239424134217728Zoom!LucidaGrande131044-2038284033120025{214, 130}{{0, 0}, {1920, 1178}}{213, 129}{1.79769e+308, 1.79769e+308}MainMenuYESNewApplication10485762147483647NSImageNSMenuCheckmarkNSImageNSMenuMixedStatesubmenuAction:NewApplicationYESAbout NewApplication2147483647YESYES10485762147483647Preferences…,10485762147483647YESYES10485762147483647Services10485762147483647submenuAction:ServicesYES_NSServicesMenuYESYES10485762147483647Hide NewApplicationh10485762147483647Hide Othersh15728642147483647Show All10485762147483647YESYES10485762147483647Quit NewApplicationq10485762147483647_NSAppleMenuFile10485762147483647submenuAction:FileYESNewn10485762147483647Open...o10485762147483647Open Recent10485762147483647submenuAction:Open RecentYESClear Menu10485762147483647_NSRecentDocumentsMenuYESYES10485762147483647Closew10485762147483647Saves10485762147483647Save As…S10485762147483647Revert2147483647YESYES10485762147483647Page Setup…P10485762147483647Print…p10485762147483647Edit10485762147483647submenuAction:EditYESUndoz10485762147483647RedoZ10485762147483647YESYES10485762147483647Cutx10485762147483647Copyc10485762147483647Pastev10485762147483647Paste and Match StyleV15728642147483647Delete10485762147483647Select Alla10485762147483647YESYES10485762147483647Find10485762147483647submenuAction:FindYESFind…f104857621474836471Find Nextg104857621474836472Find PreviousG104857621474836473Use Selection for Finde104857621474836477Jump to Selectionj10485762147483647Spelling10485762147483647submenuAction:SpellingYESSpelling…:10485762147483647Check Spelling;10485762147483647Check Spelling as You Type10485762147483647Window10485762147483647submenuAction:WindowYESMinimizem10485762147483647Zoom10485762147483647YESYES10485762147483647Bring All to Front10485762147483647_NSWindowsMenuHelp10485762147483647submenuAction:HelpYESNewApplication Help?10485762147483647_NSMainMenuController82232{{235, 324}, {374, 235}}611844096WindowNSPanel{1.79769e+308, 1.79769e+308}256YES268{{17, 88}, {340, 64}}YES67239424138412032hi!LucidaGrande48166SystemcontrolColor3MC42NjY2NjY2NjY3AA3MQA2{374, 235}{{0, 0}, {1920, 1178}}{1.79769e+308, 1.79769e+308}YESperformMiniaturize:37arrangeInFront:39print:86runPageLayout:87showHelp:122clearRecentDocuments:127terminate:139orderFrontStandardAboutPanel:142hideOtherApplications:146hide:152unhideAllApplications:153cut:175paste:176redo:178selectAll:179undo:180copy:181showGuessPanel:188checkSpelling:190toggleContinuousSpellChecking:192performClose:193delete:195performZoom:198performFindPanelAction:199performFindPanelAction:200performFindPanelAction:201performFindPanelAction:202centerSelectionInVisibleArea:203pasteAsPlainText:205toggleWindow:232_window251YES0-2File's Owner-1First Responder21YESWindow2YES206YES29YESMainMenu19YES24YES5239219756YES57YES58129131YES13013413614314414514915019683YES81YES727374757778798082112124YES125YES126103YES106YES111163YES169YES156157158160164168YES159YES154155161162167171172173174184YES185YES187189191204227Controller238-3Application248YES249YES254YES255YESYES-3.IBPluginDependency103.IBPluginDependency103.ImportedFromIB2106.IBPluginDependency106.ImportedFromIB2111.IBPluginDependency111.ImportedFromIB2112.IBPluginDependency112.ImportedFromIB2124.IBPluginDependency124.ImportedFromIB2125.IBPluginDependency125.ImportedFromIB2126.IBPluginDependency126.ImportedFromIB2129.IBPluginDependency129.ImportedFromIB2130.IBPluginDependency130.ImportedFromIB2131.IBPluginDependency131.ImportedFromIB2134.IBPluginDependency134.ImportedFromIB2136.IBPluginDependency136.ImportedFromIB2143.IBPluginDependency143.ImportedFromIB2144.IBPluginDependency144.ImportedFromIB2145.IBPluginDependency145.ImportedFromIB2149.IBPluginDependency149.ImportedFromIB2150.IBPluginDependency150.ImportedFromIB2154.IBPluginDependency154.ImportedFromIB2155.IBPluginDependency155.ImportedFromIB2156.IBPluginDependency156.ImportedFromIB2157.IBPluginDependency157.ImportedFromIB2158.IBPluginDependency158.ImportedFromIB2159.IBPluginDependency159.ImportedFromIB2160.IBPluginDependency160.ImportedFromIB2161.IBPluginDependency161.ImportedFromIB2162.IBPluginDependency162.ImportedFromIB2163.IBPluginDependency163.ImportedFromIB2164.IBPluginDependency164.ImportedFromIB2167.IBPluginDependency167.ImportedFromIB2168.IBPluginDependency168.ImportedFromIB2169.IBPluginDependency169.ImportedFromIB2171.IBPluginDependency171.ImportedFromIB2172.IBPluginDependency172.ImportedFromIB2173.IBPluginDependency173.ImportedFromIB2174.IBPluginDependency174.ImportedFromIB2184.IBPluginDependency184.ImportedFromIB2185.IBPluginDependency185.ImportedFromIB2187.IBPluginDependency187.ImportedFromIB2189.IBPluginDependency189.ImportedFromIB219.IBPluginDependency19.ImportedFromIB2191.IBPluginDependency191.ImportedFromIB2196.IBPluginDependency196.ImportedFromIB2197.IBPluginDependency197.ImportedFromIB22.IBPluginDependency2.ImportedFromIB2204.IBPluginDependency204.ImportedFromIB2206.IBPluginDependency206.ImportedFromIB221.IBEditorWindowLastContentRect21.IBPluginDependency21.IBWindowTemplateEditedContentRect21.ImportedFromIB221.NSWindowTemplate.visibleAtLaunch21.windowTemplate.hasMinSize21.windowTemplate.minSize227.ImportedFromIB223.IBPluginDependency23.ImportedFromIB2238.IBPluginDependency24.IBPluginDependency24.ImportedFromIB2248.IBEditorWindowLastContentRect248.IBPluginDependency248.IBWindowTemplateEditedContentRect248.NSWindowTemplate.visibleAtLaunch249.IBPluginDependency254.IBPluginDependency255.IBPluginDependency29.IBEditorWindowLastContentRect29.IBPluginDependency29.ImportedFromIB25.IBPluginDependency5.ImportedFromIB256.IBPluginDependency56.ImportedFromIB257.IBPluginDependency57.ImportedFromIB258.IBPluginDependency58.ImportedFromIB272.IBPluginDependency72.ImportedFromIB273.IBPluginDependency73.ImportedFromIB274.IBPluginDependency74.ImportedFromIB275.IBPluginDependency75.ImportedFromIB277.IBPluginDependency77.ImportedFromIB278.IBPluginDependency78.ImportedFromIB279.IBPluginDependency79.ImportedFromIB280.IBPluginDependency80.ImportedFromIB281.IBPluginDependency81.ImportedFromIB282.IBPluginDependency82.ImportedFromIB283.IBPluginDependency83.ImportedFromIB292.IBPluginDependency92.ImportedFromIB2YEScom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugin{{84, 912}, {214, 130}}com.apple.InterfaceBuilder.CocoaPlugin{{84, 912}, {214, 130}}{213, 107}com.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugin{{119, 699}, {374, 235}}com.apple.InterfaceBuilder.CocoaPlugin{{119, 699}, {374, 235}}com.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugin{{42, 1057}, {362, 20}}com.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPluginYESYESYESYES255YESControllerNSObjectYESYESscriptViewscrollViewYESNSTextViewNSScrollViewIBProjectSourceExamples/LineNumberView/Controller.hControllerNSObjectYESYESdoModal:doSheet:YESididYESYESalertfieldwindowYESidididIBProjectSourceExamples/ModalResponder/Controller.hControllerNSObjectYESYES_iPhoneTableView_stickyRowTableViewYESNSTableViewNSTableViewIBProjectSourceExamples/StickyRowTableView Revue/Controller.hControllerNSObjecttoggleWindow:id_windowidIBProjectSourceExamples/Window Effects/Controller.hControllerNSObjectYESYESzoom:zoomOff:YESididIBUserSourceFirstResponderNSObjectIBUserSourceNSObjectIBProjectSourceNSObject-NoodlePerformWhenIdle.hNSObjectIBProjectSourceNoodleStickyRowTableView.hNSResponderYESYEScancelModal:confirmModal:YESididIBProjectSourceNSResponder-NoodleModalExtensions.hNSTableViewscrollToStickyRow:idNSWindowYESYEScancelModal:confirmModal:YESididNSWindowIBProjectSourceNSWindow-NoodleEffects.hYESNSActionCellNSCellIBFrameworkSourceAppKit.framework/Headers/NSActionCell.hNSApplicationNSResponderIBFrameworkSourceAppKit.framework/Headers/NSApplication.hNSApplicationIBFrameworkSourceAppKit.framework/Headers/NSApplicationScripting.hNSApplicationIBFrameworkSourceAppKit.framework/Headers/NSColorPanel.hNSApplicationIBFrameworkSourceAppKit.framework/Headers/NSHelpManager.hNSApplicationIBFrameworkSourceAppKit.framework/Headers/NSPageLayout.hNSApplicationIBFrameworkSourceAppKit.framework/Headers/NSUserInterfaceItemSearching.hNSBrowserNSControlIBFrameworkSourceAppKit.framework/Headers/NSBrowser.hNSButtonNSControlIBFrameworkSourceAppKit.framework/Headers/NSButton.hNSButtonCellNSActionCellIBFrameworkSourceAppKit.framework/Headers/NSButtonCell.hNSCellNSObjectIBFrameworkSourceAppKit.framework/Headers/NSCell.hNSControlNSViewIBFrameworkSourceAppKit.framework/Headers/NSControl.hNSDocumentNSObjectYESYESprintDocument:revertDocumentToSaved:runPageLayout:saveDocument:saveDocumentAs:saveDocumentTo:YESididididididIBFrameworkSourceAppKit.framework/Headers/NSDocument.hNSDocumentIBFrameworkSourceAppKit.framework/Headers/NSDocumentScripting.hNSDocumentControllerNSObjectYESYESclearRecentDocuments:newDocument:openDocument:saveAllDocuments:YESididididIBFrameworkSourceAppKit.framework/Headers/NSDocumentController.hNSFormatterNSObjectIBFrameworkSourceFoundation.framework/Headers/NSFormatter.hNSMatrixNSControlIBFrameworkSourceAppKit.framework/Headers/NSMatrix.hNSMenuNSObjectIBFrameworkSourceAppKit.framework/Headers/NSMenu.hNSMenuItemNSObjectIBFrameworkSourceAppKit.framework/Headers/NSMenuItem.hNSMovieViewNSViewIBFrameworkSourceAppKit.framework/Headers/NSMovieView.hNSObjectIBFrameworkSourceAppKit.framework/Headers/NSAccessibility.hNSObjectNSObjectNSObjectNSObjectNSObjectIBFrameworkSourceAppKit.framework/Headers/NSDictionaryController.hNSObjectIBFrameworkSourceAppKit.framework/Headers/NSDragging.hNSObjectIBFrameworkSourceAppKit.framework/Headers/NSFontManager.hNSObjectIBFrameworkSourceAppKit.framework/Headers/NSFontPanel.hNSObjectIBFrameworkSourceAppKit.framework/Headers/NSKeyValueBinding.hNSObjectNSObjectIBFrameworkSourceAppKit.framework/Headers/NSNibLoading.hNSObjectIBFrameworkSourceAppKit.framework/Headers/NSOutlineView.hNSObjectIBFrameworkSourceAppKit.framework/Headers/NSPasteboard.hNSObjectIBFrameworkSourceAppKit.framework/Headers/NSSavePanel.hNSObjectIBFrameworkSourceAppKit.framework/Headers/NSTableView.hNSObjectIBFrameworkSourceAppKit.framework/Headers/NSToolbarItem.hNSObjectIBFrameworkSourceAppKit.framework/Headers/NSView.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSArchiver.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSClassDescription.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSError.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSFileManager.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSKeyValueCoding.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSKeyValueObserving.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSKeyedArchiver.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSObject.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSObjectScripting.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSPortCoder.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSRunLoop.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSScriptClassDescription.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSScriptKeyValueCoding.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSScriptObjectSpecifiers.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSScriptWhoseTests.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSThread.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSURL.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSURLConnection.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSURLDownload.hNSPanelNSWindowIBFrameworkSourceAppKit.framework/Headers/NSPanel.hNSResponderIBFrameworkSourceAppKit.framework/Headers/NSInterfaceStyle.hNSResponderNSObjectIBFrameworkSourceAppKit.framework/Headers/NSResponder.hNSScrollViewNSViewIBFrameworkSourceAppKit.framework/Headers/NSScrollView.hNSTableViewNSControlNSTextNSViewIBFrameworkSourceAppKit.framework/Headers/NSText.hNSTextFieldNSControlIBFrameworkSourceAppKit.framework/Headers/NSTextField.hNSTextFieldCellNSActionCellIBFrameworkSourceAppKit.framework/Headers/NSTextFieldCell.hNSTextViewNSTextIBFrameworkSourceAppKit.framework/Headers/NSTextView.hNSViewIBFrameworkSourceAppKit.framework/Headers/NSClipView.hNSViewNSViewIBFrameworkSourceAppKit.framework/Headers/NSRulerView.hNSViewNSResponderNSWindowIBFrameworkSourceAppKit.framework/Headers/NSDrawer.hNSWindowNSResponderIBFrameworkSourceAppKit.framework/Headers/NSWindow.hNSWindowIBFrameworkSourceAppKit.framework/Headers/NSWindowScripting.h0com.apple.InterfaceBuilder.CocoaPlugin.macosxcom.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3YES../../../NoodleKit.xcodeproj3
================================================
FILE: Examples/Window Effects/Window Effects-Info.plist
================================================
CFBundleDevelopmentRegionEnglishCFBundleExecutable${EXECUTABLE_NAME}CFBundleIdentifiercom.noodlesoft.${PRODUCT_NAME:rfc1034identifier}CFBundleInfoDictionaryVersion6.0CFBundlePackageTypeAPPLCFBundleShortVersionString1.0CFBundleSignature????CFBundleVersion1LSMinimumSystemVersion${MACOSX_DEPLOYMENT_TARGET}NSMainNibFileMainMenuNSPrincipalClassNSApplication
================================================
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
================================================
105010B5047401038.2437.00com.apple.InterfaceBuilder.CocoaPlugin740YESYEScom.apple.InterfaceBuilder.CocoaPluginYESYESYESYESNSApplicationFirstResponderNSApplicationAMainMenuYESiToonz10485762147483647NSImageNSMenuCheckmarkNSImageNSMenuMixedStatesubmenuAction:iToonzYESAbout iToonz2147483647YESYES10485762147483647Preferences…,10485762147483647YESYES10485762147483647Services10485762147483647submenuAction:ServicesYES_NSServicesMenuYESYES10485762147483647Hide iToonzh10485762147483647Hide Othersh15728642147483647Show All10485762147483647YESYES10485762147483647Quit iToonzq10485762147483647_NSAppleMenuFile10485762147483647submenuAction:FileYESNewn10485762147483647Open…o10485762147483647Open Recent10485762147483647submenuAction:Open RecentYESClear Menu10485762147483647_NSRecentDocumentsMenuYESYES10485762147483647Closew10485762147483647Saves10485762147483647Save As…S11796482147483647Revert to Saved2147483647YESYES10485762147483647Page Setup...P11796482147483647Print…p10485762147483647Edit10485762147483647submenuAction:EditYESUndoz10485762147483647RedoZ11796482147483647YESYES10485762147483647Cutx10485762147483647Copyc10485762147483647Pastev10485762147483647Paste and Match StyleV15728642147483647Delete10485762147483647Select Alla10485762147483647YESYES10485762147483647Find10485762147483647submenuAction:FindYESFind…f104857621474836471Find Nextg104857621474836472Find PreviousG117964821474836473Use Selection for Finde104857621474836477Jump to Selectionj10485762147483647Spelling and Grammar10485762147483647submenuAction:Spelling and GrammarYESShow Spelling and Grammar:10485762147483647Check Document Now;10485762147483647YESYES2147483647Check Spelling While Typing10485762147483647Check Grammar With Spelling10485762147483647Correct Spelling Automatically2147483647Substitutions10485762147483647submenuAction:SubstitutionsYESShow Substitutions2147483647YESYES2147483647Smart Copy/Pastef104857621474836471Smart Quotesg104857621474836472Smart Dashes2147483647Smart LinksG117964821474836473Text Replacement2147483647Transformations2147483647submenuAction:TransformationsYESMake Upper Case2147483647Make Lower Case2147483647Capitalize2147483647Speech10485762147483647submenuAction:SpeechYESStart Speaking10485762147483647Stop Speaking10485762147483647Format2147483647submenuAction:FormatYESFont2147483647submenuAction:FontYESShow Fontst10485762147483647Boldb104857621474836472Italici104857621474836471Underlineu10485762147483647YESYES2147483647Bigger+104857621474836473Smaller-104857621474836474YESYES2147483647Kern2147483647submenuAction:KernYESUse Default2147483647Use None2147483647Tighten2147483647Loosen2147483647Ligature2147483647submenuAction:LigatureYESUse Default2147483647Use None2147483647Use All2147483647Baseline2147483647submenuAction:BaselineYESUse Default2147483647Superscript2147483647Subscript2147483647Raise2147483647Lower2147483647YESYES2147483647Show ColorsC10485762147483647YESYES2147483647Copy Stylec15728642147483647Paste Stylev15728642147483647_NSFontMenuText2147483647submenuAction:TextYESAlign Left{10485762147483647Center|10485762147483647Justify2147483647Align Right}10485762147483647YESYES2147483647Writing Direction2147483647submenuAction:Writing DirectionYESYESParagraph2147483647CURlZmF1bHQ2147483647CUxlZnQgdG8gUmlnaHQ2147483647CVJpZ2h0IHRvIExlZnQ2147483647YESYES2147483647YESSelection2147483647CURlZmF1bHQ2147483647CUxlZnQgdG8gUmlnaHQ2147483647CVJpZ2h0IHRvIExlZnQ2147483647YESYES2147483647Show Ruler2147483647Copy Rulerc13107202147483647Paste Rulerv13107202147483647View10485762147483647submenuAction:ViewYESShow Toolbart15728642147483647Customize Toolbar…10485762147483647Window10485762147483647submenuAction:WindowYESMinimizem10485762147483647Zoom10485762147483647YESYES10485762147483647Bring All to Front10485762147483647_NSWindowsMenuHelp2147483647submenuAction:HelpYESiToonz Help?10485762147483647_NSHelpMenu_NSMainMenu152{{335, 388}, {558, 362}}1954021376iToonzNSWindow{1.79769e+308, 1.79769e+308}256YES274YES2304YES256{516, 304}YES256{516, 17}-2147483392{{555, 0}, {16, 17}}YESArtist122103.4028234663852886e+38756280962048ArtistLucidaGrande1131006SystemheaderColor3MQA6SystemheaderTextColor3MAA67239488272630784TextLucidaGrande1310446SystemcontrolColor3MC42NjY2NjY2NjY3AA6SystemcontrolTextColor3YESYESArtwork101401000756280962048Artwork3MC4zMzMzMzI5ODU2AA6723942433554432100NO3YESYESAlbum134401000756280962048Album3377720962048Text Cell6SystemcontrolBackgroundColor3YESYESSong147103.4028234663852886e+38756280962048Song3377720962048Text Cell3YESYES326SystemgridColor3MC41AA20-15518924834150YES0{{1, 17}, {516, 304}}4-2147483392{{555, 17}, {15, 289}}_doScroller:0.95065789473684215-2147483392{{1, 306}, {569, 15}}1_doScroller:0.896103896103896070.880804953560371472304YES{{1, 0}, {516, 17}}4{{20, 20}, {518, 322}}562QSAAAEEgAABBsAAAQbAAAA{558, 362}{{0, 0}, {1920, 1178}}{1.79769e+308, 1.79769e+308}ControllerNSFontManagerYESperformMiniaturize:37arrangeInFront:39print:86runPageLayout:87clearRecentDocuments:127orderFrontStandardAboutPanel:142performClose:193toggleContinuousSpellChecking:222undo:223copy:224checkSpelling:225paste:226stopSpeaking:227cut:228showGuessPanel:230redo:231selectAll:232startSpeaking:233delete:235performZoom:240performFindPanelAction:241centerSelectionInVisibleArea:245toggleGrammarChecking:347toggleSmartInsertDelete:355toggleAutomaticQuoteSubstitution:356toggleAutomaticLinkDetection:357saveDocument:362saveDocumentAs:363revertDocumentToSaved:364runToolbarCustomizationPalette:365toggleToolbarShown:366hide:367hideOtherApplications:368unhideAllApplications:370newDocument:373openDocument:374addFontTrait:421addFontTrait:422modifyFont:423orderFrontFontPanel:424modifyFont:425raiseBaseline:426lowerBaseline:427copyFont:428subscript:429superscript:430tightenKerning:431underline:432orderFrontColorPanel:433useAllLigatures:434loosenKerning:435pasteFont:436unscript:437useStandardKerning:438useStandardLigatures:439turnOffLigatures:440turnOffKerning:441terminate:449toggleAutomaticSpellingCorrection:456orderFrontSubstitutionsPanel:458toggleAutomaticDashSubstitution:461toggleAutomaticTextReplacement:463uppercaseWord:464capitalizeWord:467lowercaseWord:468pasteAsPlainText:486performFindPanelAction:487performFindPanelAction:488performFindPanelAction:489showHelp:493delegate495alignCenter:518pasteRuler:519toggleRuler:520alignRight:521copyRuler:522alignJustified:523alignLeft:524makeBaseWritingDirectionNatural:525makeBaseWritingDirectionLeftToRight:526makeBaseWritingDirectionRightToLeft:527makeTextWritingDirectionNatural:528makeTextWritingDirectionLeftToRight:529makeTextWritingDirectionRightToLeft:530window532dataSource542_tableView544delegate548YES0-2File's Owner-1First Responder-3Application29YES19YES56YES217YES83YES81YES7580787282124YES77737911274125YES126205YES202198207214199203197206215218YES216YES200YES219201204220YES21321022120820957YES58134150136144129143236131YES14914513024YES92523923295YES296YES297298211YES212YES195196346348YES349YES350351354371YES372YES375YES376YES377YES388YES389390391392393394395396397YES398YES399YES400401402403404405YES406407408409410411YES412413414415YES416417418419420450YES451YES452453454457459460462465466485490YES491YES492494496YES497YES498499500501502503YES504505506507508YES509510511512513514515516517533YES534535536YES537538YES539YES540543546YES547549YES554YESYES-3.IBPluginDependency112.IBPluginDependency112.ImportedFromIB2124.IBPluginDependency124.ImportedFromIB2125.IBPluginDependency125.ImportedFromIB2125.editorWindowContentRectSynchronizationRect126.IBPluginDependency126.ImportedFromIB2129.IBPluginDependency129.ImportedFromIB2130.IBPluginDependency130.ImportedFromIB2130.editorWindowContentRectSynchronizationRect131.IBPluginDependency131.ImportedFromIB2134.IBPluginDependency134.ImportedFromIB2136.IBPluginDependency136.ImportedFromIB2143.IBPluginDependency143.ImportedFromIB2144.IBPluginDependency144.ImportedFromIB2145.IBPluginDependency145.ImportedFromIB2149.IBPluginDependency149.ImportedFromIB2150.IBPluginDependency150.ImportedFromIB219.IBPluginDependency19.ImportedFromIB2195.IBPluginDependency195.ImportedFromIB2196.IBPluginDependency196.ImportedFromIB2197.IBPluginDependency197.ImportedFromIB2198.IBPluginDependency198.ImportedFromIB2199.IBPluginDependency199.ImportedFromIB2200.IBEditorWindowLastContentRect200.IBPluginDependency200.ImportedFromIB2200.editorWindowContentRectSynchronizationRect201.IBPluginDependency201.ImportedFromIB2202.IBPluginDependency202.ImportedFromIB2203.IBPluginDependency203.ImportedFromIB2204.IBPluginDependency204.ImportedFromIB2205.IBEditorWindowLastContentRect205.IBPluginDependency205.ImportedFromIB2205.editorWindowContentRectSynchronizationRect206.IBPluginDependency206.ImportedFromIB2207.IBPluginDependency207.ImportedFromIB2208.IBPluginDependency208.ImportedFromIB2209.IBPluginDependency209.ImportedFromIB2210.IBPluginDependency210.ImportedFromIB2211.IBPluginDependency211.ImportedFromIB2212.IBPluginDependency212.ImportedFromIB2212.editorWindowContentRectSynchronizationRect213.IBPluginDependency213.ImportedFromIB2214.IBPluginDependency214.ImportedFromIB2215.IBPluginDependency215.ImportedFromIB2216.IBPluginDependency216.ImportedFromIB2217.IBPluginDependency217.ImportedFromIB2218.IBPluginDependency218.ImportedFromIB2219.IBPluginDependency219.ImportedFromIB2220.IBEditorWindowLastContentRect220.IBPluginDependency220.ImportedFromIB2220.editorWindowContentRectSynchronizationRect221.IBPluginDependency221.ImportedFromIB223.IBPluginDependency23.ImportedFromIB2236.IBPluginDependency236.ImportedFromIB2239.IBPluginDependency239.ImportedFromIB224.IBEditorWindowLastContentRect24.IBPluginDependency24.ImportedFromIB224.editorWindowContentRectSynchronizationRect29.IBEditorWindowLastContentRect29.IBPluginDependency29.ImportedFromIB229.WindowOrigin29.editorWindowContentRectSynchronizationRect295.IBPluginDependency296.IBEditorWindowLastContentRect296.IBPluginDependency296.editorWindowContentRectSynchronizationRect297.IBPluginDependency298.IBPluginDependency346.IBPluginDependency346.ImportedFromIB2348.IBPluginDependency348.ImportedFromIB2349.IBEditorWindowLastContentRect349.IBPluginDependency349.ImportedFromIB2349.editorWindowContentRectSynchronizationRect350.IBPluginDependency350.ImportedFromIB2351.IBPluginDependency351.ImportedFromIB2354.IBPluginDependency354.ImportedFromIB2371.IBEditorWindowLastContentRect371.IBPluginDependency371.IBWindowTemplateEditedContentRect371.NSWindowTemplate.visibleAtLaunch371.editorWindowContentRectSynchronizationRect371.windowTemplate.maxSize372.IBPluginDependency375.IBPluginDependency376.IBEditorWindowLastContentRect376.IBPluginDependency377.IBPluginDependency388.IBEditorWindowLastContentRect388.IBPluginDependency389.IBPluginDependency390.IBPluginDependency391.IBPluginDependency392.IBPluginDependency393.IBPluginDependency394.IBPluginDependency395.IBPluginDependency396.IBPluginDependency397.IBPluginDependency398.IBPluginDependency399.IBPluginDependency400.IBPluginDependency401.IBPluginDependency402.IBPluginDependency403.IBPluginDependency404.IBPluginDependency405.IBPluginDependency406.IBPluginDependency407.IBPluginDependency408.IBPluginDependency409.IBPluginDependency410.IBPluginDependency411.IBPluginDependency412.IBPluginDependency413.IBPluginDependency414.IBPluginDependency415.IBPluginDependency416.IBPluginDependency417.IBPluginDependency418.IBPluginDependency419.IBPluginDependency450.IBPluginDependency451.IBEditorWindowLastContentRect451.IBPluginDependency452.IBPluginDependency453.IBPluginDependency454.IBPluginDependency457.IBPluginDependency459.IBPluginDependency460.IBPluginDependency462.IBPluginDependency465.IBPluginDependency466.IBPluginDependency485.IBPluginDependency490.IBPluginDependency491.IBEditorWindowLastContentRect491.IBPluginDependency492.IBPluginDependency496.IBPluginDependency497.IBEditorWindowLastContentRect497.IBPluginDependency498.IBPluginDependency499.IBPluginDependency5.IBPluginDependency5.ImportedFromIB2500.IBPluginDependency501.IBPluginDependency502.IBPluginDependency503.IBPluginDependency504.IBPluginDependency505.IBPluginDependency506.IBPluginDependency507.IBPluginDependency508.IBEditorWindowLastContentRect508.IBPluginDependency509.IBPluginDependency510.IBPluginDependency511.IBPluginDependency512.IBPluginDependency513.IBPluginDependency514.IBPluginDependency515.IBPluginDependency516.IBPluginDependency517.IBPluginDependency533.IBPluginDependency534.IBPluginDependency535.IBPluginDependency536.CustomClassName536.IBPluginDependency537.IBPluginDependency538.CustomClassName538.IBPluginDependency539.CustomClassName539.IBPluginDependency540.IBPluginDependency543.IBPluginDependency546.IBPluginDependency547.IBPluginDependency549.CustomClassName549.IBAttributePlaceholdersKey549.IBPluginDependency554.IBPluginDependency56.IBPluginDependency56.ImportedFromIB257.IBEditorWindowLastContentRect57.IBPluginDependency57.ImportedFromIB257.editorWindowContentRectSynchronizationRect58.IBPluginDependency58.ImportedFromIB272.IBPluginDependency72.ImportedFromIB273.IBPluginDependency73.ImportedFromIB274.IBPluginDependency74.ImportedFromIB275.IBPluginDependency75.ImportedFromIB277.IBPluginDependency77.ImportedFromIB278.IBPluginDependency78.ImportedFromIB279.IBPluginDependency79.ImportedFromIB280.IBPluginDependency80.ImportedFromIB281.IBEditorWindowLastContentRect81.IBPluginDependency81.ImportedFromIB281.editorWindowContentRectSynchronizationRect82.IBPluginDependency82.ImportedFromIB283.IBPluginDependency83.ImportedFromIB292.IBPluginDependency92.ImportedFromIB2YEScom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugin{{522, 812}, {146, 23}}com.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugin{{436, 809}, {64, 6}}com.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugin{{753, 187}, {275, 113}}com.apple.InterfaceBuilder.CocoaPlugin{{608, 612}, {275, 83}}com.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugin{{547, 180}, {254, 283}}com.apple.InterfaceBuilder.CocoaPlugin{{187, 434}, {243, 243}}com.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugin{{608, 612}, {167, 43}}com.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugin{{753, 217}, {238, 103}}com.apple.InterfaceBuilder.CocoaPlugin{{608, 612}, {241, 103}}com.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.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.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugin{{746, 287}, {220, 133}}com.apple.InterfaceBuilder.CocoaPlugin{{608, 612}, {215, 63}}com.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.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.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugin{{591, 420}, {83, 43}}com.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugin{{523, 2}, {178, 283}}com.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugin{{753, 197}, {170, 63}}com.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugin{{733, 813}, {154, 23}}com.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugin{{674, 260}, {204, 183}}com.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugin{{878, 180}, {164, 173}}com.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPluginNoodleTableViewcom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPluginNoodleTableColumncom.apple.InterfaceBuilder.CocoaPluginNoodleTableColumncom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPluginNoodleTableColumnYESYEScom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugin{{392, 653}, {183, 183}}com.apple.InterfaceBuilder.CocoaPlugin{{23, 794}, {245, 183}}com.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugin{{452, 109}, {196, 203}}com.apple.InterfaceBuilder.CocoaPlugin{{145, 474}, {199, 203}}com.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPlugincom.apple.InterfaceBuilder.CocoaPluginYESYESYESYES562YESControllerNSObjectYESYESscriptViewscrollViewYESNSTextViewNSScrollViewIBProjectSourceExamples/LineNumberView/Controller.hControllerNSObjectYESYESdoModal:doSheet:YESididYESYESalertfieldwindowYESidididIBProjectSourceExamples/ModalResponder/Controller.hControllerNSObjectYESYES_iPhoneTableView_stickyRowTableViewYESNSTableViewNSTableViewIBProjectSourceExamples/StickyRowTableView Revue/Controller.hControllerNSObjecttoggleWindow:id_windowidIBProjectSourceExamples/Window Effects/Controller.hControllerNSObject_tableViewNoodleTableViewIBProjectSourceExamples/iToonz/Controller.hNSObjectIBProjectSourceNSObject-NoodlePerformWhenIdle.hNSObjectIBProjectSourceNSTableView-NoodleExtensions.hNSObjectIBProjectSourceNoodleStickyRowTableView.hNSResponderYESYEScancelModal:confirmModal:YESididIBProjectSourceNSResponder-NoodleModalExtensions.hNSTableColumnNSTableViewscrollToStickyRow:idNSTableViewscrollToStickyRow:idNSWindowYESYEScancelModal:confirmModal:YESididNSWindowIBProjectSourceNSWindow-NoodleEffects.hNoodleTableColumnNSTableColumnIBProjectSourceNoodleTableView.hNoodleTableViewNSTableViewNoodleTableViewNSTableViewIBUserSourceYESNSActionCellNSCellIBFrameworkSourceAppKit.framework/Headers/NSActionCell.hNSApplicationNSResponderIBFrameworkSourceAppKit.framework/Headers/NSApplication.hNSApplicationIBFrameworkSourceAppKit.framework/Headers/NSApplicationScripting.hNSApplicationIBFrameworkSourceAppKit.framework/Headers/NSColorPanel.hNSApplicationIBFrameworkSourceAppKit.framework/Headers/NSHelpManager.hNSApplicationIBFrameworkSourceAppKit.framework/Headers/NSPageLayout.hNSApplicationIBFrameworkSourceAppKit.framework/Headers/NSUserInterfaceItemSearching.hNSBrowserNSControlIBFrameworkSourceAppKit.framework/Headers/NSBrowser.hNSCellNSObjectIBFrameworkSourceAppKit.framework/Headers/NSCell.hNSControlNSViewIBFrameworkSourceAppKit.framework/Headers/NSControl.hNSDocumentNSObjectYESYESprintDocument:revertDocumentToSaved:runPageLayout:saveDocument:saveDocumentAs:saveDocumentTo:YESididididididIBFrameworkSourceAppKit.framework/Headers/NSDocument.hNSDocumentIBFrameworkSourceAppKit.framework/Headers/NSDocumentScripting.hNSDocumentControllerNSObjectYESYESclearRecentDocuments:newDocument:openDocument:saveAllDocuments:YESididididIBFrameworkSourceAppKit.framework/Headers/NSDocumentController.hNSFontManagerNSObjectIBFrameworkSourceAppKit.framework/Headers/NSFontManager.hNSFormatterNSObjectIBFrameworkSourceFoundation.framework/Headers/NSFormatter.hNSImageCellNSCellIBFrameworkSourceAppKit.framework/Headers/NSImageCell.hNSMatrixNSControlIBFrameworkSourceAppKit.framework/Headers/NSMatrix.hNSMenuNSObjectIBFrameworkSourceAppKit.framework/Headers/NSMenu.hNSMenuItemNSObjectIBFrameworkSourceAppKit.framework/Headers/NSMenuItem.hNSMovieViewNSViewIBFrameworkSourceAppKit.framework/Headers/NSMovieView.hNSObjectIBFrameworkSourceAppKit.framework/Headers/NSAccessibility.hNSObjectNSObjectNSObjectNSObjectNSObjectIBFrameworkSourceAppKit.framework/Headers/NSDictionaryController.hNSObjectIBFrameworkSourceAppKit.framework/Headers/NSDragging.hNSObjectNSObjectIBFrameworkSourceAppKit.framework/Headers/NSFontPanel.hNSObjectIBFrameworkSourceAppKit.framework/Headers/NSKeyValueBinding.hNSObjectNSObjectIBFrameworkSourceAppKit.framework/Headers/NSNibLoading.hNSObjectIBFrameworkSourceAppKit.framework/Headers/NSOutlineView.hNSObjectIBFrameworkSourceAppKit.framework/Headers/NSPasteboard.hNSObjectIBFrameworkSourceAppKit.framework/Headers/NSSavePanel.hNSObjectIBFrameworkSourceAppKit.framework/Headers/NSTableView.hNSObjectIBFrameworkSourceAppKit.framework/Headers/NSToolbarItem.hNSObjectIBFrameworkSourceAppKit.framework/Headers/NSView.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSArchiver.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSClassDescription.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSError.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSFileManager.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSKeyValueCoding.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSKeyValueObserving.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSKeyedArchiver.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSObject.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSObjectScripting.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSPortCoder.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSRunLoop.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSScriptClassDescription.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSScriptKeyValueCoding.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSScriptObjectSpecifiers.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSScriptWhoseTests.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSThread.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSURL.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSURLConnection.hNSObjectIBFrameworkSourceFoundation.framework/Headers/NSURLDownload.hNSResponderIBFrameworkSourceAppKit.framework/Headers/NSInterfaceStyle.hNSResponderNSObjectIBFrameworkSourceAppKit.framework/Headers/NSResponder.hNSScrollViewNSViewIBFrameworkSourceAppKit.framework/Headers/NSScrollView.hNSScrollerNSControlIBFrameworkSourceAppKit.framework/Headers/NSScroller.hNSTableColumnNSObjectIBFrameworkSourceAppKit.framework/Headers/NSTableColumn.hNSTableHeaderViewNSViewIBFrameworkSourceAppKit.framework/Headers/NSTableHeaderView.hNSTableViewNSControlNSTextNSViewIBFrameworkSourceAppKit.framework/Headers/NSText.hNSTextFieldCellNSActionCellIBFrameworkSourceAppKit.framework/Headers/NSTextFieldCell.hNSTextViewNSTextIBFrameworkSourceAppKit.framework/Headers/NSTextView.hNSViewIBFrameworkSourceAppKit.framework/Headers/NSClipView.hNSViewNSViewIBFrameworkSourceAppKit.framework/Headers/NSRulerView.hNSViewNSResponderNSWindowIBFrameworkSourceAppKit.framework/Headers/NSDrawer.hNSWindowNSResponderIBFrameworkSourceAppKit.framework/Headers/NSWindow.hNSWindowIBFrameworkSourceAppKit.framework/Headers/NSWindowScripting.h0com.apple.InterfaceBuilder.CocoaPlugin.macosxcom.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3YES../../../NoodleKit.xcodeproj3
================================================
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
================================================
CFBundleDevelopmentRegionEnglishCFBundleExecutable${EXECUTABLE_NAME}CFBundleIdentifiercom.yourcompany.${PRODUCT_NAME:rfc1034identifier}CFBundleInfoDictionaryVersion6.0CFBundlePackageTypeAPPLCFBundleShortVersionString1.0CFBundleSignature????CFBundleVersion1LSMinimumSystemVersion${MACOSX_DEPLOYMENT_TARGET}NSMainNibFileMainMenuNSPrincipalClassNSApplication
================================================
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
================================================
CFBundleDevelopmentRegionEnglishCFBundleExecutable${EXECUTABLE_NAME}CFBundleName${PRODUCT_NAME}CFBundleIconFileCFBundleIdentifiercom.noodlesoft.${PRODUCT_NAME:rfc1034Identifier}CFBundleInfoDictionaryVersion6.0CFBundlePackageTypeFMWKCFBundleSignature????CFBundleVersion1CFBundleShortVersionString1.0NSPrincipalClass
================================================
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
================================================
BuildVersion2CFBundleShortVersionString1.0CFBundleVersion1ProjectNameDevToolsWizardTemplatesSourceVersion15920000