Compare commits

...
2233 Commits
Author SHA1 Message Date
Tom Robinson 182f6a0030 CPLog refactor 2010-03-08 01:14:39 -08:00
Francisco Ryan Tolmasky I 3fc99095e2 Fix bug in keyed unarchiving.
Reviewed by me.
2010-03-07 23:48:23 -08:00
Francisco Ryan Tolmasky I d1b325052d Fixed incorrect import.
Reviewed by me.
2010-03-07 21:56:29 -08:00
Tom Robinson 91dda1f759 Remove warning from press. 2010-03-07 18:24:45 -08:00
Tom Robinson 65e12269d1 Fix flatten 2010-03-07 18:24:45 -08:00
Francisco Ryan Tolmasky I 9d2474b142 Merge branch 'master' of git@github.com:280north/cappuccino 2010-03-07 17:57:36 -08:00
Ross Boucher e804d44934 Slight error in my sprintf change. Fixed here. 2010-03-07 17:54:57 -08:00
Francisco Ryan Tolmasky I 961628d8d3 Fix for count global and also cleaned up display names in CFDictionary.
Reviewed by me.
2010-03-07 17:53:44 -08:00
Ross Boucher e3dc9fd96b Make sprintf no longer global, instead ObjectiveJ.sprintf. 2010-03-07 17:41:33 -08:00
Ross Boucher c3ac076d13 Remove base64 globals, move to CFData. Update tests. 2010-03-07 17:22:29 -08:00
Francisco Ryan Tolmasky I 1e02511022 Merge branch 'master' of git@github.com:280north/cappuccino 2010-03-07 17:20:56 -08:00
Francisco Ryan Tolmasky I 071a772208 Fix for drawRect: not working in IE 8 anymore. (Close chrome meta tag).
Reviewed by me.
2010-03-07 17:20:26 -08:00
Ross Boucher 78711163c5 Update the README to more accurately reflect the process. 2010-03-07 17:03:29 -08:00
Ross Boucher 3f005ff476 Add a "demos" task which downloads the demos repo and zips each demo as part of the deploy process. 2010-03-07 17:03:28 -08:00
Emmanuel MaillardandRoss Boucher ddd399631f - correct CPEmptyRange documentation 2010-03-07 17:03:28 -08:00
Francisco Ryan Tolmasky I c0ce830456 Merge branch 'master' of git@github.com:280north/cappuccino 2010-03-07 16:55:33 -08:00
Francisco Ryan Tolmasky I 481555f11f Further perfomance improvements.
Reviewed by me.
2010-03-07 16:54:43 -08:00
Tom Robinson 20327d8fb6 Move CPLog css file inline, remove redundant ANSI control sequence stuff, automatically use command line tool name in CPLog title. 2010-03-07 16:18:26 -08:00
Francisco Ryan Tolmasky I a377e15368 Added display names to Executables and FileExecutables.
Reviewed by me.
2010-03-07 15:51:49 -08:00
Francisco Ryan Tolmasky I 52ca9628fd Added display names to CFURL.
Reviewed by me.
2010-03-07 15:44:59 -08:00
Francisco Ryan Tolmasky I db1454c4fe Add display names to runtime methods.
Reviewed by me.
2010-03-07 15:36:32 -08:00
Francisco Ryan Tolmasky I 6845bd4598 Merge branch 'master' of git@github.com:280north/cappuccino 2010-03-07 14:34:12 -08:00
Francisco Ryan Tolmasky I f02286e3f5 Update press to support new fileExecutableSearcher style.
Reviewed by me.
2010-03-07 14:33:39 -08:00
Ross Boucher d473c251e6 Update undo/redo key equivalents to match the new menu code from a while ago. 2010-03-07 14:10:18 -08:00
Francisco Ryan Tolmasky I 64a401125d Further performance improvements and better debug values for CFDictionary and CFMutableDictionary.
Reviewed by me.
2010-03-07 12:49:37 -08:00
Francisco Ryan Tolmasky I 68ae1af13f Some performance improvements in CPKeyedUnarchiver.
Reviewed by me.
2010-03-07 12:24:59 -08:00
Francisco Ryan Tolmasky I 62b1dbbc74 Merge branch 'master' of git@github.com:280north/cappuccino 2010-03-07 03:58:48 -08:00
Francisco Ryan Tolmasky I 0881d86998 A number of performance improvements in the loader.
Reviewed by me.
2010-03-07 03:58:21 -08:00
Tom Robinson aff4883222 Initial fixes for "flatten". Loads everything correct but AppKit does not start completely. 2010-03-07 02:16:01 -08:00
Tom Robinson fbed77fc64 Fix press yet again. 2010-03-07 00:53:08 -08:00
Francisco Ryan Tolmasky I 276e8b948d Removed remaining Rakefiles.
Reviewed by me.
2010-03-06 22:32:52 -08:00
Francisco Ryan Tolmasky I 2edcfbda35 Updated version strings in preparation for 0.8.0 Release Candidate.
Reviewed by me.
2010-03-06 22:30:51 -08:00
Tom Robinson 22cdd6e04d Cleanup nib2cib logging. 2010-03-06 21:21:08 -08:00
Tom Robinson 3518813145 Switch nib2cib to use more robust args parsing. 2010-03-06 21:21:08 -08:00
Tom Robinson a453412d5b Strip invalid characters from plist before attempting to parse (so far just ESC) 2010-03-06 21:21:08 -08:00
Ross Boucher 55b438e8c1 Use sudo to update jake packages if sudo-install was the task.
Closes #525.
2010-03-06 20:17:51 -08:00
Tom Robinson ce749302a5 Fix nib2cib .nib support. Also use array form of OS.popen to avoid path escaping issues. 2010-03-06 19:34:56 -08:00
Francisco Ryan Tolmasky I 3356175f3e Merge branch 'master' of git@github.com:280north/cappuccino 2010-03-06 16:54:31 -08:00
Francisco Ryan Tolmasky I 50ff20ba33 Further reduction of CFURL creation and caching of method values.
Reviewed by me.
2010-03-06 16:53:24 -08:00
Francisco Ryan Tolmasky I d3ba51104e Create much fewer CFURLs.
Reviewed by me.
2010-03-06 16:20:20 -08:00
Francisco Ryan Tolmasky I 981c184c20 A few performance improvements in Objective-J loading.
Reviewed by me.
2010-03-06 16:01:03 -08:00
Ross Boucher 64eb440ea3 nib2cib will now launch a rhino process in order to get the size of images. 2010-03-06 15:39:46 -08:00
Ross Boucher 994383f73a Remove print statement. 2010-03-06 15:32:07 -08:00
Francisco Ryan Tolmasky I 89bd5f5b93 Fixed remaining failing CPURL tests and removed prints from CFURL tests.
Reviewed by me.
2010-03-06 12:10:57 -08:00
Francisco Ryan Tolmasky I ae25f489ad Add back in accidentally removed "baseURL".
Reviewed by me.
2010-03-06 11:40:24 -08:00
Francisco Ryan Tolmasky I 510eaabcfb Fix some MHTML generation stuff.
Reviewed by me.
2010-03-06 01:57:10 -08:00
Francisco Ryan Tolmasky I 875e177219 Added global versions of objj_importFile and objj_executeFile, as well as objj_import with a deprecation warning.
Reviewed by me.
2010-03-06 01:26:27 -08:00
Francisco Ryan Tolmasky I f8f62e1473 Merge branch 'master' into URL 2010-03-06 01:15:07 -08:00
Ross Boucher c1a70a3aa2 Closes #528.
Update CPScrollView to use more modern key command parsing.
2010-03-06 01:07:46 -08:00
Ross Boucher c514fd7a08 Fix an issue where window levels weren't kept in sync with dom window layers.
Closes #507.
2010-03-06 00:57:59 -08:00
Ross Boucher 3cefc86fbf Whitespace fix. 2010-03-06 00:55:39 -08:00
Ross Boucher 0c66606d1d Closes #517.
Adds missing delegate accessor.
2010-03-06 00:01:36 -08:00
Francisco Ryan Tolmasky I 05fc35a5b9 Merge branch 'master' of git@github.com:280north/cappuccino into URL 2010-03-05 23:59:05 -08:00
Tom Robinson 2425838ea6 Add install-symlinks Jake task. 2010-03-05 23:30:39 -08:00
Francisco Ryan Tolmasky I 20d117e129 Further movement to CFURL.
Reviewed by me.
2010-03-05 22:56:15 -08:00
Francisco Ryan Tolmasky I 8f08c33bcc Update CPBundle to better support CPURLs.
Reviewed by me.
2010-03-05 22:44:59 -08:00
Francisco Ryan Tolmasky I d7f0bf6a24 Support root level apps.
Reviewed by me.
2010-03-05 22:34:04 -08:00
Francisco Ryan Tolmasky I 5afe6fea3c Better support for exotic main file locations.
Reviewed by me.
2010-03-05 21:54:22 -08:00
Francisco Ryan Tolmasky I 9441739839 Fixed incorrect method call.
Reviewed by me.
2010-03-05 21:23:25 -08:00
Francisco Ryan Tolmasky I 8727d96a06 Merge branch 'master' into URL 2010-03-05 21:14:07 -08:00
Francisco Ryan Tolmasky I b2ffe7e509 Further cleaning and bringing CPURL up to speed with CFURL.
Reviewed by me.
2010-03-05 21:11:53 -08:00
Randall Luecke 119c950b53 Merge branch 'master' of git://github.com/280north/cappuccino 2010-03-05 23:39:31 -05:00
Ross Boucher 29a0de3636 Fix document title's not being synced properly. 2010-03-05 20:09:23 -08:00
Francisco Ryan Tolmasky I aa3e3c7e71 Better support for MHTML URLs.
Reviewed by me.
2010-03-05 16:34:27 -08:00
Francisco Ryan Tolmasky I eb00953c60 Merge branch 'master' into URL 2010-03-05 16:06:42 -08:00
Francisco Ryan Tolmasky I c4b255ae46 Performance improvements to CFURL internals.
Reviewed by me.
2010-03-05 16:06:05 -08:00
Ross Boucher d3547dd892 Merge branch 'master' into keywindows 2010-03-05 14:45:56 -08:00
Ross Boucher 7d1c7b2907 Add missing accessor to CPImageView, and fix nib2cib support for image scaling.
Closes #523.
2010-03-05 13:46:41 -08:00
Randall Luecke d0999fa5d5 Additional fixes for drag and drop in the TableView after OutlineView merge. 2010-03-05 16:20:24 -05:00
Ross Boucher c478afee0f Add a missing import to CPTheme.
Closes #527.
2010-03-05 12:38:59 -08:00
Paul BaumgartandRoss Boucher ab196e75c1 Fix missing throw in Preprocessor to report an error on unmatched brackets. Closes gh-524 2010-03-05 12:34:57 -08:00
saikatandRoss Boucher 50b5c21fcf Fixes calling selectText in the text field's delegate's controlTextDidFocus: method. 2010-03-05 11:06:00 -08:00
saikatandRoss Boucher 47bc7e812d Fix for issue #511 - disabling a menu item in the menu item's action 2010-03-05 11:05:56 -08:00
saikatandRoss Boucher ad5f574fb7 Fix for issue #511 - disabling a menu item in the menu item's action 2010-03-05 10:49:42 -08:00
saikatandRoss Boucher 9537a62ab1 Fixes calling selectText in the text field's delegate's controlTextDidFocus: method. 2010-03-05 10:49:23 -08:00
Randall Luecke dc7bd3355d Fixed wrong import for outlineview test. 2010-03-05 03:59:37 -05:00
Randall Luecke d76d9bcfad Fixed bugs with drag and drop in tableview after outlineview drag and drop merge. 2010-03-05 03:37:19 -05:00
klaaspieterandRandall Luecke 440eed77cf Merge commit 'klaaspieter/outlineview' into outlineview
Conflicts:
	AppKit/CPDragServer.j
	AppKit/CPTableView.j
	Tests/Manual/TableTest/AppController.j
2010-03-05 02:40:47 -05:00
Francisco Ryan Tolmasky I b906fbea29 Merge branch 'master' into URL 2010-03-04 15:04:08 -08:00
Ross Boucher af148137d6 Merge branch 'master' into keywindows 2010-03-04 14:33:09 -08:00
Randall Luecke 64357fde0d Fixed bug where you could drag non-existant rows. Closes #520 and #521 2010-03-04 14:04:15 -05:00
Ross Boucher 7512a45cda Add #if PLATFORM(DOM) protection to several additional classes. 2010-03-03 21:20:00 -08:00
Ross Boucher e034abef82 Add a test for the initWithItems:copy: fix. 2010-03-03 20:38:56 -08:00
Scott KyleandRoss Boucher 0b5db9c4bd Fix CPArray initWithArray: copyItems: to actually work 2010-03-03 20:36:49 -08:00
Ross Boucher 3cd763aabb Add #if PLATFORM(DOM) in a missing place in CPView. 2010-03-03 19:42:16 -08:00
Ross Boucher 1a881fb501 Merge branch 'master' into keywindows 2010-03-03 14:43:43 -08:00
Ross Boucher 2f68804279 Revert "fix for scroller still being drawn below resize indicator on the first reflect of the clipview."
This reverts commit fa63551b42.
2010-03-03 14:43:25 -08:00
Ross Boucher 60d15e2983 Revert "fix for scrollviews being drawn below window resize indicator."
This reverts commit 18a0deb678.
2010-03-03 14:43:19 -08:00
Ross Boucher 628488f7aa Revert "fix for scroller still being drawn below resize indicator on the first reflect of the clipview."
This reverts commit fa63551b42.
2010-03-03 14:42:29 -08:00
Ross Boucher 149308bc89 Revert "fix for scrollviews being drawn below window resize indicator."
This reverts commit 18a0deb678.
2010-03-03 14:42:15 -08:00
Francisco Ryan Tolmasky I b4fa971007 Merge branch 'master' into URL 2010-03-03 11:40:08 -08:00
Tom Robinson b30f10ca46 Enquote NARWHALOPT package paths to fix building in directories with spaces.
Bump jake version to 0.1.5
2010-03-03 10:50:53 -08:00
Ross Boucher da725f6ffc Merge branch 'master' of github.com:280north/cappuccino into keywindows 2010-03-03 09:40:25 -08:00
Tom Robinson b0d62a8608 Add option to automatically upgrade packages for CI server, etc. 2010-03-03 09:08:02 -08:00
Tom Robinson 3da2d3718b Bump required Narwhal version to 0.2.2 2010-03-03 09:03:20 -08:00
Francisco Ryan Tolmasky I 4bd6aca0c0 Cache URLs for performance improvement.
Reviewed by me.
2010-03-03 02:36:40 -08:00
Francisco Ryan Tolmasky I e90c84ee81 Merge branch 'master' into URL 2010-03-03 01:43:40 -08:00
Francisco Ryan Tolmasky I 45b8f83cdd Revert "Revert "Revert "Enquote NARWHALOPT package paths to fix building in directories with spaces."""
This reverts commit cb939baca0.
2010-03-03 01:41:13 -08:00
Francisco Ryan Tolmasky I c8e0aa9cb4 Merge branch 'master' into URL 2010-03-03 01:36:15 -08:00
Francisco Ryan Tolmasky I 7a486db45f Update to reverted jake version.
Reviewed by me.
2010-03-03 01:35:02 -08:00
Francisco Ryan Tolmasky I 4634c6cf3b Merge branch 'master' into URL 2010-03-03 01:05:56 -08:00
Francisco Ryan Tolmasky I eb57d14673 Further migration from file paths to CFURLs.
Reviewed by me.
2010-03-03 01:04:25 -08:00
Tom Robinson cb939baca0 Revert "Revert "Enquote NARWHALOPT package paths to fix building in directories with spaces.""
This reverts commit db8a277960.
2010-03-02 17:33:39 -08:00
Tom Robinson db8a277960 Revert "Enquote NARWHALOPT package paths to fix building in directories with spaces."
This reverts commit 783159ee44.
2010-03-02 16:38:24 -08:00
Ross Boucher 398d61097c Typo in miniaturize: 2010-03-02 15:27:40 -08:00
Ross Boucher 4a43e4fda6 Overhaul of the key/main window status, esp. with respect to assigning new values after a window
closes or after a window is minimized, and with app activation/deactivation.
2010-03-02 15:16:10 -08:00
Tom Robinson 783159ee44 Enquote NARWHALOPT package paths to fix building in directories with spaces. 2010-03-02 11:47:29 -08:00
luddepandRoss Boucher fa63551b42 fix for scroller still being drawn below resize indicator on the first reflect of the clipview. 2010-03-02 11:44:31 -08:00
luddepandRoss Boucher 18a0deb678 fix for scrollviews being drawn below window resize indicator. 2010-03-02 11:44:25 -08:00
cacaodevandRoss Boucher f7c46855b8 Added missing @imports in AppKit.j 2010-03-02 11:29:09 -08:00
Ross Boucher e67539c3b1 Merge branch 'master' of github.com:280north/cappuccino 2010-03-02 11:20:38 -08:00
Ross Boucher b8d06521b2 Fix a bogus Regex in json2.js. Closes #513. 2010-03-02 11:20:02 -08:00
Tom Robinson 3225d980c5 Bump required Jake version to 0.1.3 to fix build problems with Rhino. 2010-03-02 02:09:49 -08:00
Tom Robinson 9c3a579ff8 Exit with error from capp gen 2010-03-02 01:40:00 -08:00
Tom Robinson 92b5b34d17 Add --index option to flatten to specify an alternate index.html file. 2010-03-02 00:52:19 -08:00
Ross Boucher 47e8696b9f Missing string close. 2010-03-02 00:51:46 -08:00
Tom Robinson 7938384162 Fix "capp gen -l" 2010-03-01 18:31:00 -08:00
Ross Boucher 01aec1f78e If the mainWindow tries to become main again, just return early. 2010-03-01 18:07:38 -08:00
Nicholas Small 67f35c7b74 Update deprecated sendSynchronousRequest:returningResponse:error: to sendSynchronousRequest:returningResponse: 2010-03-01 17:03:00 -05:00
Ross Boucher d600df4585 Make doxygen recursive. 2010-03-01 12:14:27 -08:00
Francisco Ryan Tolmasky I f3a0710059 Merge branch 'master' into URL 2010-02-27 13:36:56 -08:00
Ross Boucher 203e0d150b Update table headers to return the cursor to normal if the window doesn't accept mousemoved events. 2010-02-27 12:22:52 -08:00
Ross Boucher efd699a044 Add -isEqual: and -description to CPFont. Add a unit test for -isEqual:
Closes #506.
Closes #505.
2010-02-27 12:00:44 -08:00
Ross Boucher dbe0ca0adc Expand macros in the documentation generation. 2010-02-27 10:31:05 -08:00
Francisco Ryan Tolmasky I 5316cabf30 Fix for capp config <key> <value> not working.
Reviewed by me.
2010-02-26 23:35:27 -08:00
cacaodevandRandall Luecke 9a16921a32 CPTableHeaderView: Avoid vertical lines disapearring when autoresizing the table.
Fix cursor updates disabled when table autoresizing is NoAutoresizing.
                   nil check table headerView before sending a message to itself or to a table column header view.

Conflicts:

	AppKit/CPTableHeaderView.j
2010-02-26 11:35:49 -05:00
Tom Robinson f5edf2a4c2 Cleanup press and flatten arguments. 2010-02-25 19:50:06 -08:00
Ross Boucher cfdcfdbc99 Update the default jakefiles with bug fixes and convenience tasks. 2010-02-25 16:34:47 -08:00
Tom Robinson ad99dca6ac Move tools to cappuccino package's "bin" directory 2010-02-25 15:32:24 -08:00
Francisco Ryan Tolmasky I fbcc81056b Merge branch 'master' into URL
Conflicts:
	Objective-J/FileExecutable.js
2010-02-25 13:59:00 -08:00
Francisco Ryan Tolmasky I 756877b94c Removed some unecessary uses of sprintf.
Reviewed by me.
2010-02-25 12:38:50 -08:00
Ross Boucher 68d30c8802 Replace the old support for window.update_progress with OBJJ_PROGRESS_CALLBACK.
Function gets passed float from 0 to 1, the total size, and the last loaded bundle path, in that order.
2010-02-25 11:39:08 -08:00
Tom Robinson 555b83a359 "flatten" now inlines functions 2010-02-25 00:57:21 -08:00
Tom Robinson ff43be6d7b Added LoadTimeTest app to test load times. 2010-02-25 00:57:21 -08:00
Tom Robinson 7defbce1dd Fix more incorrect type annotations 2010-02-24 22:45:34 -08:00
Ross Boucher ef5aead17d Disabled resize cursor support in CPTableViewHeader 2010-02-24 21:22:07 -08:00
Ross Boucher 585b70a6a9 Fix whitespace errors. 2010-02-24 20:10:08 -08:00
Scott KyleandRoss Boucher b24a78bdd5 CPTableView delegate method tableView:setObjectValue:forTableColumn:row: is now being called for cells with CPButton data views, as it should. Fixes bug #466 2010-02-24 20:06:24 -08:00
Ross Boucher f305621ade Merge branch 'master' of github.com:280north/cappuccino 2010-02-24 17:47:09 -08:00
Ross Boucher 24198a7890 Add a missing import, exposed by press. 2010-02-24 17:46:47 -08:00
Tom Robinson 2d477b38bc Fix bootstrap when run within another sea and check for writability of /usr/local, defaulting to $HOME/narwhal 2010-02-24 16:16:27 -08:00
Paul BaumgartandTom Robinson 48afc5639e re-factor shell_config_file to make bootstrap.sh self-contained 2010-02-24 15:47:22 -08:00
Francisco Ryan Tolmasky I 7b932fbf4a Merge branch 'master' into URL 2010-02-24 11:26:46 -08:00
Francisco Ryan Tolmasky I 39f3e7b292 Fix for menus not redrawing correctly after closing in non-Safari browsers.
Closes #495.

Reviewed by me.
2010-02-24 02:56:38 -08:00
Randall Luecke 49f3038737 Merge branch 'master' of git://github.com/280north/cappuccino 2010-02-24 02:27:32 -05:00
Randall Luecke f7a40a071b Added proper resize cursor support for CPSplitView and cleaned up some whitespace. 2010-02-24 02:24:36 -05:00
Tom Robinson 3a1ebcaf3f Allow interleaved arguments in "capp gen" (requires latest Narwhal) 2010-02-23 20:07:17 -08:00
Tom Robinson 3da1c4381c Setup automated builds. 2010-02-23 18:06:23 -08:00
Tom Robinson 9ff73e5e63 Make "capp" print usage if more than one file argument is given 2010-02-23 17:04:56 -08:00
Tom Robinson f3633c050b Add OBJJ_AUTO_BOOTSTRAP option to disable auto-bootstrapping. Fixes flatten race condition. 2010-02-23 15:41:52 -08:00
Francisco Ryan Tolmasky I 1ba828da18 Beginning transition from string paths to CFURLs.
Reviewed by me.
2010-02-23 15:11:10 -08:00
Ross Boucher 109725d613 Fix whitespace issues from the previous commit. 2010-02-23 11:34:58 -08:00
Klaas Pieter AnnemaandRoss Boucher 4bc8f01376 made sure the dragserver doesn't call prepareDrag if the last drag update returned CPDragOperationNone 2010-02-23 11:25:10 -08:00
Ross Boucher df20a6d6df Add a couple tests for bugs reported from Pivotal. They aren't ideal, though, because of the CPApp issue. 2010-02-23 11:07:53 -08:00
cacaodevandRoss Boucher e32963384e _CPKVCArray -indexOfObject: typo 2010-02-23 11:07:53 -08:00
Tom Robinson 03a9865ccb Remove warning from bootstrap.sh about narwhal-jsc failing on 10.5 2010-02-22 22:06:44 -08:00
Francisco Ryan Tolmasky I 7674b3aec6 Merge branch 'master' of git@github.com:280north/cappuccino 2010-02-22 18:50:00 -08:00
Francisco Ryan Tolmasky I 9c9a5bcd51 Fix for stream undefined.
Reviewed by me.
2010-02-22 18:48:13 -08:00
Tom Robinson 8948f7f43c Fix broken flatten bit due to loader changes. Refactor flatten into ObjectiveJFlattener which inherits from ObjectiveJRuntimeAnalyzer. 2010-02-22 18:41:19 -08:00
Tom Robinson ef4e86a124 Remove StaticResource.prototype.type() 2010-02-22 18:39:50 -08:00
Francisco Ryan Tolmasky I b9edc357f3 Fix for absolute paths working with <> includes.
Reviewed by me.
2010-02-22 14:50:25 -08:00
Francisco Ryan Tolmasky I 9353d0f95c Merge branch 'master' of git@github.com:280north/cappuccino 2010-02-22 14:30:46 -08:00
Francisco Ryan Tolmasky I 7defdd2a00 Fix for some files showing up as anonymous.
Reviewed by tlrobinson.
2010-02-22 14:27:30 -08:00
Tom Robinson 621e79fe33 Fixes press, objj-analysis-tools, etc broken due to changes to loader 2010-02-22 12:54:17 -08:00
Ross Boucher e759c5343b Add a missing import in CPButton, and a test to ensure you can create one on the command line. 2010-02-22 11:07:11 -08:00
Francisco Ryan Tolmasky I d879b25458 Re-enabled menu bar button support.
Closes #410.

Reviewed by me.
2010-02-22 02:12:11 -08:00
Francisco Ryan Tolmasky I ccffde6966 Merge branch 'master' of git@github.com:280north/cappuccino 2010-02-22 00:56:23 -08:00
Francisco Ryan Tolmasky I 1524f80418 Fix for toolbar item's sending their views as senders for actions (should be the item itself).
Closes #493.

Reviewed by me.
2010-02-22 00:49:35 -08:00
Tom Robinson bcbeb888f6 Various bootstrap.sh improvements (noprompt mode, etc) 2010-02-22 00:00:40 -08:00
Francisco Ryan Tolmasky I 7730aeb652 Merge branch 'master' of git@github.com:280north/cappuccino 2010-02-21 23:30:58 -08:00
Francisco Ryan Tolmasky I 272f938f2e Fix for CPData naming issues, added test cases, and fixed isEqual: for CPDictionary.
Reviewed by me.
2010-02-21 23:29:41 -08:00
Randall Luecke 5570a346c4 Imported CPOutlineView.j in AppKit. 2010-02-22 00:26:50 -05:00
Ross Boucher 2b90652a16 Add chrome frame tag for the benefit of those people who may have installed it. 2010-02-21 17:01:33 -08:00
Ross Boucher a58dd4678c Move NibApp to manual tests. 2010-02-21 17:01:33 -08:00
Randall Luecke 25f4574093 TableView now renders white background by default (like cocoa) thereby fixing a bug where Opera rendered the tableview with a black background if you did no specify alternating row colors. 2010-02-21 19:53:40 -05:00
Tom Robinson 733b9b731d Cleanup Jakefiles, enquote arguments, add built packages bin to PATH so ojtest runs / uses the correct Cappuccino, etc. 2010-02-21 15:42:56 -08:00
Francisco Ryan Tolmasky I 20637fc5e0 Added missing licenses and removed a bit of unused code.
Reviewed by me.
2010-02-21 13:52:51 -08:00
Francisco Ryan Tolmasky I c33e2ee51f Fixed a bug with objj_debug_typecheck incorrectly misidentifying empty string as not a CPString. Also fixed a number of type declarations after running with objj_msgSend_decorate(objj_typecheck_decorator); turned on.
Reviewed by me.
2010-02-21 13:37:20 -08:00
Francisco Ryan Tolmasky I 7ef59418dd Merge branch 'master' of git@github.com:280north/cappuccino 2010-02-21 13:10:55 -08:00
Francisco Ryan Tolmasky I 0805e58a94 Fix for objj_msgSend_reset errors when running debug.
Reviewed by me.
2010-02-21 13:10:31 -08:00
Ross Boucher 6ddeff2b21 Fix the remaining tests that were failing. 2010-02-21 13:02:52 -08:00
Francisco Ryan Tolmasky I 7433c38d92 Pulled @each out into a separate feature branch, so as to not conflict with the 0.8 work: http://github.com/280north/cappuccino/tree/@each .
Reviewed by me.
2010-02-21 12:31:13 -08:00
Tom Robinson 5f930ec840 Fix for press interpreting "." as "/" 2010-02-20 23:01:06 -08:00
Randall Luecke 0dd36b2275 Merge branch 'master' of git://github.com/280north/cappuccino 2010-02-20 17:46:09 -05:00
Randall Luecke 629428739d Fixed error when headerview was set to nil on the CPTableView. 2010-02-20 17:44:45 -05:00
Francisco Ryan Tolmasky I 7d7281480a Typo in last commit and forgot one change.
Reviewed by me.
2010-02-20 02:42:57 -08:00
Francisco Ryan Tolmasky I 666e2c0190 Updated press for changed names.
Reviewed by me.
2010-02-20 02:36:14 -08:00
Francisco Ryan Tolmasky I 3968d35cac Once again fix for Fix for accounting for non-Cappuccino libraries placing things on
Object.prototype and Don't recreate sprited resources every time, and fix a bug where two
bundle tasks in the same jakefile would conflict when creating sprited
resources.

Reviewed by me.
2010-02-20 02:24:54 -08:00
Francisco Ryan Tolmasky I 551677d6fd Removed no longer used file, and renamed HTTPRequest.js to CFHTTPRequest.js to match the class name change in the previous commit.
Reviewed by me.
2010-02-20 01:08:15 -08:00
Francisco Ryan Tolmasky I 85b029fad0 Merge branch 'master' of git@github.com:280north/cappuccino 2010-02-20 01:05:04 -08:00
Francisco Ryan Tolmasky I 841ed9ea89 Major cleanup of globals and exports. Removed many accidental globals and no more need for eval in the initialization process. Also fixes Theme Showcase.
Reviewed by me.
2010-02-20 01:04:17 -08:00
Randall Luecke 74fd7eb793 Merge branch 'master' of git://github.com/280north/cappuccino 2010-02-20 03:59:40 -05:00
BlairDuncanandRandall Luecke 26df9e861f Fix for cursor showing resize indicator when column isn't user resizable. 2010-02-20 03:58:38 -05:00
Tom Robinson 338860d05b Allow additional frameworks to be copied by capp gen. Use args parser. 2010-02-19 18:27:43 -08:00
Ross Boucher b7df6c1480 Fix support for MHTML. This uses feature detection to determine if DataURLs, and then if MHTML is supported, and falls back on the original unsprited images.
Closes #376.
2010-02-19 16:48:57 -08:00
Tom Robinson b2179f14ab Cleanup Jakefiles:
* require common.jake first
* require Objective-J/Cappuccino stuff only when needed (automatically requiring these caused too many problems)
* remove useless shebangs, cleanup whitespace
2010-02-19 16:09:39 -08:00
Paul BaumgartandRoss Boucher 99b43fed7f Add support for sudo-install on systems with sudo compiled w/ --with-secure-path 2010-02-19 13:01:11 -08:00
Paul BaumgartandRoss Boucher 25dfcd38a7 Fix case on require() parameter ("OS" -> "os") 2010-02-19 13:00:31 -08:00
Tom Robinson a6d2c42402 Only log errors in setupEnvironment. 2010-02-19 02:43:39 -08:00
Francisco Ryan Tolmasky I fd8271396d Fix for accounting for non-Cappuccino libraries placing things on Object.prototype.
Reviewed by me.
2010-02-19 02:08:34 -08:00
Francisco Ryan Tolmasky I 19ca6a342e Merge branch 'master' of git@github.com:280north/cappuccino 2010-02-19 00:43:18 -08:00
Francisco Ryan Tolmasky I 7819e174f1 Added setString: to CPData which sits on top of setSerializedPlistObject:.
Reviewed by me.
2010-02-19 00:42:23 -08:00
Randall Luecke 7cd6d026a2 Merge branch 'master' of git://github.com/280north/cappuccino 2010-02-19 03:24:59 -05:00
Randall Luecke c48d306195 Initial refactor/rewrite of auto resizing columns. 2010-02-19 03:23:29 -05:00
Francisco Ryan Tolmasky I 3a9845f784 Don't recreate sprited resources every time, and fix a bug where two bundle tasks in the same jakefile would conflict when creating sprited resources.
Reviewed by me.
2010-02-18 23:32:11 -08:00
Francisco Ryan Tolmasky I 94d3053232 Added CommonJS extensions to CFPropertyList.
Reviewed by me.
2010-02-18 15:28:30 -08:00
Francisco Ryan Tolmasky I b078169adf Fix for slight name change.
Reviewed by me.
2010-02-18 14:05:33 -08:00
Francisco Ryan Tolmasky I 38c4dd408c Fix for CPBundle loading all code. Fixes external frameworks with nib2cib.
Reviewed by me.
2010-02-18 13:55:30 -08:00
Francisco Ryan Tolmasky I 8beb9dfed0 Merge branch 'master' of git@github.com:280north/cappuccino 2010-02-18 11:18:17 -08:00
Francisco Ryan Tolmasky I eef9549e96 Fix for HelloWorld/ not working when HelloWorld/index.html does.
Closes #483.

Reviewed by me.
2010-02-18 11:17:21 -08:00
Randall Luecke 82ac98ddc7 Initial refactoring of init with a fix for gradients not being initialized correctly. Initial refactoring of uniform column auto resizing to prep for a rewrite. 2010-02-18 11:09:07 -05:00
cacaodevandRandall Luecke 3d52ffcbdc CPTableView: fix shiftKey+selection to match cocoa behavior. closes issue #433 2010-02-18 02:30:57 -05:00
Randall Luecke 3fad4635b0 Updated tabletest to include new source list selection styles, also cleaned up the tableview a bit, and made the default selection style of the outlineview use the source list gradient. 2010-02-18 02:21:40 -05:00
cacaodevandRandall Luecke b0b19328a8 CPTableView: CPTableViewSelectionHighlightStyleSourceList for canvas browsers. Removed references to selectionHighlightColor. 2010-02-18 01:27:06 -05:00
Francisco Ryan Tolmasky I 9fd79488f8 Merge branch 'master' of git@github.com:280north/cappuccino 2010-02-17 21:13:14 -08:00
Francisco Ryan Tolmasky I cebe31857a Fix for image loading problem.
Reviewed by me.
2010-02-17 21:12:14 -08:00
Ross Boucher 1961829414 Correct a use of global. to be GLOBAL_NAMESPACE. at least until we have a better solution. 2010-02-17 19:31:11 -08:00
Ross Boucher 3e5bdec033 Merge branch 'master' of github.com:280north/cappuccino 2010-02-17 19:22:02 -08:00
Ross Boucher 5789021a76 modify the copyright date 2010-02-17 19:20:44 -08:00
Tom Robinson 6bf0319c51 Add ojdepcheck tool to print out missing @imports 2010-02-17 18:09:55 -08:00
Tom Robinson 8f519caa77 Remove old shrinksafe jars 2010-02-17 18:02:32 -08:00
Ross Boucher a38be80a86 Revert "A better fix for the IE bug. Rather than introduce the secondary global and the eval, just refer to the actual global object (works in any javascript env)."
This reverts commit d40619aca0.
2010-02-17 17:37:46 -08:00
Ross Boucher 81b72fc571 Throw a syntax error if we don't recognize the @accessors syntax. 2010-02-17 17:27:37 -08:00
Ross Boucher 91681d7846 Move more constants to CPControl.j 2010-02-17 17:06:09 -08:00
Ross Boucher d40619aca0 A better fix for the IE bug. Rather than introduce the secondary global and the eval, just refer to the actual global object (works in any javascript env). 2010-02-17 16:55:07 -08:00
Ross Boucher 1328bc732f Move around some imports and constant declarations. 2010-02-17 16:29:57 -08:00
Ross Boucher 060f65b27e Use CPLog instead of console 2010-02-17 16:24:04 -08:00
Tom Robinson 364669f527 Remove formatting from capp usage message for now. 2010-02-17 16:15:10 -08:00
Ross Boucher f4042b9d4b Fix an error in IE6 with XMLHttpRequest being undefined 2010-02-17 16:09:58 -08:00
Ross Boucher c750b696d2 Merge branch 'master' of github.com:280north/cappuccino 2010-02-17 16:08:58 -08:00
Ross Boucher 02cdee6c75 Fix a missing import. 2010-02-17 16:08:11 -08:00
Tom Robinson c4a824b5db More bootstrap improvements: follow narwhal symlinks to actual installation 2010-02-17 15:18:07 -08:00
Tom Robinson 7f31c0632d flatten: build nodes relative to cwd 2010-02-17 14:57:33 -08:00
Francisco Tolmasky 96ee92695c Merge branch 'jake'
Conflicts:
	Tools/press/objj-analysis-tools.j
2010-02-17 13:50:18 -08:00
Francisco Ryan Tolmasky I 80b252a744 Merge branch 'loader' into jake 2010-02-17 13:40:22 -08:00
Francisco Ryan Tolmasky I 4f50f8b83f Fix for IE Bug that caused stack overflow at line 0 when loading Objective-J every time.
Reviewed by me.
2010-02-17 13:39:15 -08:00
Francisco Ryan Tolmasky I df895b9529 Treat extensionless files as Objective-J.
Reviewed by ross.
2010-02-16 19:31:31 -08:00
Tom Robinson f9e9e51352 A couple fixes in flatten 2010-02-16 18:21:36 -08:00
Ross Boucher 27e99344bd Make nib2cib quieter by default. Prints only fatal error messages.
Pass the -v flag to print warnings, and -vv or --verbose to print all messages.

Closes #475.
2010-02-16 16:59:44 -08:00
Ross Boucher 32572844fd Merge branch 'loader' of github.com:280north/cappuccino into loader 2010-02-16 16:37:24 -08:00
Ross Boucher a77e67e578 Add support for keyboard navigation in CPCollectionView 2010-02-16 16:36:40 -08:00
Francisco Ryan Tolmasky I fb9cd1ef93 Don't Objective-J preprocess non-.j files.
Reviewed by me.
2010-02-16 16:23:03 -08:00
Ross Boucher 93722f6a7d Fix a bug where any @ added accessors to ivar declarations.
Closes #474.
2010-02-16 15:50:04 -08:00
Francisco Ryan Tolmasky I 76da7466ec Fix for CPDictionary CPFastEnumeration.
Reviewed by me.
2010-02-16 13:51:02 -08:00
Stephen IerodiaconouandRoss Boucher 6b3c95f09f Fix for issue #473. Call setEnabled from _CPToolbarItemView updateFromItem. 2010-02-16 10:43:48 -08:00
Francisco Ryan Tolmasky I 81110ddba7 Further performance improvements.
Reviewed by me.
2010-02-16 02:41:15 -08:00
Francisco Ryan Tolmasky I 64fd9f615c Additional performance improvements to CPFastEnumeration.
Reviewed by me.
2010-02-16 02:04:31 -08:00
Randall Luecke 213df88766 Merge branch 'loader' of git://github.com/280north/cappuccino into loader 2010-02-16 03:58:22 -05:00
Tom Robinson a26750d4f4 Fixed objj arguments parsing 2010-02-16 00:57:50 -08:00
Randall Luecke 72edd7376e temp fix for auto resizing when user manually resizes. Uniform resizing is still broken. 2010-02-16 03:56:17 -05:00
Randall Luecke 948e9ae139 Merge branch 'loader' of git://github.com/280north/cappuccino into loader 2010-02-16 03:43:22 -05:00
Francisco Ryan Tolmasky I ae357d1a2b Support for post and pre order CPFastEnumration for CPTreeNode. In order and level order remain.
Reviewed by me.
2010-02-16 00:41:20 -08:00
Randall Luecke 59756ff1b3 Made the hit test area for the column resizing a bit smaller. 2010-02-16 03:40:05 -05:00
Klaas Pieter Annema 2908e453e8 Merge branch 'jake' into outlineview 2010-02-16 09:39:49 +01:00
Klaas Pieter Annema 7b1ffc885f Merge branch 'jake' of git://github.com/280north/cappuccino into jake 2010-02-16 09:39:32 +01:00
Randall Luecke 95364b1d31 Tableview fixes including setMaxWidth reset on columns, added grid line to cornerview, cleaned up width validation in sizeLastColumnToFit, and cleaned up TableTest. 2010-02-16 03:00:49 -05:00
Ross Boucher f3257c0847 Add trunaction defaults to the table view cells 2010-02-15 23:05:23 -08:00
Ross Boucher eb0fc35c8f Merge branch 'loader' of github.com:280north/cappuccino into loader 2010-02-15 23:05:10 -08:00
Ross Boucher 3dccd93093 Fix a typo. Closes #380. 2010-02-15 23:04:47 -08:00
Francisco Ryan Tolmasky I 8929199082 Add CPFastEnumeration support for CPEnumerator.
Reviewed by me.
2010-02-15 22:48:28 -08:00
Klaas Pieter Annema 20f6a57b3a - made the proposed drag row calculations more accurate when a tableview has non-default row height or inter-cell spacing
- fixed a bug in the dragged row at point calculation
2010-02-16 07:45:19 +01:00
Francisco Ryan Tolmasky I db949728dd Add CPFastEnumeration support to CPSet and CPNull.
Reviewed by me.
2010-02-15 22:44:52 -08:00
Francisco Ryan Tolmasky I 92d28e468e Autogenerate the index parameter for Fast Enumeration, and add Fast Enumeration support to CPIndexSet.
Reviewed by me.
2010-02-15 22:34:50 -08:00
Francisco Ryan Tolmasky I f95c3ca46a Adds fast enumeration to Cappuccino. Currently support for Arrays, dictionaries, single objects, and nil.
Closes #472.

Reviewed by me.
2010-02-15 21:46:50 -08:00
Ross Boucher 477b6bcdc5 Merge branch 'loader' of github.com:280north/cappuccino into loader 2010-02-15 21:28:58 -08:00
Ross Boucher 3e40deba5f Fix a lot of style issues.
Change a 1px value.
Closes #444.
2010-02-15 21:27:27 -08:00
Tom Robinson 7d9bd25270 Disable bootstrap installing prebuilt packages 2010-02-15 21:26:49 -08:00
Tom Robinson c201990cb0 Switch compressor to use CommonJS packages for ShrinkSafe, etc. 2010-02-15 21:26:02 -08:00
Tom Robinson 289df53fb4 Disable bootstrap installing prebuilt packages 2010-02-15 21:26:02 -08:00
Ross Boucher 62788423a1 Add missing accessors. Closes #452. 2010-02-15 18:32:45 -08:00
Ross Boucher 8617990206 Add much better support for CPTableView to nib2cib. 2010-02-15 17:28:35 -08:00
cacaodevandRandall Luecke 2d8f2b328f Fixed a bug where column selection code was trying to highlight unexposed data views 2010-02-15 11:09:16 -05:00
Francisco Ryan Tolmasky I 833896e267 Renaming file to match class renaming.
Reviewed by me.
2010-02-14 19:17:56 -08:00
Francisco Ryan Tolmasky I f12b4520f6 Some renaming.
Reviewed by me.
2010-02-14 19:17:50 -08:00
Randall Luecke 2564003c85 Added new aristo resources for CPTableView sorting. 2010-02-14 21:37:03 -05:00
cacaodevandRandall Luecke c36b8f2257 CPTableView: -setHighlightedTableColumn: argument should be a CPTableColumn 2010-02-14 21:33:47 -05:00
cacaodevandRandall Luecke d413fbe0ed Fix for indentations not respected when resizing an outlineview column. Closes issue #470 2010-02-14 21:33:32 -05:00
Randall Luecke 4237000fc9 TableView:
Set a CPThemeStateHighlighted for both selecting and sorting.
Do not change sort descriptors when selecting with a modifier flag.

Conflicts:

	AppKit/CPTableView.j
2010-02-14 21:33:20 -05:00
cacaodevandRandall Luecke 5131aff352 Column sorting : Sort descriptors, sort indicator image, highlighted column.
Column resizing : Fixed bug where last column could not be resized.
                  Left arrow cursor when reaching maxWidth.
                  Moved table selection code to CPTableView.
                  Disable automatic resizing when user is resizing column
		  Partially fixed uniform resizing not prop. to columns width.
2010-02-14 21:32:07 -05:00
Francisco Ryan Tolmasky I f77f52802c Fix for new loader not working when app lives in the root directory of a website.
Reviewed by me.
2010-02-14 16:26:54 -08:00
Francisco Ryan Tolmasky I d52ab34421 Better Cib loading that doesn't make assumptions about the asynchronisity of the load.
Reviewed by me.
2010-02-14 12:23:47 -08:00
Francisco Ryan Tolmasky I 81e4c26b38 Fix for properly handling XMLHTTPRequests with files that don't exist when using file:// URL's in FireFox.
Reviewed by me.
2010-02-14 12:22:37 -08:00
Ross Boucher 1eed1901e9 Add some documentation to CPTableColum's setDataView: method.
Closes #315.
2010-02-13 22:33:36 -08:00
Ross Boucher a8b1c7bce1 Fix a number of segmented control bugs. Among other things, the disabled state is respected per segment.
Closes #386.

Also fixes the error where right side of segments would often not be visible.
Also fixes the error which caused the right and left bezel images to not show as disabled ever.
2010-02-13 20:40:32 -08:00
Alexander LjungbergandRoss Boucher ac3d035ce7 Fixed: CPTableView deselectRow: changed the column selection rather than the row selection. 2010-02-13 20:08:12 -08:00
Ross Boucher c8575cac05 Revert "Fix the collection view resizing behavior."
This reverts commit 9b01561127.
2010-02-13 20:04:18 -08:00
Francisco Ryan Tolmasky I 8d63c059c5 Fixed scope issues when running Cappuccino under CommonJS.
Reviewed by me.
2010-02-13 16:57:09 -08:00
Francisco Ryan Tolmasky I bc53288fca Fix for failing CPAttributedString test.
Reviewed by me.
2010-02-13 16:14:18 -08:00
Francisco Ryan Tolmasky I 474d4281f1 Actual fix for pasteboard exception for strings.
Reviewed by me.
2010-02-13 14:39:44 -08:00
Ross Boucher 73babcd7d6 Merge branch 'loader' of github.com:280north/cappuccino into loader 2010-02-13 14:24:35 -08:00
Ross Boucher 5fe208d6a0 Update to the last scroller fix, slightly different approach. 2010-02-13 13:55:23 -08:00
Tom Robinson 94ca0ed71b Read as binary then decode to string to workaround narwhal-rhino bug of adding newlines on read() 2010-02-13 13:54:38 -08:00
Ross Boucher a323cfe08c Allow developers to choose to enable the HTML5 drag and drop support, even though its off by default. 2010-02-13 13:38:56 -08:00
Ross Boucher 29c3654928 Merge branch 'loader' of github.com:280north/cappuccino into loader 2010-02-13 13:25:31 -08:00
Ross Boucher 27fefed0d8 Recaluclate the orientation of a scroller on frame change.
Closes #454.
2010-02-13 13:24:31 -08:00
Tom Robinson 235d974ce1 Beginning of "flatten" tool. 2010-02-13 13:13:47 -08:00
Tom Robinson cb1d3168e3 press cleanup, refactor setting environments and include paths into analyzer. 2010-02-13 13:13:47 -08:00
Tom Robinson 64dc25dfb6 Export rootNode. 2010-02-13 13:13:47 -08:00
Ross Boucher 9a7484e57d Fix Typo. Closes #463. 2010-02-13 12:06:52 -08:00
Ross Boucher b89ee3e4c1 Use longform RegEx creation in json2.js to fix a bug in Opera 9.2.
Closes #323.
2010-02-12 21:51:06 -08:00
Ross Boucher ec5645d380 Only change button heights if the button isn't bordered.
Closes #157.
2010-02-12 21:36:32 -08:00
Ross Boucher a0abf1e221 Fix a slight bug with default values in nib2cib segmented controls.
Closes #215.
2010-02-12 21:29:19 -08:00
Ross Boucher 0e558d54e5 Move CPControl constants to that file (from CPTextField).
Respect line break mode in NSControl nib2cib.

Closes #420.
2010-02-12 21:16:44 -08:00
Ross Boucher 004cc5fe5a Store a conversion table of views/objects we're replacing and restore connections to those replaced objects. (nib2cib) 2010-02-12 20:31:36 -08:00
Ross Boucher 0b22b1d022 Correctly convert NSButtons set as checkboxs and radiogroups to CPCheckBoxes and CPRadios.
Closes #365.
2010-02-12 20:05:34 -08:00
Ross Boucher 24ecf31bd3 Merge branch 'loader' of github.com:280north/cappuccino into loader 2010-02-12 14:18:19 -08:00
Ross Boucher c37c80771c Fix broken tests with CPData. 2010-02-12 14:17:58 -08:00
Francisco Ryan Tolmasky I a017c0c4a8 Fix for failing CPDictionary tests.
Reviewed by me.
2010-02-12 14:09:40 -08:00
Francisco Ryan Tolmasky I 3a35ab449b Fixed failing KVO tests.
Reviewed by me.
2010-02-12 13:46:26 -08:00
Ross Boucher da84964a33 Fix two problems with KVC:
- valueForKeyPath: looped over individual components, which meant classes couldn't override valueForKeyPath: to do multi-part keys (needed for operators)
- CPArray's valueForKeyPath: implementation was incorrectly parsing the operator if it was a simple key
2010-02-12 12:53:15 -08:00
Klaas Pieter Annema 65051855ee fixed a bug where the tableview would draw a row to many 2010-02-12 13:02:55 +01:00
Ross Boucher 72c36789c6 Accidental global var.
Closes #462.
2010-02-11 09:35:36 -08:00
Klaas Pieter Annema bc07bd16bd implemented outlineView:willDisplayView:forTableColumn:row delegate method 2010-02-11 16:47:49 +01:00
Klaas Pieter Annema bf691fa552 removed incorrect implementation of imageDimsWhenDisabled 2010-02-11 12:47:27 +01:00
Ross Boucher 47ddfec1f9 Merge branch 'loader' of github.com:280north/cappuccino into loader 2010-02-10 19:56:33 -08:00
Ross Boucher fb8ba655e1 Do not enforce min/max size in setFrame:display:animate: only do so in the other setFrame* variants.
Closes #284.
2010-02-10 19:55:40 -08:00
Tom Robinson d64f56817d Remove unused imports etc from press 2010-02-10 19:35:53 -08:00
Tom Robinson 9363708e49 Move push-package dir to .push-package and add to .gitignore 2010-02-10 19:19:00 -08:00
Ross Boucher 65a2e4d6b0 Merge branch 'loader' of github.com:280north/cappuccino into loader 2010-02-10 18:33:03 -08:00
Randall LueckeandRoss Boucher 138d7bd9a2 Added _ in front of CG calls to last commit... 2010-02-10 18:19:13 -08:00
Randall LueckeandRoss Boucher 97fe09fbdd Added proper support for hiding scroller elements when CPScroller is resized too small to display all of them. 2010-02-10 18:19:07 -08:00
Tom Robinson 487412fa22 objj repl respects -I args. Closes gh-235 2010-02-10 18:17:41 -08:00
Klaas Pieter Annema ea47baa1fc implemented imageDimsWhenDisabled on CPButton 2010-02-10 16:19:51 +01:00
Klaas Pieter Annema 90cd519916 added viewDidLoad to CPViewController 2010-02-10 12:13:17 +01:00
Klaas Pieter Annema 669d18b218 added missing exception when a viewcontroller has no view after loadView 2010-02-10 11:46:40 +01:00
Tom Robinson fbcd2b3174 Merge branch 'loader' of git@github.com:280north/cappuccino into loader 2010-02-10 00:49:11 -08:00
Tom Robinson 99a839456d Remove --flatten and --nostrip command line flags from press. 2010-02-10 00:34:51 -08:00
Tom Robinson 0d9d60466d It's alive! press appears to be working completely (minus removed --flatten feature) 2010-02-10 00:31:00 -08:00
Francisco Ryan Tolmasky I 5a031efa7a Fixed issues with imports that had ".." in the paths.
Reviewed by me.
2010-02-10 00:03:46 -08:00
Tom Robinson 1f64fce47c First pass at fixing "press" output stage. 2010-02-09 17:25:11 -08:00
Tom Robinson 04529897dc Add setCode to Executable; use toMarkedString() in compiler; more robust function wrapper stripping in compressor 2010-02-09 14:55:50 -08:00
Tom Robinson 7837e1ad81 Fixed Executable's toMarkedString() 2010-02-09 14:49:54 -08:00
Francisco Ryan Tolmasky I c7c60b2b94 Added toMarkedString to Executable.
Reviewed by me.
2010-02-09 13:57:47 -08:00
Francisco Ryan Tolmasky I f9c2805379 Removed reference to MARKER_TEXT.
Reviewed by me.
2010-02-09 13:40:04 -08:00
Tom Robinson 035d772a4a Respect previously set OBJJ_MAIN_FILE 2010-02-09 11:46:25 -08:00
Alexander LjungbergandRoss Boucher f89c2e0ba9 Fixed: CPDates compared equal to nil and CPNull. 2010-02-09 10:59:59 -08:00
Philipe FatioandRoss Boucher 94ce055bc2 CPWindow's makeFirstResponder: return type was void, changed to BOOL 2010-02-09 10:49:04 -08:00
Klaas Pieter Annema 9b3d4d4453 Merge branch 'jake' into outlineview 2010-02-09 15:01:10 +01:00
Klaas Pieter Annema 329e4dc3c3 Merge branch 'jake' of git://github.com/280north/cappuccino into jake
Conflicts:
	AppKit/CPTableColumn.j
	AppKit/CPTableView.j
2010-02-09 14:57:37 +01:00
Klaas Pieter Annema d96e939eed made sure the dragserver doesn't call prepareDrag if the last drag update returned CPDragOperationNone 2010-02-09 14:43:02 +01:00
Klaas Pieter Annema c8437895dc fixed setDropItem:dropChildIndex behavior 2010-02-09 14:42:11 +01:00
Francisco Ryan Tolmasky I 95ba648dae Fix for keys being wrong in cplutil conversion, and making sure to use the right radix with parseInt when reading plists.
Reviewed by me.
2010-02-09 02:18:52 -08:00
Francisco Ryan Tolmasky I 9f847e5a24 Merge branch 'jake' into loader 2010-02-09 01:03:37 -08:00
Francisco Ryan Tolmasky I a4eec5fef8 Fix for UID returning different values every time for CPString.
Reviewed by me.
2010-02-09 01:02:49 -08:00
Tom Robinson e51bf3f0c1 More upgrading of press to new load system. Analysis is complete, need to build resulting files. 2010-02-08 23:47:29 -08:00
Tom Robinson b907ea59f4 Export a few more properties from Objective-J for use in "press" 2010-02-08 23:45:59 -08:00
Tom Robinson cebff75992 Change jakefile to throw exception if there's a syntax error, etc in one of the optionally required modules. 2010-02-08 23:44:44 -08:00
Alexander LjungbergandRandall Luecke a3f9b65501 Implemented [CPDate copy] with unit test. Also whitespace cleanup in CPDate. 2010-02-09 01:57:24 -05:00
Nicholas Small 1f7afe7a49 Merge branch 'jake' of github.com:280north/cappuccino into loader 2010-02-08 10:51:30 -05:00
Nicholas Small ceecaa0184 Fixed missing { in objj-analysis-tools.j 2010-02-08 10:50:44 -05:00
Klaas Pieter Annema 78b4bbb06e implement setDropItem:dropChildIndex on CPOutlineView 2010-02-08 16:49:07 +01:00
Klaas Pieter Annema 0375e7a881 - further improved outline view drag & drop for multiple parent situations 2010-02-08 14:44:21 +01:00
Klaas Pieter Annema ebc831663b Merge branch 'jake' into outlineview
Conflicts:
	AppKit/CPTableView.j
2010-02-08 11:34:16 +01:00
Klaas Pieter Annema 65ceb96e4f Merge branch 'jake' of git://github.com/280north/cappuccino into jake
Conflicts:
	AppKit/CPTableColumn.j
	AppKit/CPTableView.j
2010-02-08 11:33:33 +01:00
Klaas Pieter Annema 57ef2d2229 removed log statements 2010-02-08 11:14:50 +01:00
Klaas Pieter Annema 8759b175bd various fixes to outline view drag & drop 2010-02-08 11:14:03 +01:00
Tom Robinson 13f86b0cd4 Refactor objj-analysis-tools a bit. 2010-02-08 01:44:55 -08:00
Tom Robinson c0fad49375 Merge branch 'loader' of github.com:280north/cappuccino into loader 2010-02-08 01:12:22 -08:00
Derek HammerandTom Robinson 579cc98e4f Adding the --symlink and --build flags. capp gen -l something is now just an alias for capp gen --symlink --build something. This allows for easy copying of built Frameworks for those hacking on Cappuccino 2010-02-08 01:04:22 -08:00
Randall Luecke 4a98417ee8 Added call to auto resizing after user manually resizes the columns. 2010-02-08 02:20:38 -05:00
Randall Luecke 4a5e90b5cb Fixed column resizing mask types. 2010-02-08 02:16:06 -05:00
cacaodevandRandall Luecke 36a85e935b TableView : Column resizing. Works with column resizingMasks.
TODO: Automatic table resizing should only resize columns marked with TableColumnAutoresizingMask.
TODO: When implemented, use CPTrackingArea instead of mouse moved events.
2010-02-08 01:19:10 -05:00
chandlerkentandRandall Luecke 9034203a4f Fixed a bug where CPTableView doesn't scroll to the top index when using the arrow keys. 2010-02-08 00:49:08 -05:00
Randall Luecke 24e8f8aa43 Restyled tableview to match new Aristo art. Added a bit of a padding to the dataviews and headerviews. 2010-02-07 23:55:40 -05:00
Ross Boucher 632251b16c Infinite recursion error. 2010-02-06 18:31:20 -08:00
Ross Boucher 2406cbe7ed Merge branch 'jake' into loader 2010-02-06 17:47:03 -08:00
Ross Boucher e6a0caa164 cplutil wasn't converting.
CFPropertyList couldn't output XML correctly.
2010-02-06 17:46:32 -08:00
Francisco Ryan Tolmasky I cd3e2fbbb8 Fix for cplutil.
Reviewed by me.
2010-02-06 17:14:37 -08:00
Randall Luecke 47bd6e5ce3 Further cleanup of code and logs in the tableview. 2010-02-06 17:53:40 -05:00
Randall Luecke f590c63e33 Cleaned up tableview logs. 2010-02-06 17:36:20 -05:00
Randall Luecke e8b74ece72 Fixed tableview begin drag/drop behavior to be more cocoa like. 2010-02-06 17:29:19 -05:00
Tom Robinson 3d45699bc7 Merge branch 'loader' of github.com:280north/cappuccino into loader
Conflicts:
	Objective-J/CPLog.js
2010-02-06 14:01:56 -08:00
Tom Robinson ae987f19dc Fixed CPLogRegisterRange and added dup checking and unregister function 2010-02-06 14:00:58 -08:00
Francisco Ryan Tolmasky I 09786cb8d2 Fix CPLog additions breaking build.
Reviewed by me.
2010-02-06 01:57:44 -08:00
Tom Robinson 17072f9ed4 Move CPLog to Objective-J 2010-02-05 22:27:13 -08:00
Tom Robinson 82d3d1abc5 Merge branch 'loader' of github.com:280north/cappuccino into loader 2010-02-05 21:12:08 -08:00
Tom Robinson 2cc40a7961 Add sprintf.js to Objective-J 2010-02-05 21:11:47 -08:00
Francisco Ryan Tolmasky I c523e706e9 Better error reporting.
Reviewed by me.
2010-02-05 20:18:18 -08:00
Klaas Pieter Annema cdca8047b9 Merge branch 'jake' into outlineview
Conflicts:
	AppKit/CPTableView.j
2010-02-05 15:14:40 +01:00
Klaas Pieter Annema 09b8a3394e Merge branch 'jake' of git://github.com/280north/cappuccino into jake
Conflicts:
	AppKit/CPTableColumn.j
2010-02-05 12:15:34 +01:00
Klaas Pieter Annema ed1a7a4bc9 - removed variable row heights from CPTableView (can be found in variabletableview branch)
- fixed a bug where it was not possible to drag unselectable rows #445
2010-02-05 12:11:39 +01:00
Klaas Pieter Annema 0696fb405e improved CPTableView's drop row logic for the lowest possible row 2010-02-05 11:51:06 +01:00
Randall Luecke 265a410342 Changed the default text color for table column data views to match Aristo. 2010-02-04 21:27:06 -05:00
Nicholas Small cbd0d6e6a2 Better nib2cib and CPCoder support for CPTableView. 2010-02-04 15:25:16 -05:00
Nicholas Small 25e0a59d5b Merge branch 'loader' of github.com:280north/cappuccino into loader 2010-02-04 14:14:36 -05:00
Nicholas Small ab34ee882e Add a few flags to NSTableView and CPCoder support for gridColor and gridStyleMask in CPTableView. 2010-02-04 14:14:31 -05:00
Ross Boucher 4f05657236 Merge branch 'jake' into loader
Conflicts:
	Objective-J/Preprocessor.js
2010-02-04 11:10:39 -08:00
Klaas Pieter Annema 7720200679 - improved the CPOutlineView drag & drop support in cases where more than 1 parent is possible
- improved the outline view test project
2010-02-04 16:56:48 +01:00
Klaas Pieter Annema 117ec9970c - reduced the number of rows on the tableview sample so it works with the variable row heights
- made CPTableView ask for the rect of the drop highlight so CPOutlineView can adjust this
- re factored some stuff in CPOutlineView's table delegate
2010-02-04 14:20:12 +01:00
Klaas Pieter Annema 766073f77a reverted some of my drop highlight changes 2010-02-04 13:09:10 +01:00
Klaas Pieter Annema 5f0a60f61c Merge branch 'jake' of git://github.com/280north/cappuccino into jake 2010-02-04 10:35:47 +01:00
Tom Robinson d608d34166 Fixed "phase 1" of press for new loader 2010-02-04 01:00:55 -08:00
Tom Robinson 8bc1c7445d export fileExecuterForPath (and use exports.fileExecuterForPath internally so it can be overridden for press, etc) 2010-02-03 23:50:16 -08:00
Tom Robinson 985b906c94 Merge branch 'loader' of git@github.com:280north/cappuccino into loader 2010-02-03 22:21:55 -08:00
Randall Luecke e8ac94f8da Improved logic for drawing highlighted grid lines. 2010-02-04 00:41:15 -05:00
Randall Luecke 9465dd6941 Merge branch 'jake' of git://github.com/280north/cappuccino into jake 2010-02-04 00:23:19 -05:00
Randall Luecke 28a00fff23 Fixed drawing bug where a the bottom grid line for the selected rows would be drawn white. 2010-02-04 00:19:59 -05:00
Francisco Ryan Tolmasky I c418481981 Don't require trashing Objective-J when changes are made for them to be picked up.
Reviewed by me.
2010-02-03 20:37:24 -08:00
Randall Luecke 2b87b9f3fc Styled the test for the tableview headers, also added more rows to tabletest for performance testing. 2010-02-03 22:34:13 -05:00
Ross Boucher 683eb993e8 Fix for a broken dirname method on File. 2010-02-03 16:17:12 -08:00
Ross Boucher e19d6a58c9 Merge branch 'loader' of github.com:280north/cappuccino into loader 2010-02-03 14:58:16 -08:00
Alexander LjungbergandRoss Boucher 2dccee05bc Fixed: CPWindow setFrame:display: failed with an "unrecognized selector" exception. 2010-02-03 14:58:01 -08:00
Francisco Ryan Tolmasky I ac2885afc6 Support base tag again.
Reviewed by me.
2010-02-03 14:31:02 -08:00
Nicholas Small 972909902e Added ApplicationTask#setFrameworks path. The default is local frameworks, you could also use ENV.CAPP_BUILD or pass capp to use the installed frameworks. 2010-02-03 11:43:48 -05:00
Klaas Pieter Annema b07f2ed186 improved the location of the drag feedback view 2010-02-03 15:25:28 +01:00
Klaas Pieter Annema ee6160e796 - fixed some issues with variable sized
- made CPOutlineView return the last index when dragging the row outside of it's bounds
2010-02-03 15:06:42 +01:00
Klaas Pieter Annema 5940e6913d Merge branch 'jake' of git://github.com/280north/cappuccino into jake 2010-02-03 10:16:45 +01:00
Klaas Pieter Annema c85e33c034 Fixed a bug where the CPTextField value was not updated properly when the update happened in the same 'runloop' iteration as becomeFirstResponder 2010-02-03 10:11:32 +01:00
Francisco Ryan Tolmasky I 21ef259e1f Fix for being too strict when accepting PLISTs and also fixes a regression with erroring when parsing code with shebangs(!).
Closes #69.

Reviewed by me.
2010-02-03 00:31:37 -08:00
Ross Boucher 2b66683167 Update the documentation config based on feedback from:
http://cappnotes.worldofkrauss.com/sectins/objective-j-categories/8-miscellaneous/14-api-documentation-fixes.html

If you have graphviz installed, graphs will now be generated.
Ruby and doxygen are prereqs for building the docs.
2010-02-02 18:35:42 -08:00
Ross Boucher 851a0e3d24 Fix a preprocess.js typo.
Closes #440.
2010-02-02 14:52:55 -08:00
Klaas Pieter Annema 8b32f561ec added selectedRow to CPTableView 2010-02-02 15:57:15 +01:00
Klaas Pieter Annema 1571b6daa2 fixed CPTableView's header view reliance on row height 2010-02-02 15:44:23 +01:00
Klaas Pieter Annema 2d69509d5e - implemented CPTableView heightOfRow: delegate method
- implemented CPOutlineView heightForItem: delegate method
- made CPTableView work correctly with variable sized rows
2010-02-02 14:15:22 +01:00
Klaas Pieter Annema 8edf05c000 made sure the outline view returns a dataview if it's delegate doesn't implement dataViewForTableColumn:item: or if that method returned nil 2010-02-02 11:37:57 +01:00
Klaas Pieter Annema 0e6cef0268 implement outlineview expandItem:expandChildren: 2010-02-02 11:23:24 +01:00
Klaas Pieter Annema 60e4d8e080 Merge remote branch 'cappuccino/jake' into jake
Conflicts:
	AppKit/CPOutlineView.j
	AppKit/CPTableView.j
2010-02-02 10:24:13 +01:00
Randall Luecke 6b58986ec3 Added better artwork for pressed header images for the tableview. 2010-02-02 01:56:53 -05:00
Randall Luecke e88ec01fca Fixed bug where the first click on the CPTableView wouldn't select a row if drag and drop was supported. 2010-02-01 23:26:24 -05:00
Francisco Ryan Tolmasky I 8284498722 Merge branch 'jake' into loader
Conflicts:
	AppKit/Platform/DOM/CPPlatformString.j
2010-02-01 20:19:20 -08:00
Tom Robinson e088280a5f Implement description and toString for class objects. 2010-02-01 17:38:13 -08:00
Klaas Pieter Annema 7f78c323e9 implemented outlineView:shouldSelectItem delegate method 2010-02-01 19:08:22 +01:00
Klaas Pieter Annema 77303c1aeb - implemented CPTableView's dataViewForTableColumn:row: delegate method
- implemented CPOutlineView's dataViewForTableColumn:item: delegate method
2010-02-01 19:00:48 +01:00
Randall Luecke cc74f941c6 Better "fix" for Safari breaking the outlineview... This bug still needs a reduction though. 2010-02-01 11:44:24 -05:00
Randall Luecke 775c1c1c8b Fixed the outline view again... 2010-02-01 11:11:51 -05:00
cacaodevandRandall Luecke 35a7456302 Fixes rows drawing when alternatingRowBackgroundColors > 2. TableTest showing 3 row colors 2010-02-01 10:59:23 -05:00
Klaas Pieter Annema 4006b35a5e fixed a bug where the outline view would send drag & drop datasource messages to it's datasource when they are not implemented 2010-02-01 12:39:22 +01:00
Tom Robinson b562280503 press cleanup 2010-02-01 02:33:41 -08:00
Klaas Pieter Annema e3a075a6a6 - implemented CPOutlineView drag & drop
- improved CPTableView drag & drop feedback
2010-02-01 11:22:57 +01:00
Klaas Pieter Annema 8c534c6d33 Merge branch 'outlineview' into jake 2010-02-01 11:17:15 +01:00
Klaas Pieter Annema 82be6c243c Merge branch 'jake' into enstore_jake
Conflicts:
	AppKit/CPTableView.j
2010-02-01 11:07:42 +01:00
Klaas Pieter Annema 5b8ee5dd1b Merge branch 'jake' of git://github.com/280north/cappuccino into jake
Conflicts:
	AppKit/CPTableView.j
2010-02-01 11:03:27 +01:00
Randall Luecke 050a132bd5 Initial documentation of CPTableView. 2010-02-01 03:40:09 -05:00
Randall Luecke 146bff6766 Initial documentation of CPTableView 2010-02-01 03:27:03 -05:00
Francisco Ryan Tolmasky I cd98bce331 Turned off logging by default, removed unecessary logs, and fixed bug where turning of logs broke the build.
Reviewed by me.
2010-01-31 23:59:58 -08:00
Randall Luecke a2d3723c7a Merge branch 'jake-table' into jake 2010-02-01 02:38:32 -05:00
Randall Luecke ecb88a87ad Added proper grid drawing for highlighted rows. Closing issues #369 Also fixing bug where top row would not draw its background when clipped 2010-02-01 02:33:04 -05:00
Ross Boucher 3f2813932a Merge branch 'jake' of git@github.com:280north/cappuccino into jake 2010-01-31 23:07:11 -08:00
Ross Boucher c2223e3942 Closes #429. This should actually resolve the issue by simply removing the potential race condition entirely. 2010-01-31 23:06:23 -08:00
Randall Luecke 2dc0839d36 Fixed bug where CPButtonBar would not display anything until resized. Closes issue #151. 2010-02-01 00:58:30 -05:00
Tom Robinson 97ef1d1781 Added persistent history to objj repl. 2010-01-31 19:41:58 -08:00
Francisco Ryan Tolmasky I e64a9a7ab9 Fix for objj command line tool not working.
Reviewed by me.
2010-01-31 18:36:36 -08:00
Francisco Ryan Tolmasky I d4f3f83212 Fix for nib2cib not working with new loader.
Reviewed by me.
2010-01-31 17:28:51 -08:00
Randall Luecke 1488f3ed58 Merge branch 'jake' of git://github.com/280north/cappuccino into jake 2010-01-31 19:02:20 -05:00
Randall Luecke 26945bde42 Removed commented out code and fixed a bug where the pressed state was still set when you drag the mouse from outside the bounds of the header and let go. 2010-01-31 18:58:32 -05:00
Ross Boucher c911dd8aa6 Slight order change. This really should not matter. 2010-01-31 15:37:06 -08:00
Ross Boucher 1c81e0eee0 Closes #429. Doesn't necessarily address the root cause however.
The problem stems from a bug in Safari which is allowing callbacks
to interrupt running code (which should be impossible in JavaScript).
The change essentially makes it so that in the case where this happens,
which is rare, we'll end up accidentally creating an extra iframe.
This isn't ideal, but it also isn't harmful, versus the current
situation where code will simply break.
2010-01-31 15:13:07 -08:00
Ross Boucher 5366713790 Closes #429. Doesn't necessarily address the root cause however.
The problem stems from a bug in Safari which is allowing callbacks
to interrupt running code (which should be impossible in JavaScript).
The change essentially makes it so that in the case where this happens,
which is rare, we'll end up accidentally creating an extra iframe.
This isn't ideal, but it also isn't harmful, versus the current
situation where code will simply break.
2010-01-31 15:07:23 -08:00
Ross Boucher e9940d060a Merge branch 'loader' of git@github.com:280north/cappuccino into loader 2010-01-31 14:01:32 -08:00
Ross Boucher 605e905f3e Missing a local assignment of the task variable in one of our jake additions. Causes failures on non cappuccino builds. 2010-01-31 14:00:12 -08:00
cacaodevandRandall Luecke 11d30566bf CPTableHeaderView: change background in -layoutSubviews instead of -setThemeState: ; Added a CPThemeStatePressed used privately, makes things easier for custom headers 2010-01-31 16:31:25 -05:00
Francisco Ryan Tolmasky I 0942f9fac3 Replaced instances of non-compressable words.
Reviewed by me.
2010-01-31 13:14:51 -08:00
Francisco Ryan Tolmasky I 7b303b6529 Removed unused functions.
Reviewed by me.
2010-01-31 12:48:26 -08:00
Ross Boucher 6a9040989d Merge branch 'jake' into loader 2010-01-31 12:32:41 -08:00
Ross Boucher 840e9c7671 When removing an item from the collection view, we now unconditionally unhighlight it.
We also reapply highlights after reloading finishes.

Closes #248.
2010-01-31 12:29:38 -08:00
Randall Luecke 1d9e2f8169 Changed drawn gradients to aristo art. 2010-01-31 01:55:45 -05:00
Francisco Ryan Tolmasky I 8c9f302b67 Added debug stuff.
Reviewed by me.
2010-01-30 21:08:18 -08:00
Ross Boucher 44f23cd8ac Merge branch 'loader' of git@github.com:280north/cappuccino into loader 2010-01-30 19:24:47 -08:00
Ross Boucher c88f781509 Fix for Cib connections not being available in IE. 2010-01-30 19:23:45 -08:00
Francisco Ryan Tolmasky I 3dc578d585 Fix for using setTimeout instead of setNativeTimeout and assuming bundled directories are themselves not bundles.
Reviewed by me.
2010-01-30 19:11:12 -08:00
Francisco Ryan Tolmasky I 238d8ff0be Merge branch 'jake' into loader 2010-01-30 18:09:17 -08:00
Francisco Ryan Tolmasky I ca5dd0071c Various IE fixes.
Reviewed by me.
2010-01-30 18:08:19 -08:00
cacaodevandRandall Luecke 86fa759f9f CPTableHeaderView.j: Gradient headers for canvas capable browsers | Bg images for others. Column selection with pressed state.
AppController.j:	Modified left table in TestTable to test column selection.
CPTableView.j:          Added missing ivar; Fixed -deselectRow|Column:
2010-01-30 13:05:48 -05:00
Francisco Ryan Tolmasky I 0bcf8a6626 Trailing comma fix.
Reviewed by me.
2010-01-30 01:14:32 -08:00
Francisco Ryan Tolmasky I d735cd98e7 Fix for FireFox not working.
Reviewed by me.
2010-01-30 00:35:59 -08:00
Francisco Ryan Tolmasky I e25a550d3f Merge branch 'cheese' into loader 2010-01-29 22:33:32 -08:00
Francisco Ryan Tolmasky I 8a2206656d Fix for responseXML not working correctly from remote.
Reviewed by me.
2010-01-29 22:31:34 -08:00
Ross Boucher ac68d670a2 Slight error in the sizing for the previous progress bar commit 2010-01-29 22:11:43 -08:00
Ross Boucher e6539bbed5 MHTML cache testing 2010-01-29 22:11:18 -08:00
Ross Boucher 9db0694677 Remove unused images. 2010-01-29 21:45:03 -08:00
Francisco Ryan Tolmasky I a4d73330cc Data URLs.
Reviewed by me.
2010-01-29 21:43:23 -08:00
Francisco Ryan Tolmasky I ea6a983e9b Merge branch 'jake' of git@github.com:280north/cappuccino into loader 2010-01-29 17:53:36 -08:00
Francisco Ryan Tolmasky I 79cd8603a2 Removed now unecessary CommonJS files.
Reviewed by me.
2010-01-29 16:37:53 -08:00
Francisco Ryan Tolmasky I 02cb054b71 Removed unused plist file.
Reviewed by me.
2010-01-29 16:21:27 -08:00
Ross Boucher 007cfd589f Merge branch 'jake' of git@github.com:280north/cappuccino into jake 2010-01-29 15:18:10 -08:00
Ross Boucher 90d24fd6bf Temporary update for progress indicators for 0.8 2010-01-29 15:17:21 -08:00
Francisco Ryan Tolmasky I 4b7310d0cb More consistent naming scheme.
Reviewed by me.
2010-01-29 15:16:22 -08:00
Francisco Ryan Tolmasky I 59660032e1 nib2cib fixes.
Reviewed by me.
2010-01-29 13:22:44 -08:00
Francisco Ryan Tolmasky I d9c47ec763 Updated environments and removed environment collections. Also creates separate files for different forms of spriting.
Reviewed by me.
2010-01-29 10:54:47 -08:00
Klaas Pieter Annema a18ea750a6 Fixed a bug where CPOutlineView would not call super's implementation of selectRowIndexes:byExtendingSelection: 2010-01-29 18:01:46 +01:00
Klaas Pieter AnnemaandRandall Luecke c423411639 made sure CPControl's trackMouse: doesn't eat mouse events when the tableview is in a drag session #431 2010-01-29 11:36:13 -05:00
Francisco Ryan Tolmasky I b5ad030e40 Further blend work.
Reviewed by me.
2010-01-29 08:04:00 -08:00
Klaas Pieter Annema bfdbe2a34a updated the collection view sample to actually move the dragged items 2010-01-29 16:46:56 +01:00
Klaas Pieter Annema ec5dcb47c9 - fixed a bug where the tableview would send the wrong concluded dropped row to it's datasource
- implemented CPCollectioView drop on behavior
2010-01-29 14:58:45 +01:00
Klaas Pieter Annema 436f1d1541 improved the way drop highlights are shown 2010-01-29 14:24:44 +01:00
Klaas Pieter Annema 05873a030f Merge branch 'jake' into enstore_jake 2010-01-29 12:19:59 +01:00
Klaas Pieter Annema 78083eea48 made sure CPControl's trackMouse: doesn't eat mouse events when the tableview is in a drag session #431 2010-01-29 12:14:08 +01:00
Klaas Pieter Annema 7715da02e7 Merge remote branch 'cappuccino/jake' into jake
Conflicts:
	AppKit/CPTableView.j
	AppKit/CPViewAnimation.j
2010-01-29 12:12:50 +01:00
Klaas Pieter Annema 6798a5777a added the cpoutlineview test app 2010-01-29 10:57:34 +01:00
Klaas Pieter Annema 2f3ad961e7 Merge remote branch 'cappuccino/jake' into enstore_jake
Conflicts:
	AppKit/CPTableView.j
2010-01-29 10:56:30 +01:00
Klaas Pieter Annema dba047187f improved the way a CPTableView renders the drag & drop highlight between rows 2010-01-29 10:47:49 +01:00
Ross Boucher 03e63f29dc Merge branch 'jake' of git@github.com:280north/cappuccino into jake 2010-01-29 00:13:33 -08:00
Ross Boucher b4cd9c4c45 Remove HTML5 drag and drop support from browsers. 2010-01-29 00:12:51 -08:00
Randall Luecke b9b2649db9 Cleaned up merge and removed unnessisary selectionIsChanging notification. 2010-01-29 01:37:57 -05:00
Derek HammerandRandall Luecke df98483b06 Removing extraneous selection did change notifications 2010-01-29 01:28:09 -05:00
cacaodevandRandall Luecke 37fbeaad02 CPTableView -dragViewForRowsWithIndexes:
- Change the way dragViewOffset is computed to conform to cocoa
- Drag exposed rows only
2010-01-29 01:22:38 -05:00
Francisco Ryan Tolmasky I 794d8a754c Make blendtask work with new system.
Reviewed by me.
2010-01-28 16:24:18 -08:00
Ross Boucher b081debf88 Missing #include for the platform header.
Closes #412.
2010-01-28 15:49:03 -08:00
Nicholas Small 36c6c9bfa6 Merge branch 'jake' of github.com:280north/cappuccino into jake 2010-01-28 17:59:08 -05:00
Nicholas Small bda5ea1c59 Rewrote CPFlashView implementation to be fully cross-browser and standards compliant. 2010-01-28 17:58:50 -05:00
Nicholas Small 5ccf6eefc0 Changed CPFlashMovie -fileName to -filename. 2010-01-28 17:58:08 -05:00
Francisco Ryan Tolmasky I 06261559fc Improvements for CommonJS.
Reviewed by me.
2010-01-28 14:19:23 -08:00
Klaas Pieter Annema 477d2f9d82 fixed the disclosure triangle highlighting behavior 2010-01-28 20:10:14 +01:00
Klaas Pieter Annema 0cb66ddc6e set the default CPTableColumn dataview's center vertical-alignment (because it looks better) 2010-01-28 18:52:01 +01:00
Klaas Pieter Annema 99df7f6acb - further implemented CPOutlineView drag & drop support
- implemented a work around in CPPlatformWindow+DOM.j for the javascript drop event never being fired
2010-01-28 16:54:50 +01:00
Tom Robinson 0791fa0ad3 Eliminate a couple accidental globals. 2010-01-28 00:18:40 -08:00
Tom Robinson 9811327672 press whitespace cleanup 2010-01-27 22:37:26 -08:00
Tom Robinson 60f2eaadf5 Modify press to inspect cibs for dependent classes. 2010-01-27 22:36:28 -08:00
Tom Robinson 5478c640cc Refactor of press's objj-analysis-tools in prep for inspecting cibs. 2010-01-27 22:35:19 -08:00
Tom Robinson 7fe3b115f1 Remove legacy image spriting code from press. 2010-01-27 20:46:35 -08:00
Tom Robinson 3ee63b754c Remove theme bundle loading in press for now. 2010-01-27 17:54:28 -08:00
Tom Robinson 378b6c12f3 Merge branch 'jake' of git@github.com:280north/cappuccino into jake 2010-01-27 17:54:03 -08:00
Tom Robinson ee5817e480 Cleanup objj arguments story. objj-executable and "objj path/to/main.j" are now consistent. 2010-01-27 17:53:05 -08:00
Ross Boucher a354b4acd5 Temporary fix for 0.8 for copy/paste behavior in CPTextField.
Closes #407.
2010-01-27 16:36:39 -08:00
Tom Robinson 8e87a4a941 Make bootstrap warning very explicit. 2010-01-27 10:17:36 -08:00
Francisco Ryan Tolmasky I 42712166e9 Added FileRequest abstraction on top of HTTPRequest to allow synchronous loading in CommonJS.
Reviewed by me.
2010-01-27 07:50:37 -08:00
Francisco Ryan Tolmasky I 2bc31de69d Removed alerts.
Reviewd by me.
2010-01-27 04:01:11 -08:00
Francisco Ryan Tolmasky I fcfeb29be5 Changed #define from RHINO to COMMONJS. Re-enabled recently added document-load-waiting.
Reviewed by me.
2010-01-27 03:58:49 -08:00
Francisco Ryan Tolmasky I a64a270e25 Merge branch 'jake' of git@github.com:280north/cappuccino into loader 2010-01-27 03:17:16 -08:00
Francisco Ryan Tolmasky I 96eebc7d1d Fix for accidentally removing Executable.fileDependencies.
Reviewed by me.
2010-01-27 03:16:46 -08:00
Francisco Ryan Tolmasky I 38fd675f51 Performance improvements and bug fixes.
Reviewed by me.
2010-01-27 02:55:56 -08:00
Tom Robinson 35adaee1bb Initial press cib analysis 2010-01-27 02:27:32 -08:00
Klaas Pieter Annema def314b5ad removed log statements from cptableview 2010-01-27 11:05:31 +01:00
Klaas Pieter Annema 913a18eaaf completed tableview merge 2010-01-27 10:40:51 +01:00
unknown d82b39de19 Remove filename causing problems on Windows as well as line endings in press. 2010-01-27 01:21:32 -08:00
Klaas Pieter Annema cde5d8709c Merge remote branch 'cappuccino/jake' into enstore_jake
Conflicts:
	AppKit/CPTableView.j
2010-01-27 10:08:48 +01:00
Francisco Ryan Tolmasky I ec210c49c5 Beginnings of new loader.
Reviewed by me.
2010-01-27 00:43:54 -08:00
Tom Robinson 07f320def9 Fixed jake tasks for pushing packages to package repo. 2010-01-27 00:08:42 -08:00
Tom Robinson f5fe15d6cb Merge branch 'jake' of git@github.com:280north/cappuccino into jake 2010-01-26 23:50:41 -08:00
Nicholas Small da146b0873 Move table view header resources into AppKit/Resources. 2010-01-26 10:53:07 -05:00
Paul BaumgartandRoss Boucher 3b7a77ae0c Minor fix: change emdash to regular hyphen. 2010-01-25 22:21:26 -08:00
tlrobinson 9cb1e28ad1 bootstrap option to install Cappuccino/Objective-J packages. 2010-01-25 20:43:37 -08:00
Ross Boucher 9db7701691 Fixes a bug when changing splitPane status for a CPSplitView.
Closes #419.
2010-01-25 17:03:24 -08:00
Tom Robinson 27aca4c84a bootstrap.sh warning about shell config 2010-01-25 14:19:30 -08:00
Tom Robinson 4e50244dca Handle more bootstrap.sh edge cases. 2010-01-25 14:14:34 -08:00
Tom Robinson 0c21724270 Give debug frameworks higher priority in objj. 2010-01-25 13:35:27 -08:00
Tom Robinson 09306aa2cd Fixed cplutil and updated to use args parser, added lint option, etc. 2010-01-25 12:49:11 -08:00
Randall Luecke 1170673b92 selection did change is no longer posted if selectionShouldChangeInTableView returns NO. Closes 372. Keyboard navigation in tableview now honors selectionShouldChange. 2010-01-24 20:01:58 -05:00
Ross Boucher 712a991c86 Fix a bug introduced by the new document.body code when opening a second platform window. 2010-01-24 15:48:25 -08:00
Ross Boucher e3cdcbc5ab Add CPSpaceKeyCode. Closes #424. 2010-01-24 15:24:59 -08:00
luddepandRoss Boucher 62379b21c1 Quick fix for @"Aristo" being hardcoded in CPAlert.j 2010-01-24 01:17:20 -08:00
Ross Boucher cfde67742c Merge branch 'jake' of git@github.com:280north/cappuccino into jake 2010-01-24 01:15:35 -08:00
Ross Boucher 9b01561127 Fix the collection view resizing behavior. 2010-01-24 01:15:10 -08:00
Randall Luecke fb89450b90 Refactored keyboard navigation for CPTableView 2010-01-24 03:39:58 -05:00
Ross Boucher 5a8d491f10 Check the Info.plist for a CPDefaultTheme key for the name of the default theme.
Closes #418.
2010-01-24 00:34:35 -08:00
Ross Boucher 7ffb44e394 Merge branch 'jake' of git@github.com:280north/cappuccino into jake 2010-01-24 00:10:28 -08:00
Ross Boucher 34a5d9e61b Fix spacing issues in CPViewAnimation. 2010-01-24 00:10:04 -08:00
Randall Luecke e1d43e3651 Merge branch 'jake-table' into jake 2010-01-24 02:39:31 -05:00
Klaas Pieter AnnemaandRandall Luecke c291ad83f1 Implemented visual feedback when dragging in CPTableView
Conflicts:

	AppKit/CPTableView.j
2010-01-24 02:37:25 -05:00
Klaas Pieter AnnemaandRoss Boucher c6a4eb28a8 added cpviewanimation 2010-01-23 23:31:40 -08:00
Randall Luecke dd4735026a Reset position of the tableview in tabletest 2010-01-24 02:31:01 -05:00
Ross Boucher dc0439227e Add an accessor for the filename on CPFlashMovie 2010-01-23 23:28:39 -08:00
Ross Boucher 00f470763f Make CPFlashMovie CPCoding compliant. 2010-01-23 18:08:45 -08:00
Klaas Pieter Annema 05b1cfca31 Merge branch 'jake_original' into jake
Conflicts:
	AppKit/CPTableView.j
2010-01-23 11:38:08 +01:00
cacaodevandRandall Luecke e40696a7af CPTableView: drag & drop improvements
- Default dragView containing dragged rows, works with discrete rows
- scroll-as-you-drag feature
- draggingEntered returns a drag operation. Rearranged a bit the code.
- fixed dragPoint/target row
- Modified test app so you can drag in both ways and also move indexes internally
2010-01-23 02:56:59 -05:00
Ross Boucher bc030c42d9 Merge branch 'jake' of git@github.com:280north/cappuccino into jake 2010-01-22 19:43:21 -08:00
Ross Boucher 7ce72a31c5 Rather than throwing out the entire cappuccino body, throw out a specific div if that div is available.
("cappuccino-body"). This let's external libraries, esp. flash ones, add things to the body without
Cappuccino getting rid of them as soon as the page loads.

Closes #421.
2010-01-22 19:40:33 -08:00
Tom Robinson cf8989938c Improved sizeOfString IE workaround 2010-01-22 18:38:25 -08:00
Klaas Pieter Annema e09b63183c added cpviewanimation 2010-01-22 20:44:58 +01:00
Klaas Pieter Annema 76717c7177 converted spaces to tabs 2010-01-22 20:37:17 +01:00
Klaas Pieter Annema 6749fa57ad started implementing CPOutlineView drag & drop support 2010-01-22 20:25:14 +01:00
Klaas Pieter Annema 050b75a2df Implemented visual feedback when dragging in CPTableView 2010-01-22 20:17:34 +01:00
Randall Luecke 3f730c94ce Merge branch 'jake' of git://github.com/280north/cappuccino into jake 2010-01-22 10:51:48 -05:00
Randall Luecke 22c931729b Removed additional references to disabled HUD scrollbar knobs. 2010-01-22 10:50:29 -05:00
Klaas Pieter Annema cb658826a3 Merge branch 'jake' into enstore_jake 2010-01-22 10:15:34 +01:00
Ross Boucher 3f8c311ea2 Bring windows forward when opening a sheet.
Closes #391.
2010-01-21 23:24:03 -08:00
Randall Luecke 22aa4d359e Hard coded header view resources into the CPTableView 2010-01-22 02:09:22 -05:00
Ross Boucher c2880ec8e4 Remove support for HTML5 drag and drop from Chrome, because it doesn't work.
We should eventually try and figure out a more specific test for this.
2010-01-21 23:02:12 -08:00
Ross Boucher 108822d4e1 Merge branch 'jake' of git@github.com:280north/cappuccino into jake 2010-01-21 22:33:06 -08:00
Randall Luecke f79a926b10 Removed references to disabled scroller knob in HUD CPScroller. 2010-01-22 01:22:03 -05:00
cacaodevandRoss Boucher 4eef234736 Fix a bug where drop was always failing in webkit nighties 2010-01-21 22:04:35 -08:00
Klaas Pieter Annema 5abbdfc094 Merge branch 'jake' into enstore_jake 2010-01-21 15:01:21 +01:00
Klaas Pieter Annema c44715bef4 added CPSpaceKeyCode to CPResponder 2010-01-21 11:59:28 +01:00
Randall Luecke b5f55100e9 Merge branch 'jake' of git://github.com/280north/cappuccino into jake 2010-01-20 23:19:18 -05:00
Tom Robinson 4e0404fce6 IE sizeOfString temporary fix. 2010-01-20 17:12:46 -08:00
Tom Robinson f1874eca8a Don't use sudo in jake install by default, add "sudo-install" task. 2010-01-20 15:18:51 -08:00
Tom Robinson 2e1d6f2412 Migrate to use INTERPRETER.Context 2010-01-19 16:58:41 -08:00
Tom Robinson 0395287906 Press bundle callbacks for theme/cib --flatten support. 2010-01-19 15:00:43 -08:00
Francisco Ryan Tolmasky I bda8a5fd6c Merge branch 'jake' of git@github.com:280north/cappuccino into jake 2010-01-19 14:46:05 -08:00
Alexander LjungbergandFrancisco Ryan Tolmasky I ded413481c Fixed: under certain circumstances controls would not be drawn despite a call to setNeedsDisplay:YES. A typical symptom of this was custom CPViews' drawRect never being called. The error was caused by _CPDisplayServer throwing away its remaining work whenever the display code of a control called setNeedsLayout. 2010-01-19 14:45:47 -08:00
Tom Robinson a5a6c07b08 Move manual tests to Manual sub dir 2010-01-19 13:16:16 -08:00
Nicholas Small 204df99375 Make CPPanel -becomesKeyOnlyIfNeeded and CPView -needsPanelToBecomeKey work. 2010-01-15 17:23:56 -05:00
Randall Luecke 55dd67a0ad Merge branch 'jake' of git://github.com/280north/cappuccino into jake 2010-01-14 15:02:53 -05:00
tlrobinson 6040ee4ffc Fixed args case "objj -Ifoo bar.j" 2010-01-14 12:01:51 -08:00
Randall Luecke 544ed99d98 Merge branch 'jake' of git://github.com/280north/cappuccino into jake 2010-01-14 14:26:02 -05:00
tlrobinson 7546640fba Correct the args parsing in objj to provide the script name at args[0] instead of "objj" 2010-01-14 11:24:39 -08:00
Francisco Ryan Tolmasky I daf5b88834 Merge branch 'jake' of git@github.com:280north/cappuccino into jake 2010-01-13 22:40:01 -08:00
Francisco Ryan Tolmasky I c36f975bbf More support for toolbar items and nib2cib. Added support for CPToolbarShowColorsItem.
Reviewed by me.
2010-01-13 22:39:15 -08:00
Scott KyleandRoss Boucher a5e34d9153 Added CGGeometry to CPTableColumn since it's called from sizeToFit 2010-01-13 20:08:00 -08:00
Ross Boucher 57a63440f9 Remove unnecessary comments. 2010-01-13 20:04:23 -08:00
Francisco Ryan Tolmasky I e25a227e4d Fix for updating target/action of toolbar items.
Reviewed by me.
2010-01-13 20:03:01 -08:00
Randall Luecke db7b340b32 Fixed outline view again after scoping fix. 2010-01-13 22:34:39 -05:00
Randall Luecke 7683755137 Fixed scoping issues with last commit. 2010-01-13 22:22:44 -05:00
Randall Luecke 8de71663c2 Fixes for the CPTableView drag operation (selection and drag and drop) after the nasty fix for the outlineview fix for Safari. 2010-01-13 21:30:10 -05:00
cacaodevandRandall Luecke 211a7c7939 Make built-in data views highlightable 2010-01-13 19:36:21 -05:00
Randall Luecke 82ce66af16 Further hack to fix the CPOutlineView which is broken in Safari. 2010-01-13 19:30:11 -05:00
Tom Robinson df4bc13122 A splash of color in the build tools... 2010-01-13 12:58:26 -08:00
Tom Robinson 8f3661d5a4 Partial support for theme/additional bundles in press. 2010-01-13 12:57:31 -08:00
Tom Robinson bb31ac11ca Delete OUTPUT_DIRECTORY if exists and --force on 2010-01-13 03:48:04 -08:00
Tom Robinson 4ef0065c66 Print identifiers in alphabetical order for clarity. 2010-01-13 03:46:27 -08:00
Tom Robinson 476d168a46 Merge branch 'jake' of github.com:280north/cappuccino into jake 2010-01-13 01:57:52 -08:00
Tom Robinson 093c6cdca3 More robust handing of string passed to CPURLRequest instead of CPURLs. 2010-01-13 01:57:04 -08:00
Tom Robinson 345f5e14de Refactor hardcoded Aristo.blend into CPApplication +defaultThemeName 2010-01-13 01:53:23 -08:00
Paul BaumgartandFrancisco Ryan Tolmasky I 5ddfef7eb7 Convert relative paths to absolute when specifying an install_directory for narwhal. 2010-01-13 00:57:44 -08:00
Francisco Ryan Tolmasky I 81d784b5dc Added missing license.
Reviewed by me.
2010-01-12 22:55:58 -08:00
Francisco Ryan Tolmasky I b0b9a7a294 Merge branch 'jake' of git@github.com:280north/cappuccino into jake 2010-01-12 22:55:50 -08:00
Francisco Ryan Tolmasky I e76ee3c96e A few more changes for CPToolbar nib2cib support and added beginnings of search field support.
Reviewed by me.
2010-01-12 22:54:35 -08:00
Francisco Ryan Tolmasky I 24b495ca43 Temporary fix for CPTableView being broken.
Reviewed by me.
2010-01-12 22:52:34 -08:00
Tom Robinson ff4fd1411e Add --force option, change shorthand --flatten to -l 2010-01-12 22:48:29 -08:00
Francisco Ryan Tolmasky I 03eed5f4f9 Got rid of unecessary code/files.
Reviewed by me.
2010-01-12 19:05:22 -08:00
Francisco Ryan Tolmasky I 1c89968b69 nib2cib support for the new CPToolbar/CPToolbarItem, also improved classes to pick up item property changes (i.e, setLabel:, setAction:, etc.) after the toolbar has been initialized
Conflicts:

	Tools/nib2cib/NSAppKit.j
	Tools/nib2cib/NSToolbarItem.j
2010-01-12 19:02:43 -08:00
Tom Robinson 01ce469a0f Convert objj-analysis-tools.j line endings to Unix style 2010-01-12 18:46:44 -08:00
Tom Robinson c6347a3cf1 Remove relativeToRootPath 2010-01-12 18:42:03 -08:00
Tom Robinson bf7e581445 Add URLMap to pressed --flattened bundles. 2010-01-12 17:24:20 -08:00
Tom Robinson 0fe9253d3b Add some git hooks 2010-01-12 13:05:05 -08:00
Tom Robinson 6a9042fd9c make narwhal-jsc version check optional 2010-01-12 13:01:11 -08:00
Tom Robinson 9e62fdc0b8 added missing CPNull imports 2010-01-12 12:28:32 -08:00
Tom Robinson a33b70f8bd Cleanup of common.jake to properly load built packages, etc. 2010-01-12 03:54:26 -08:00
Tom Robinson bfc06ed81f Merge branch 'jake' of github.com:280north/cappuccino into jake 2010-01-12 02:14:41 -08:00
Francisco Ryan Tolmasky I c3c8ac7ff0 Fix for missing parenthesis causing syntax error.
Reviewed by me.
2010-01-12 01:49:06 -08:00
Ross Boucher bfd0c00708 Merge branch 'jake' of git@github.com:280north/cappuccino into jake 2010-01-11 22:37:29 -08:00
Ross Boucher ef0c84072b Fix the platform identifying code.
Fix the longstanding IE refresh bug by ensuring document is ready.
Closes #98.
2010-01-11 22:33:08 -08:00
Nicholas Small 066972ff75 Some fixes for last commit. Thanks to Jesse Ross. 2010-01-11 16:43:49 -05:00
Nicholas Small 608853d4fa Added -setFlashVars: and -setParameters: to CPFlashView. Closes #59. 2010-01-11 14:13:05 -05:00
Francisco Ryan Tolmasky I 1774305c2d Merge branch 'jake' of git@github.com:280north/cappuccino into jake 2010-01-10 12:19:08 -08:00
Francisco Ryan Tolmasky I 3295966022 Updated Jake package version number.
Reviewed by me.
2010-01-10 12:18:13 -08:00
Randall Luecke 8f43f5a4a1 Added resource for drag and drop image. 2010-01-10 00:37:42 -06:00
Tom Robinson 379f40c1be Cleanup build dir checking, print deprecation warning for STEAM_BUILD 2010-01-09 15:35:31 -08:00
Randall Luecke c2282af879 Removed called to super on keyDown which was invoking a scroll in addition to calling scrollRowToVisible. 2010-01-09 14:21:07 -06:00
Tom Robinson d057b1909f Point to TextMate bundle 2010-01-08 15:36:36 -08:00
Ross Boucher 2ba4e99114 Merge commit 'luddep/font-improvements' into fonts 2010-01-08 09:43:39 -08:00
Ross Boucher f61a6ba5ff Fix an issue where _CPImageAndTextView, if it had an image, wouldn't show the image if it hadn't already been loaded. In other words, it now listens for image load events and redisplays. 2010-01-08 09:34:43 -08:00
luddep 34a6389a92 CPFont now supports multiple font families. Closes #255. 2010-01-08 18:05:33 +01:00
Francisco Ryan Tolmasky I b675adbbb0 Fix for text being gone in buttons.
Reviewed by me.
2010-01-08 04:03:48 -08:00
Ross Boucher e46da0e2f2 Merge branch 'jake' of git@github.com:280north/cappuccino into jake 2010-01-07 22:33:57 -08:00
Francisco Ryan Tolmasky I 44b257a749 Removed spaces at the end of lines.
Reviewed by me.
2010-01-07 22:23:32 -08:00
luddepandRoss Boucher fe2599eb35 buttons now momentarily go the the pressed state when clicked programmatically. Closes #187 2010-01-07 22:17:05 -08:00
Randall Luecke d791a189bc added support for HUD scroll bars 2010-01-08 00:15:32 -06:00
Randall Luecke bbc521a2f3 removed call to scrollRowToVisible: the bug is in clipviews and should not be fixed in the tableview itself. 2010-01-08 00:05:24 -06:00
Francisco Ryan Tolmasky I 56f6da606c Missing licenses on a few files.
Reviewed by me.
2010-01-07 19:33:28 -08:00
Francisco Ryan Tolmasky I 3e098b7479 Merge branch 'jake' of git@github.com:280north/cappuccino into jake 2010-01-07 19:30:53 -08:00
Francisco Ryan Tolmasky I 7e2fe6d5be Fix for white flash when loading Cappuccino apps.
Reviewed by boucher.
2010-01-07 19:30:17 -08:00
Randall Luecke c4b2cf9394 Patch for inline editing in CPTableView and clean up of doubleAction: 2010-01-07 20:35:27 -06:00
Randall Luecke 9ac823833a Fix for TableView drag being started while sometimes selecting 2010-01-07 19:42:31 -06:00
Francisco Ryan Tolmasky I 60132c085c Merge branch 'jake' of git@github.com:280north/cappuccino into jake 2010-01-07 17:12:41 -08:00
Francisco Ryan Tolmasky I 5e14e65eb0 Fix for CPArray test not passing.
Reviewed by me.
2010-01-07 16:36:25 -08:00
Randall Luecke 64063fb77d Support for drag and drop in TableTest 2010-01-07 18:31:59 -06:00
Randall Luecke aa309ef27c Implementation of drag and drop, auto resizing columns, keyboard support, scrollToVisible for columns and rows, double click action, deselectAll, and various other bug fixes and features. 2010-01-07 17:34:02 -06:00
Scott KyleandRoss Boucher 4c81c9e21e Fixed typo "Janurary" 2010-01-07 12:26:51 -08:00
Francisco Ryan Tolmasky I f4912eb23b Merge branch 'jake' of git@github.com:280north/cappuccino into jake 2010-01-06 22:51:31 -08:00
Francisco Ryan Tolmasky I 7f85b8b33f Tiny bit more support for toolbars in nib2cib.
Reviewed by me.
2010-01-06 21:08:01 -08:00
Tom Robinson 85c68f78da Update for compatibility with latest narwhal. Switch back to 280north/narwhal 2010-01-06 20:00:37 -08:00
Francisco Ryan Tolmasky I af03085d5f Fix for incorrect menu logic.
Reviewed by me.
2010-01-05 19:20:47 -08:00
Francisco Ryan Tolmasky I b7d747ee17 Fixed a bug in CPTreeNode's KVO implementation.
Reviewed by me.
2010-01-05 15:49:16 -08:00
Francisco Ryan Tolmasky I b6f100888a Merge branch 'jake' of git@github.com:280north/cappuccino into jake 2010-01-05 11:15:45 -08:00
Francisco Ryan Tolmasky I 3cfd392e3e Added new automatic undo API to CPUndoManager.
Added archiving support for CPTreeNode.

Reviewd by me.
2010-01-05 11:14:56 -08:00
Ross Boucher 7ed98a8655 Fix a typo pointed out by Bruno on the mailing list. 2010-01-05 09:50:02 -05:00
Ross Boucher d78eb4a4e5 Fix an undefined notification variable 2010-01-04 19:11:10 -05:00
Randall LueckeandRoss Boucher a3d168b646 left unnessisary line... whoops 2010-01-04 10:24:45 -05:00
Randall LueckeandRoss Boucher 5018df511b fix for window overlapping the menu bar if the user dragged it up there. 2010-01-04 10:24:38 -05:00
Ross Boucher 09345a9d53 Use a notificaiton rather than a direct call for windowDidResize:
Closes #393.
2010-01-04 10:21:16 -05:00
Francisco Ryan Tolmasky I 8b17cd3cde Merge branch 'jake' of git@github.com:280north/cappuccino into jake 2009-12-31 01:24:51 -08:00
Francisco Ryan Tolmasky I 403fcd8fff Preparing for options fix in Narhwal.
Reviewed by me.
2009-12-30 23:52:55 -08:00
tlrobinson 409be4020b Temporarily use tlrobinson/narwhal/master in bootstrap. 2009-12-29 13:35:48 -08:00
Nicholas Small 24801a220c Merge branch 'jake' of github.com:280north/cappuccino into jake 2009-12-26 19:12:31 -05:00
Nicholas Small 19b9f4e1c1 Enabling an accordion item will cause it to expand. 2009-12-26 19:11:33 -05:00
Francisco Ryan Tolmasky I 48d584df58 Fixed typo in setSubviews:.
Reviewed by me.
2009-12-26 01:20:16 -08:00
Francisco Ryan Tolmasky I dd999a29fd Added applyChange:toKeyPath: and inverseChangedDictionary to support "automatic" undo with KVO.
Reviewed by me.
2009-12-24 19:15:38 -08:00
Francisco Ryan Tolmasky I 75fdfb5a0b Improved observable arrays to support indexOfObject:, indexOfObjectIdenticalTo:, and removeObjectIdenticalTo:.
Reviewed by me.
2009-12-24 18:45:20 -08:00
Francisco Ryan Tolmasky I 6b4db4e9ae Merge branch 'jake' of git@github.com:280north/cappuccino into jake 2009-12-23 19:32:43 -08:00
Francisco Ryan Tolmasky I 2571b24f22 Removed TextMate and Xcode files since the ones being used now have their own repos. Linked to them in the README.
Reviewed by me.
2009-12-23 19:31:51 -08:00
Nicholas Small 855a9eea44 Merge branch 'jake' of github.com:280north/cappuccino into jake 2009-12-23 16:51:46 -05:00
Nicholas Small 189e299592 Added CPAccordionView -setEnabled:forItemAtIndex: 2009-12-23 16:50:56 -05:00
Ross Boucher 6cbaa35849 Add CPOperation to Foundation 2009-12-23 11:30:10 -05:00
Ross Boucher cb1cfa4d94 Better support for recursing in CPDictionaryWithJSObject: 2009-12-20 20:32:17 -05:00
Ross Boucher 5bbf893a37 Merge branch 'jake' of git@github.com:280north/cappuccino into jake 2009-12-20 20:11:59 -05:00
Ross Boucher 3ddbfb5dea Encode the header clip view in the CPCoder methods.
Closes 363.
2009-12-20 20:11:22 -05:00
Francisco Ryan Tolmasky I 5352d062d5 Fix for boundsOrigin and boundsSize being affected by bounds. Also changed UID to return a string instead of a Number.
Reviewed by me.
2009-12-20 17:02:06 -08:00
Randall LueckeandFrancisco Ryan Tolmasky I e15cbfca33 fix bug in CPPlatformWindow where the visible frame for the platform window would offset itself for the menu bar height, even though no menu bar would be displayed because it's not the primaryPlatformWindow 2009-12-20 15:44:39 -08:00
Francisco Ryan Tolmasky I 51b58f911e Merge branch 'jake' of git@github.com:280north/cappuccino into jake 2009-12-20 13:01:11 -08:00
Francisco Ryan Tolmasky I 7acfbb9eed Added [CPView setSubviews:] which allows you to add multiple subviews, remove multiple subviews, and reorder multple subviews.
Reviewed by me.
2009-12-20 13:00:25 -08:00
Ross Boucher 4bf9853a25 Merge branch 'jake' of git@github.com:280north/cappuccino into jake 2009-12-20 13:13:15 -05:00
Ross Boucher 58c6db0a8f Fix the logic behind CPURLConnection's _isLocalFileConnection 2009-12-20 13:12:29 -05:00
tlrobinson aed52a7829 Improved bootstrap.sh further. Prompt to delete existing installations, etc. 2009-12-19 23:16:37 -08:00
Ross Boucher a1e24a3f95 Fix a bug where keyPaths which had a component evaluating to self would send notifications containing the wrong keypath in the observation.
Includes test case.
2009-12-19 17:47:02 -05:00
Ross Boucher 11cff29916 Merge branch 'jake' of git@github.com:280north/cappuccino into jake 2009-12-19 15:32:52 -05:00
Ross Boucher f184b9bcc4 Add a few KVO tests around arrays 2009-12-19 15:32:23 -05:00
tlrobinson bab0024e0c Cleanup some build scripts 2009-12-19 04:31:11 -08:00
aburkhalterandtlrobinson deed92cff7 Toll-free bridge Error to CPException. Add rhinoException in objj_exception for better error reporting. 2009-12-19 03:49:22 -08:00
Francisco Ryan Tolmasky I a9bc949679 Actual fix for disabled items in CPMenu. Previous fix still selected disabled items and showed submenus for disabled items.
Reviewed by me.
2009-12-18 22:31:12 -08:00
Randall LueckeandRoss Boucher 1411410f4e fixed bug in CPMenu where action would be sent when the user clicked on a disabled menu item. 2009-12-18 18:43:03 -05:00
Ross Boucher 648fbe1b10 Add sendsActionOnEndEditing to the CPCoding methods for CPControl 2009-12-18 15:54:44 -05:00
Ross Boucher 7042f89620 Fix a return type error. Closes #358. 2009-12-17 00:57:09 -05:00
Ross Boucher e235fffb5e Correct HTML escaping and unescaping in Objective-J/plist. Closes 361. 2009-12-17 00:54:00 -05:00
Ross Boucher 6aadd13450 Update CPColorPanel to handle drag and drop correctly, which broke with native drag and drop. Closes 364. 2009-12-17 00:25:49 -05:00
Ross Boucher 349de098af Merge branch 'jake' of git@github.com:280north/cappuccino into jake
Conflicts:
	AppKit/CPMenuItem/CPMenuItem.j
2009-12-16 19:00:48 -05:00
Ross Boucher 5527e585f6 Make Windows handle key equivalents in menus correctly. Make the menu display the string properly on Windows too. 2009-12-16 18:58:21 -05:00
Francisco Ryan Tolmasky I a6e9814dfc Merge branch 'jake' of git@github.com:280north/cappuccino into jake 2009-12-16 15:03:27 -08:00
Francisco Ryan Tolmasky I f01a7d3933 Fix for menu items incorrectly leaving out shift symbol if the key equivalent is uppercase.
Reviewed by me.
2009-12-16 15:02:35 -08:00
Nicholas Small d2cd3b899f Fix CPTabViewItem -tabView. 2009-12-16 00:22:35 -05:00
Francisco Ryan Tolmasky I ac2c0d5d84 Update CPUndoManager to post checkpoint notifications and only create run loop performs if undos actually take place.
Reviewed by me.
2009-12-15 16:37:47 -08:00
Ross Boucher f0d0b512ca Merge branch 'jake' of git@github.com:280north/cappuccino into jake 2009-12-13 18:30:16 -08:00
Ross Boucher c859ffd0f7 Support for copy/paste/cut and selectedRange/setSelectedRange in CPTextField.
Improvements to the Pasteboard integration code from yesterday.
2009-12-13 18:29:25 -08:00
Tom Robinson 4eb57f3cc5 Merge branch 'jake' of github.com:280north/cappuccino into jake 2009-12-13 15:02:38 -08:00
Tom Robinson 6218bfaf9e Rewrite/cleanup of press. Incomplete, but press --flatten "works" for some value of "work". 2009-12-13 15:01:19 -08:00
Ross Boucher 4d5cdcaeae Fix for the pasteboard changes breaking everything. 2009-12-12 18:36:48 -08:00
Ross Boucher 6ad62a6f2f Add support for native pasteboards to webtop 2009-12-12 14:15:45 -08:00
Ross Boucher 37d4b151d7 Merge branch 'jake' of git@github.com:280north/cappuccino into jake 2009-12-11 16:55:36 -08:00
Ross Boucher 37c1d804f6 Fix for text shadows sometimes being the wrong color.
Closes #359.
2009-12-11 16:54:38 -08:00
Francisco Ryan Tolmasky I d200df3e9c Typo in last commit.
Reviewed by me.
2009-12-11 12:03:25 -08:00
Francisco Ryan Tolmasky I eb43e416ae Added CPProxy class to support better undo proxying in CPUndoManager.
Closes #370.
Closes #371.

Reviewed by me.
2009-12-11 11:38:26 -08:00
Francisco Ryan Tolmasky I e6244f71bd Merge branch 'jake' of git@github.com:280north/cappuccino into jake 2009-12-11 11:16:37 -08:00
Francisco Ryan Tolmasky I 403277ed06 Further refined KVO tests.
Reviewed by me.
2009-12-11 11:16:17 -08:00
Ross Boucher dbe8a59c3c Merge branch 'jake' of git@github.com:280north/cappuccino into jake 2009-12-11 10:58:40 -08:00
Ross Boucher a98de54db4 A few additions for pretty printing things and getting better error messages 2009-12-11 10:58:07 -08:00
Francisco Ryan Tolmasky I 7edb7266f2 Added test for old dependent values in KVO.
Reviewed by me.
2009-12-11 10:54:17 -08:00
Nicholas Small d14e077511 Make CPTableView selection notifications behave the same as in Cocoa. 2009-12-10 03:07:22 -05:00
Francisco Ryan Tolmasky I 211c14e316 Merge branch 'jake' of git@github.com:280north/cappuccino into jake 2009-12-07 18:59:57 -08:00
Francisco Ryan Tolmasky I 4fbc140551 Better descriptions for CPArray.
Reviewed by me.
2009-12-07 18:54:01 -08:00
Ross Boucher ee8e65c80d Fix for alt+character key events not propagating correctly.
Closes #354.
2009-12-05 16:58:26 -08:00
Ross Boucher 1db2e0282a Typo in the new platform window code for cursors 2009-12-04 18:41:57 -08:00
Ross Boucher 2351f73c76 Make the new cursor stuff work across platform windows 2009-12-04 18:07:53 -08:00
Ross Boucher 20a38c3aac Merge branch 'jake' of git@github.com:280north/cappuccino into jake 2009-12-04 16:49:22 -08:00
Ross Boucher bca25d0f5f Fix for windows being super floaty 2009-12-04 16:48:43 -08:00
Ross Boucher b26853e4d7 Fix for a path issue with non flattened source files in jake 2009-12-04 16:47:50 -08:00
Francisco Ryan Tolmasky I 39049f82fc Fix for nib2cib incorrectly requiring at least 2 arguments.
Reviewed by me.
2009-12-04 15:02:59 -08:00
Francisco Ryan Tolmasky I a30250f758 Merge branch 'menus' into jake
Closes #73.
Closes #75.
Closes #121.
Closes #130.
Closes #197.

Reviewed by me.
2009-12-04 12:39:49 -08:00
Francisco Ryan Tolmasky I 629737cda3 Apply positioning heuristics to +[CPMenu popUpMenu...] as well.
Reviewed by me.
2009-12-04 12:12:53 -08:00
Francisco Ryan Tolmasky I ec41411675 Fix for disabled menu item shadows, and slighlty better positioning for pop up menus.
Reviewed by me.
2009-12-04 11:55:01 -08:00
Francisco Ryan Tolmasky I becdf2bfeb Fix for menus not having the proper font.
Reviewed by me.
2009-12-04 11:35:40 -08:00
Ross Boucher 1e723945f8 Should have removed rather than commented out these lines 2009-12-04 11:25:20 -08:00
Ross Boucher dfb7599bb6 Remove the cursor hack from CPImageAndTextView, set the cursor globally to the default in CPApplication 2009-12-04 11:22:57 -08:00
Ross Boucher e1d3363ad9 A couple fixes to the CPCursor stuff 2009-12-04 11:12:13 -08:00
cacaodevandRoss Boucher c36c750c5d CPCursor implementation tested in WebKit/FF/IE/Opera. See comments in the file for more details. 2009-12-04 11:02:57 -08:00
Francisco Ryan Tolmasky I c7581c0847 Merge branch 'jake' into menus
Conflicts:
	AppKit/CPMenu.j
2009-12-03 22:50:13 -08:00
Ross Boucher 936d65291f Temporary fix until Francisco merges in the menu branch. 2009-12-03 19:31:52 -08:00
Francisco Ryan Tolmasky I a64030ad93 Merge branch 'jake' into menus 2009-12-03 19:25:38 -08:00
cacaodevandRoss Boucher 01d60ad4e9 CPSearchField changes from issue #194 2009-12-03 19:24:43 -08:00
Francisco Ryan Tolmasky I 06b64c6a87 Fix for a few edge cases, and added showsStateColumn support to nib2cib.
Reviewed by me.
2009-12-03 19:24:03 -08:00
Francisco Ryan Tolmasky I 0eff4e2bc0 Fix for moving to a base menu resetting the child menu.
Reviewed by me.
2009-12-03 17:58:49 -08:00
Ross Boucher 44d6139db2 Fix for some resizing issues in CPWebView. 2009-12-03 17:39:44 -08:00
Francisco Ryan Tolmasky I 506e3004b7 Merge branch 'jake' into menus 2009-12-03 17:02:02 -08:00
Francisco Ryan Tolmasky I 9ce4c7a468 Don't highlight items while scrolling.
Reviewed by me.
2009-12-03 16:59:10 -08:00
Ross Boucher 2fc724e469 Merge branch 'jake' of git@github.com:280north/cappuccino into jake 2009-12-03 16:29:46 -08:00
Ross Boucher afb69a7f03 Set the created window to not be at 0,0. We need real cascading support. 2009-12-03 16:29:08 -08:00
Ross Boucher cd2dd9f12d Remove dead variables 2009-12-03 16:28:56 -08:00
Francisco Ryan Tolmasky I 29963f74d6 Made menu positioning smarter.
Reviewed by me.
2009-12-03 16:24:35 -08:00
Francisco Ryan Tolmasky I 565a017ebd Merge branch 'jake' into menus 2009-12-03 11:21:35 -08:00
Derek HammerandFrancisco Ryan Tolmasky I 0b85847524 Adding reset to CPAppBootstrapper so that application can be restarted programmatically 2009-12-03 11:20:44 -08:00
Francisco Ryan Tolmasky I cfc46edfb8 Fix for properly positioning pop up button menus.
Reviewed by me.
2009-12-03 01:27:53 -08:00
Francisco Ryan Tolmasky I f250373673 Fix for actions not being sent in submenus.
Reviewed by me.
2009-12-03 00:42:13 -08:00
Francisco Ryan Tolmasky I b0acc13da7 Fix for exceptions when not on a menu item.
Reviewed by me.
2009-12-02 23:08:33 -08:00
Francisco Ryan Tolmasky I d705af8965 Added support for indentation levels in menu items.
Reviewed by me.
2009-12-02 20:41:52 -08:00
Francisco Ryan Tolmasky I a401dfddff Merge branch 'jake' into menus 2009-12-02 20:19:14 -08:00
Francisco Ryan Tolmasky I f579fd925e Fixed state columns not showing up.
Reviewed by me.
2009-12-02 20:18:25 -08:00
Ross Boucher e6d86eaa9b Throw an exception for -1 indexes in CPArray objectAtIndex: 2009-12-02 19:19:18 -08:00
Francisco Ryan Tolmasky I 348e45a5cd Some cleanup and a fix for custom views in menus.
Reviewed by me.
2009-12-02 18:40:47 -08:00
Ross Boucher 2120e9cf2a Potential fix for a drawing issue in IE. 2009-12-02 18:27:18 -08:00
Ross Boucher 3002acc895 Change for the way in which we detect full bridge window close 2009-12-02 18:26:55 -08:00
Francisco Ryan Tolmasky I 0b3c313280 Fix for highlight look in menu bars.
Reviewed by me.
2009-12-02 18:12:50 -08:00
Francisco Ryan Tolmasky I 982ab4b4fa Merge branch 'jake' into menus 2009-12-02 17:18:11 -08:00
Ross Boucher a0ee2f384b Merge branch 'jake' of git@github.com:280north/cappuccino into jake 2009-12-02 17:15:17 -08:00
Ross Boucher 56a739655f A whole bunch of textfield and key event fixes. 2009-12-02 17:14:47 -08:00
Francisco Ryan Tolmasky I 150ee44da0 Added background highlight to menu bar and fixed highligh turning off after stopping tracking in menu bar.
Reviewed by me.
2009-12-02 16:39:38 -08:00
Francisco Ryan Tolmasky I 78795e3167 Preliminary menu bar support.
Reviewed by me.
2009-12-02 15:57:52 -08:00
tlrobinson b0dd3cd818 Fix nib2cib. 2009-12-01 20:02:55 -08:00
Francisco Ryan Tolmasky I ef12ec54d7 Added new view for menu bar items.
Reviewed by me.
2009-12-01 19:19:24 -08:00
Francisco Ryan Tolmasky I 495b774965 A bit of cleanup.
Reviewed by me.
2009-12-01 17:49:15 -08:00
Ross Boucher 1381bb5c54 Prevent CPViewController from loading the same cibs lots of times. I think the solution should be made generic and put into CPCib though. Closes #348. 2009-12-01 09:25:49 -08:00
Ross Boucher f1d4794dd1 Merge branch 'jake' of git@github.com:280north/cappuccino into jake 2009-12-01 09:14:45 -08:00
Thomas BalthazarandRoss Boucher d58473c270 Fix for GHissue #348 : CPViewController should cache the cib 2009-12-01 09:14:30 -08:00
Francisco Ryan Tolmasky I 7adf32f36e Changed menu bar background image.
Reviewed by me.
2009-11-30 23:41:16 -08:00
Francisco Ryan Tolmasky I 5c3beb4160 Fix for _minimumWidth not being defined in the CPMenu class, resulting in minimum widths being applied globally, and menus appearing in strange places in desktop mode.
Reviewed by me.
2009-11-30 23:20:56 -08:00
Francisco Ryan Tolmasky I b82c307007 Added -setMinimumWidth/minimumWidth to CPMenu.
Reviewed by me.
2009-11-30 23:08:05 -08:00
Francisco Ryan Tolmasky I a7010e7598 Accidentally broke normal menu items.
Reviewed by me.
2009-11-30 22:43:36 -08:00
Francisco Ryan Tolmasky I f850cbf780 Better handling of submenu actions.
Reviewed by me.
2009-11-30 22:30:41 -08:00
Tom Robinson 4581fe4f22 Cleanup command line tool args (change objj to include command at args[0]) 2009-11-30 21:45:01 -08:00
Francisco Ryan Tolmasky I 35df54ae99 Merge branch 'jake' into menus 2009-11-30 21:29:27 -08:00
Francisco Ryan Tolmasky I f8a5f91687 Fix for nib2cib leaving cells as targets for menu items.
Reviewed by me.
2009-11-30 21:28:42 -08:00
Francisco Ryan Tolmasky I 4b71557584 Added -popUpMenuPositioningItem:atLocation:inView:callback: and began porting existing uses to it.
Reviewed by me.
2009-11-30 20:54:53 -08:00
Tom Robinson feda903f2f Remove unused junk 2009-11-30 18:45:40 -08:00
Tom Robinson 150e264f0d Remove bake. 2009-11-30 17:21:16 -08:00
Tom Robinson b592f6ae92 Remove submodules 2009-11-30 17:15:37 -08:00
Francisco Ryan Tolmasky I 37ba8fb57d Merge branch 'jake' into menus 2009-11-30 02:02:48 -08:00
Francisco Ryan Tolmasky I 72f80cdbed Cleaned up menu constraints.
Reviewed by me.
2009-11-30 02:01:44 -08:00
Francisco Ryan Tolmasky I c070f20669 Better constraint support, and better support for moving out of submenus.
Reviewed by me.
2009-11-29 19:54:15 -08:00
Ross Boucher a4d5165a3d Fix for style issues. 2009-11-26 19:53:36 -05:00
Abhinav GuptaandRoss Boucher 4fdddfb585 Fixed CPString's commonPrefixWithString to be faster. 2009-11-26 19:49:41 -05:00
Abhinav GuptaandRoss Boucher 0575e96b60 Added commonPrefixWithString method to CPString and tests for it. 2009-11-26 18:13:01 -05:00
Ross Boucher d0a8749986 Fix a type in CPOutlineView. Closes #265. 2009-11-25 00:09:55 -05:00
Ross Boucher 44fbf8afe2 Add support for encoding dates, courtesy of luddep. 2009-11-24 23:02:38 -05:00
Ross Boucher 1eb9202233 A few style guideline changes. 2009-11-24 22:56:18 -05:00
Alexander LjungbergandRoss Boucher b7da92d225 CPDate initWithString: now takes proper international format strings like NSDate. Similarly CPDate description generates such strings. 2009-11-24 22:42:02 -05:00
Ross Boucher e4f6d0db1f Fixes an issue with HUD style alert panels. Closes #343. 2009-11-24 22:13:20 -05:00
Ross Boucher 0a8bd9f687 Remove the "Cancelled" message that Safari shows when an XHR is cancelled during startup. Closes #344. 2009-11-24 18:38:25 -05:00
Ross Boucher f2608998f9 Fixes a typo in CPRectContainsRect by simply calling out to CGRectContainsRect. We should explore simply removing this method entirely. Includes test cases. Closes #345. 2009-11-24 18:30:31 -05:00
Ross Boucher ffb08d32ce Fix an issue with storing 0 in a CPSet. Includes test cases. Closes #337. 2009-11-24 16:06:32 -05:00
Francisco Ryan Tolmasky I 119e776ddc Make scrolling work in submenus.
Reviewed by me.
2009-11-23 23:35:58 -08:00
Francisco Ryan Tolmasky I 652930d5aa Merge branch 'jake' into menus 2009-11-22 16:43:43 -08:00
Francisco Ryan Tolmasky I e3babe97e4 Update to fix menu item sizes breaking on second open.
Reviewed by me.
2009-11-20 23:34:21 -08:00
Ross Boucher 72d01865ae Add about panel 2009-11-20 18:06:16 -08:00
Ross Boucher b9664681a3 Better error reporting for narwhal-jsc 2009-11-19 15:29:20 -08:00
Ross Boucher fd5c545189 Merge branch 'jake' of git@github.com:280north/cappuccino into jake 2009-11-19 14:54:51 -08:00
Ross Boucher 0639f4b00f Exit from subjake if the subjake returns non zero status code. Don't exit in the compiler (required for building in Atlas to not kill the process) 2009-11-19 14:48:18 -08:00
Tom Robinson ab49986238 Add --clone option to bootstrap, and prompt for location 2009-11-19 14:18:49 -08:00
Francisco Ryan Tolmasky I a4fdc50d1d Move these back into their own folders.
Reviewed by me.
2009-11-19 14:04:16 -08:00
Francisco Ryan Tolmasky I ed228b6183 Merge branch 'jake' into menus 2009-11-19 14:02:34 -08:00
Francisco Ryan Tolmasky I e0e675531a Temporarily move these out into the main folder.
Reviewed by me.
2009-11-19 14:02:16 -08:00
Francisco Ryan Tolmasky I 44e0879224 Merge branch 'jake' of git@github.com:280north/cappuccino into jake 2009-11-19 13:26:36 -08:00
Francisco Ryan Tolmasky I 1e6fa93ea2 Fix for NSScrollView breaking nib2cib.
Reviewed by me.
2009-11-19 13:26:02 -08:00
Tom Robinson 2aaed6bffd Replace outdated objj-executable with Narwhal magic. 2009-11-19 00:17:12 -08:00
Francisco Ryan Tolmasky I 2d367a8b47 Fix for not being able to drag window from spaces in toolbar.
Reviewed by me.
2009-11-18 22:08:57 -08:00
Francisco Ryan Tolmasky I 52c18abc5e Fix for class_addMethod with a root class.
Reviewed by me.
2009-11-18 21:56:10 -08:00
Ross Boucher 595c70ed56 Merge branch 'jake' of git@github.com:280north/cappuccino into jake 2009-11-18 14:28:33 -08:00
Alexander LjungbergandRoss Boucher 9faec8decd Fixed: calling setIsPaneSplitter: on a CPTableView would change the divider width but the subviews would not change size to match. 2009-11-18 14:22:58 -08:00
Tom Robinson 90dc1f6cf8 Reorder shell config file checks. 2009-11-18 01:34:01 -08:00
Francisco Ryan Tolmasky I ba01976151 Added target and action to radio groups.
Reviewed by me.
2009-11-17 19:52:20 -08:00
Francisco Ryan Tolmasky I 4d7f5a8a09 Fix for fixing state after turning setAllowsMixedState to NO.
Reviewed by me.
2009-11-17 19:17:58 -08:00
Ross Boucher 2d01fa6f94 Merge branch 'jake' of git@github.com:280north/cappuccino into jake 2009-11-17 17:04:12 -08:00
Ross Boucher 970f848b84 Make CPAlert slightly (but only slightly) more externally hackable 2009-11-17 17:03:42 -08:00
Tom Robinson 31feec0465 Flush stdin after writing file to ShrinkSafe process (fixes building in Rhino) 2009-11-17 17:02:07 -08:00
Francisco Ryan Tolmasky I 2466c14300 Merge branch 'jake' of git@github.com:280north/cappuccino into jake 2009-11-17 14:49:30 -08:00
Francisco Ryan Tolmasky I 49927fcfb7 Fix for building projects where source files are in nested subfolders.
Reviewed by me.
2009-11-17 14:46:54 -08:00
Ross Boucher f612683dfb Taking this out for now. 2009-11-17 10:26:58 -08:00
Ross Boucher 11e6ad2153 Adding a simple way to set a function for the target/action 2009-11-17 09:28:44 -08:00
Klaas Pieter AnnemaandRoss Boucher d041c69e0d Added a check if the window is loaded in CPWindowController 2009-11-17 09:19:05 -08:00
Randall LueckeandRoss Boucher b394052145 fixed tableview typo 2009-11-17 09:16:30 -08:00
Francisco Ryan Tolmasky I bce83e45b5 Merge branch 'jake' of git@github.com:280north/cappuccino into jake 2009-11-16 18:28:04 -08:00
Francisco Ryan Tolmasky I 77bd8d3a76 Add hide: and hideOthers support.
Reviewed by me.
2009-11-16 18:27:38 -08:00
Tom Robinson 118ece9f1c Implement "which" for bootstrap and switch to 280north repos. 2009-11-16 17:11:05 -08:00
Francisco Ryan Tolmasky I 971956a6ba Merge branch 'jake' of git@github.com:280north/cappuccino into jake 2009-11-16 15:09:51 -08:00
Francisco Ryan Tolmasky I 48cd362015 Fix for using unicode characters with capp config.
Reviewed by me.
2009-11-16 15:09:22 -08:00
Tom Robinson b12b1bf662 Incorrect case in require("os") 2009-11-16 14:12:53 -08:00
Francisco Ryan Tolmasky I 6829d502d7 Better support for opening files.
Reviewed by me.
2009-11-16 11:47:06 -08:00
Francisco Ryan Tolmasky I aa8689a4f0 Fix for compiling with spaces in path name and misidentifying IE.
Reviewed by me.
2009-11-15 19:13:13 -08:00
Francisco Ryan Tolmasky I 44cbcc60fa Check for gcc.
Reviewed by me.
2009-11-15 15:07:58 -08:00
Francisco Ryan Tolmasky I d4edb28837 Merge branch 'jake' of git@github.com:280north/cappuccino into jake 2009-11-15 14:46:59 -08:00
Francisco Ryan Tolmasky I 3245f38788 nib2cib fix for pull down menus.
Reviewed by me.
2009-11-15 14:45:46 -08:00
Ross Boucher 392cca1b2a Look for uppercase charactrs OR shift keys for determining shift key mask status on menu items 2009-11-15 12:51:48 -08:00
Francisco Ryan Tolmasky I ad901ed4b0 Added convinience method to applicationtask for grabbing the built index file.
Reviewed by me.
2009-11-15 07:38:28 -08:00
Francisco Ryan Tolmasky I 8f1e56e398 Implemented manual validation for toolbar items and fixed a number of toolbar bugs.
Closes #43.
Closes #48.

Reviewed by me.
2009-11-15 00:35:52 -08:00
Francisco Ryan Tolmasky I b694437dba Fix for flash when closing windows.
Reviewed by me.
2009-11-14 19:58:40 -08:00
Francisco Ryan Tolmasky I 370efb35aa Merge branch 'jake' of git@github.com:280north/cappuccino into jake 2009-11-14 19:57:59 -08:00
Francisco Ryan Tolmasky I dc93f39b58 Fix for infinite loop with inserting newlines and interpretKeyEvents:.
Reviewed by me.
2009-11-14 19:57:31 -08:00
Ross Boucher 629c8669c2 Merge branch 'jake' of git@github.com:280north/cappuccino into jake 2009-11-14 17:04:51 -08:00
Ross Boucher 558dbdc612 Some documentation. Eventually I will rewrite all of the key event stuff to work like Google Closure using this documentation 2009-11-14 17:04:18 -08:00
Ross Boucher 1944f51f97 Hack for desktop Capp key events 2009-11-14 17:04:02 -08:00
Francisco Ryan Tolmasky I 312a48a3fe Fix for borderless bridge windows showing and allowing the user to use resize indicator.
Reviewed by me.
2009-11-14 14:41:09 -08:00
Francisco Ryan Tolmasky I 5fc67ff7de Fix for CPScrollView not updating appropriately when using setShowsVerticalScroller: and setShowsHorizontalScroller:.
Reviewed by me.
2009-11-14 13:24:58 -08:00
Francisco Ryan Tolmasky I d584b4dccf Minor radio button change on init and info plist dependency.
Reviewed by me.
2009-11-14 10:57:19 -08:00
Francisco Ryan Tolmasky I 9d50b33268 Merge branch 'jake' of git@github.com:280north/cappuccino into jake 2009-11-14 07:25:37 -08:00
Francisco Ryan Tolmasky I 722166a9d2 Fix for default Jakefile for themes.
Reviewed by me.
2009-11-14 07:24:54 -08:00
Ross Boucher ec83a0f779 Add some support for setting save panel properties in desktop mode 2009-11-13 22:24:55 -08:00
Ross Boucher e20311c25a minor text field change 2009-11-13 22:24:45 -08:00
Francisco Ryan Tolmasky I c21fb3bb26 Merge branch 'jake' of git@github.com:280north/cappuccino into jake 2009-11-13 17:40:02 -08:00
Francisco Ryan Tolmasky I 9dfdde674f Fix for off by one error in HTML 5 Safari drag and drop, as well as error when building with Rhino Narwhal.
Reviewed by me.
2009-11-13 17:39:16 -08:00
tlrobinson f4b37fbf3b Add sudo to jake install. Add narwhal.local.conf. Remove tusk engine. 2009-11-13 13:58:23 -08:00
Francisco Ryan Tolmasky I 13c5736a0f Fix for capp gen sometimes failing.
Reviewed by me.
2009-11-13 10:10:26 -08:00
Ross Boucher 47de360719 Merge branch 'jake' of git@github.com:280north/cappuccino into jake 2009-11-13 08:43:38 -08:00
tlrobinson 19e3d93f1a Print warning and exit if a required package is missing. 2009-11-12 20:42:07 -08:00
Ross Boucher 2d5aef6157 Fix for **** type in DocumentController, and an Info.plist bug in bundle tasks. 2009-11-12 20:37:56 -08:00
Francisco Ryan Tolmasky I e94ddb4179 First pass at submenus.
Reviewed by me.
2009-11-12 18:20:16 -08:00
Ross Boucher 29785e21cd Merge branch 'jake' of git@github.com:280north/cappuccino into jake 2009-11-12 18:08:55 -08:00
Francisco Ryan Tolmasky I 95612b256f Fix for broken rm_rf reference in bundletask, as well as using Info.plist by default.
Reviewed by me.
2009-11-12 17:34:11 -08:00
Ross Boucher a3a03d702c Remove a few IE bugs. 2009-11-12 15:54:52 -08:00
Ross Boucher 742df0df82 Merge branch 'jake' of git@github.com:280north/cappuccino into jake 2009-11-12 11:24:47 -08:00
Ross Boucher aaac5e429d New textfield code that passes keyboard events through the standard mechanisms. Still broken in IE. 2009-11-12 11:24:23 -08:00
Francisco Ryan Tolmasky I c3ac3ddd3f A few fixes to drag and drop.
Reviewed by me.
2009-11-12 04:15:43 -08:00
Francisco Ryan Tolmasky I 61c0d33b4d Made shadows more robust with platform windows.
Reviewed by me.
2009-11-12 01:46:10 -08:00
Francisco Ryan Tolmasky I 67672ebb0c Merge branch 'jake' of git@github.com:280north/cappuccino into jake 2009-11-12 01:28:53 -08:00
Francisco Ryan Tolmasky I 6132243968 Fix intersectsSet: in CPSet.
Reviewed by me.
2009-11-12 00:50:34 -08:00
Tom Robinson 88635ed440 bootstrap.sh changes: reorder shell config checks, add option to set JSC to default, misc cleanup. 2009-11-11 17:59:01 -08:00
Tom Robinson 3d42cba823 Fix capp gen -f . putting frameworks in / 2009-11-11 15:25:27 -08:00
Francisco Ryan Tolmasky I 51a58f650e Minor cleanup issues.
Reviewed by me.
2009-11-11 10:07:57 -08:00
Tom Robinson 6c79a31b38 Jake task for pushing built packages. Only to be used by maintainers, unless remote URLs are changed. 2009-11-11 05:02:12 -08:00
Francisco Ryan Tolmasky I 91ffb0ea0c Merge branch 'jake' of git@github.com:280north/cappuccino into jake 2009-11-11 02:14:08 -08:00
Francisco Ryan Tolmasky I 77c74412dc Update shrinksafe for 1.5 support.
Reviewed by me.
2009-11-11 02:13:41 -08:00
Ross Boucher 008a320e6a Merge branch 'jake' of git@github.com:280north/cappuccino into jake 2009-11-09 21:35:31 -08:00
Francisco Ryan Tolmasky I f3e90f87b1 Fixed a typo that caused non-IE configurations to stop spriting images.
Reviewed by me.
2009-11-09 14:35:28 +01:00
Francisco Ryan Tolmasky I 11b881273e Put MHTML contents into .sj.
Reviewed by me.
2009-11-09 13:57:00 +01:00
Ross Boucher 229debc2b7 Fixes a bug in testHasSuffix, adds test cases for hasSuffix and hasPrefix. 2009-11-09 13:11:04 +01:00
Francisco Ryan Tolmasky I 0c24a60bac Support setting sources per environment.
Reviewed by me.
2009-11-05 01:02:38 -08:00
Francisco Ryan Tolmasky I 2aa061a6af Merge branch 'jake' of git@github.com:280north/cappuccino into jake 2009-11-05 00:05:02 -08:00
Francisco Ryan Tolmasky I 8f9d83495c Use interactive shrinksafe to improve buildtimes.
Reviewed by me.
2009-11-05 00:04:37 -08:00
Francisco Ryan Tolmasky I cb18896137 First pass at spriting in IE.
Reviewed by me.
2009-11-04 21:38:24 -08:00
Ross Boucher b13eee1fc9 Merge branch 'master' into jake 2009-11-04 14:24:10 -08:00
Ross Boucher 95c3401640 Fix some old calls to _bridgeMouseEvent: which were not updated 2009-11-04 14:23:30 -08:00
Francisco Ryan Tolmasky I 2f40cff3e2 Changed log message.
Reviewed by me.
2009-11-03 14:14:08 -08:00
Francisco Ryan Tolmasky I 848828222b Updated cappuccino dependency on objective-j. Also removed old install-tools script to remove confusion.
Reviewed by me.
2009-11-03 01:54:53 -08:00
Francisco Ryan Tolmasky I d3e6819fd7 Fix for cibs not being properly copied when built, also fixes Debug Objective-J not being placed in the objective-j package.
Reviewed by me.
2009-11-02 21:09:41 -08:00
Tom Robinson 55bbfc9205 Merge branch 'jake' of github.com:280north/cappuccino into jake 2009-11-02 19:39:09 -08:00
Tom Robinson b6e9625729 Update capp gen to use objj-frameworks data. 2009-11-02 19:38:48 -08:00
Francisco Ryan Tolmasky I fe91331dc4 Updated readme file to remove references to rake.
Reviewed by me.
2009-11-02 19:38:25 -08:00
Francisco Ryan Tolmasky I cf946c62a8 Merge branch 'master' of git@github.com:280north/cappuccino into jake 2009-11-02 19:22:29 -08:00
Francisco Ryan Tolmasky I 420ce1799a Added check to make sure user is using the right versions of jake and browserjs.
Reviewed by me.
2009-11-02 18:31:14 -08:00
Francisco Ryan Tolmasky I 72adaa51ee Skip all images, not just .gif.
Reviewed by me.
2009-11-02 17:36:13 -08:00
Francisco Ryan Tolmasky I 695f60aefc Replaced Rakefile with Jakefile for NibApplication template.
Reviewed by me.
2009-11-02 17:30:47 -08:00
Francisco Ryan Tolmasky I e00c2f3c05 Merge branch 'jake' of git@github.com:280north/cappuccino into jake 2009-11-02 17:24:50 -08:00
Francisco Ryan Tolmasky I 7ae0f1fec9 Updated Application and ThemeDescriptor templates to use jake instead of rake. Also made all objective-j jake definitions accessible through cappuccino/jake as well.
Reviewed by me.
2009-11-02 17:23:50 -08:00
Tom Robinson 6b3f05f517 Several fixes in "capp": handle empty config file, skip reading gifs, escape config keys in regex 2009-11-02 17:03:16 -08:00
Ross Boucher 93c90274b5 Updates for massaging a few key inputs. 2009-11-02 16:47:07 -08:00
Francisco Ryan Tolmasky I 2d1d30a663 Merge branch 'jake' of git@github.com:280north/cappuccino into jake 2009-11-02 16:01:02 -08:00
Francisco Ryan Tolmasky I baa1318298 Further cleanup.
Reviewed by me.
2009-11-02 15:59:42 -08:00
Tom Robinson 8fddc2370b Update test task. 2009-11-02 15:31:14 -08:00
Francisco Ryan Tolmasky I ea8245a6b3 Added an additional warning to the rake message.
Reviewed by me.
2009-11-02 15:20:23 -08:00
Francisco Ryan Tolmasky I d508459480 Added jake as a dependency for objective-j and cappuccino packages.
Reviewed by me.
2009-11-02 15:10:26 -08:00
Francisco Ryan Tolmasky I 6fc56226ba Removed jack as a dependency for packages.
Reviewed by me.
2009-11-02 15:04:00 -08:00
Francisco Ryan Tolmasky I c98107b6b8 Updated necessary tusk installs.
Reviewed by me.
2009-11-02 15:01:56 -08:00
Francisco Ryan Tolmasky I 17d68eeb97 Cleaned up a few unused Rakefiles and added warning to main Rakefile.
Reviewed by me.
2009-11-02 14:58:21 -08:00
Francisco Ryan Tolmasky I a457145312 Merge branch 'jake' of git@github.com:280north/cappuccino into jake 2009-11-02 14:50:51 -08:00
Francisco Ryan Tolmasky I 0c13138a20 Split up objective-j and cappuccino CommonJS packages, and added ability to include Objective-J frameworks in CommonJS packages.
Reviewed by me.
2009-11-02 14:49:58 -08:00
Tom Robinson e8b1ff8846 Another Array().join() trick off-by-one bug. 2009-11-02 00:37:40 -08:00
saikatandTom Robinson eeae653c94 Made secure text fields have the right number of characters when focus is taken away from them. Closes issue #318. 2009-11-02 00:35:53 -08:00
Tom Robinson 6d402bdc00 Install narwhal-jsc on OS X in bootstrap.sh. Add newline when appending PATH 2009-11-01 23:19:11 -08:00
Francisco Ryan Tolmasky I fddf3d70ff Fixed typo in bootstrap.sh prompt.
Reviewed by me.
2009-11-01 22:54:25 -08:00
Francisco Ryan Tolmasky I 87e39bc707 Added .bash_login to searched files in bootstrap.sh.
Reviewed by me.
2009-11-01 22:50:22 -08:00
Tom Robinson 7c4f01d81b bootstrap.sh script 2009-11-01 20:45:36 -08:00
Francisco Ryan Tolmasky I 96523aca07 Merge branch 'master' into jake 2009-11-01 15:11:51 -08:00
Francisco Ryan Tolmasky I 1ceeec8b5b Fixed typo in NSEvent.j.
Reviewed by me.
2009-11-01 15:05:22 -08:00
Francisco Ryan Tolmasky I cba546880b Added some missing import statements.
Reviewed by me.
2009-11-01 14:23:48 -08:00
Francisco Ryan Tolmasky I 2355cf4f6c Fixed performKeyEquivalent: order (execute on view hierarchy first, then menus).
Reviewed by me.
2009-11-01 13:05:49 -08:00
Ross Boucher 2c0e717b23 Merge branch 'master' of git@github.com:280north/cappuccino 2009-11-01 11:21:56 -08:00
Ross Boucher 8745843105 Change method name 2009-11-01 11:21:34 -08:00
Tom Robinson ef252a97c4 Merge branch 'master' of github.com:280north/cappuccino 2009-10-31 18:47:54 -07:00
Francisco Ryan Tolmasky I 14ad8f6d6d Cleaned up key equivalent handling and added support for key equivalents
to nib2cib.

Reviewed by me.
2009-10-31 18:32:58 -07:00
Ross BoucherandFrancisco Ryan Tolmasky I bcd8c72ae4 Add an unsaved state affordance to the close button on standard windows. 2009-10-31 18:22:27 -07:00
Francisco Ryan Tolmasky I 499d2d93d5 Added import just in case.
Reviewed by me.
2009-10-31 18:22:27 -07:00
Francisco Ryan Tolmasky I 84f131808d Removed some remaining cell "influences" in nib2cib'ed cib. There are references to NSCells in the object graph which should be removed, their children promoted to their parent's children.
Reviewed by me.
2009-10-31 18:22:27 -07:00
Ross Boucher 79fa65624d Merge branch 'master' of git@github.com:280north/cappuccino 2009-10-31 09:52:52 -07:00
Ross Boucher 9ca96bc909 Add desktop support for recent file list 2009-10-31 09:52:26 -07:00
Francisco Ryan Tolmasky I 3dbddcf186 Added makeObjectsPerformSelector:withObjects:.
Reviewed by me.
2009-10-30 18:02:33 -07:00
Ross Boucher df8c648d70 Add an unsaved state affordance to the close button on standard windows. 2009-10-30 10:53:47 -07:00
Ross Boucher ee7c71a184 Merge branch 'master' of git@github.com:280north/cappuccino 2009-10-29 22:22:51 -07:00
Ross Boucher de163e22d9 Add disabled states for all the existing controls. 2009-10-29 22:22:27 -07:00
Francisco Ryan Tolmasky I d9ef4342b6 Merge branch 'master' into jake 2009-10-29 21:35:15 -07:00
Francisco Ryan Tolmasky I e75ef74ea5 Merge branch 'master' of git@github.com:280north/cappuccino 2009-10-29 21:32:13 -07:00
Ross Boucher 2e26db5bf5 Add mixed states to checkboxes. 2009-10-29 21:17:12 -07:00
Francisco Ryan Tolmasky I fe1c45980d Merge branch 'master' of git@github.com:280north/cappuccino 2009-10-29 20:46:24 -07:00
Ross Boucher 0423546451 Update to the new close/warn stuff to correctly support multiple windows per document and multiple documents per window. 2009-10-29 16:33:56 -07:00
Francisco Ryan Tolmasky I 8da4ea0823 Added import just in case.
Reviewed by me.
2009-10-29 16:25:05 -07:00
Francisco Ryan Tolmasky I c48d9a01c6 Removed some remaining cell "influences" in nib2cib'ed cib. There are references to NSCells in the object graph which should be removed, their children promoted to their parent's children.
Reviewed by me.
2009-10-29 00:53:13 -07:00
Ross Boucher 4ca0044bbd Add isEqual: to CPDate 2009-10-28 23:38:58 -07:00
Ross Boucher 9f2ea190fc Make text field KVO compliant again. 2009-10-28 20:20:33 -07:00
Ross Boucher 4248348308 Updates to the way notifications work. New notifications for focus/blur. 2009-10-28 20:01:00 -07:00
Ross Boucher eaf701beca Support key paths instead of simple keys in sort descriptors. Match Cocoa's behavior here. 2009-10-28 16:24:41 -07:00
Francisco Ryan Tolmasky I a48a305cd8 Merge branch 'jake' of git@github.com:280north/cappuccino into jake 2009-10-28 00:59:27 -07:00
Francisco Ryan Tolmasky I cc334296bb Merge branch 'master' into jake
Conflicts:
	Objective-J/CommonJS/objective-j/lib-js/objective-j/compiler.js
2009-10-28 00:59:14 -07:00
Francisco Ryan Tolmasky I bb2726fb9a downloads, documentation, and deploy tasks.
Reviewed by me.
2009-10-28 00:55:51 -07:00
Ross Boucher 95b9ea336b Merge branch 'master' of git@github.com:280north/cappuccino 2009-10-28 00:12:29 -07:00
Ross Boucher ba84e6d3e2 Support for sendsActionOnEndEditing in CPControl. Only works for textfields right now. 2009-10-28 00:12:03 -07:00
Ross Boucher 22c248454e Fix for the fact that bundles are not encodable in the last commits. 2009-10-28 00:11:42 -07:00
Tom Robinson 42611f3a84 Missing GET_FILE import. 2009-10-28 00:07:23 -07:00
Tom Robinson d7b778e8ac Improved capp gen frameworks installing 2009-10-27 23:39:41 -07:00
Francisco Ryan Tolmasky I 1be9d6816e Cleanup, and added deploy task.
Reviewed by me.
2009-10-27 22:23:37 -07:00
Justin MechamandRoss Boucher d263c74d5d Added support for archiving NSTitle and NSNibBundleIdentifier from the View Controller palette for NSViewControllers. 2009-10-27 20:49:35 -07:00
Justin MechamandRoss Boucher 25634a66cb Added support to nib2cib for specifying the "Nib Name" property of the View Controller palette to enable view controller initialization from cibs. 2009-10-27 20:49:18 -07:00
Justin MechamandRoss Boucher 228e801c91 Fixed the class name for archiving CPViewControllers (was CPCollectionView). 2009-10-27 20:49:03 -07:00
Francisco Ryan Tolmasky I abc715facb Added --force to tusk install.
Reviewed by me.
2009-10-27 19:02:33 -07:00
Ross Boucher a0a81be042 Add support for reviewing unsaved documents before application termination. 2009-10-27 18:44:09 -07:00
Francisco Ryan Tolmasky I 64948053df Merge branch 'master' into jake
Conflicts:
	Tools/capp/Generate.j
2009-10-27 18:41:19 -07:00
Ross Boucher 039de1b6e8 Merge branch 'master' of git@github.com:280north/cappuccino 2009-10-27 17:40:01 -07:00
Tom Robinson b050559532 Improved capp gen. Don't blow away entire Frameworks directory with --force, just Objj/Foundation/AppKit. 2009-10-27 17:38:31 -07:00
Ross Boucher 064a062cd8 Merge branch 'master' of git@github.com:280north/cappuccino 2009-10-27 17:37:38 -07:00
Ross Boucher b2d994bd66 Adds support for warning before closing documents that have unsaved changes.
Includes changes to the multiple documents per window controller stuff.
2009-10-27 17:36:46 -07:00
Francisco Ryan Tolmasky I 315e0eac0c Removed remaining references to full bridge in window template.
Reviewed by me.
2009-10-27 14:55:06 -07:00
Ross Boucher 06eac3e79b Merge branch 'master' of git@github.com:280north/cappuccino 2009-10-26 23:20:29 -07:00
Ross Boucher 9e825ea62e Add close to CPDocument 2009-10-26 23:20:05 -07:00
Francisco Ryan Tolmasky I d8249b6035 Merge branch 'master' of git@github.com:280north/cappuccino 2009-10-26 22:44:52 -07:00
Francisco Ryan Tolmasky I 7b14f41cd8 Added CGRectNull support to CGRectUnion.
Reviewed by me.
2009-10-26 22:43:51 -07:00
Ross Boucher 4bb4d6cd62 Merge branch 'master' of git@github.com:280north/cappuccino 2009-10-26 22:19:23 -07:00
Ross Boucher 82404265fb Warn when closing an unsaved document. 2009-10-26 22:18:58 -07:00
Francisco Ryan Tolmasky I 9ee71e762c Added install call, stil won't work until parallel changes take place in tusk.
Reviewed by me.
2009-10-26 18:09:05 -07:00
Francisco Ryan Tolmasky I d52aa1575e Merge branch 'master' into jake 2009-10-26 18:08:46 -07:00
Tom Robinson 717c8520b4 Use MAX instead of Math.max 2009-10-26 16:53:13 -07:00
Tom Robinson 76edc4f914 Use Array(n).join(ch) trick for strings of identical chars 2009-10-26 16:47:09 -07:00
Francisco Ryan Tolmasky I 66b447de7b Stopped CPWindowController from setting self as next responder of CPDocument. Fixes issue with multi-document windows not sending saveDocument to focused document.
Reviewed by me.
2009-10-26 16:00:47 -07:00
Francisco Ryan Tolmasky I afaa816d5c More clean/clobber fixes.
Reviewed by me.
2009-10-26 03:28:36 -07:00
Francisco Ryan Tolmasky I 13e88c6295 Merge branch 'master' into jake 2009-10-26 02:12:07 -07:00
Francisco Ryan Tolmasky I b6cf4ad0a4 1. Added clean and clobber functionality to bundletask.
2. Prepared Foundation and Appkit for clean and clobber
3. Placed built-necessary requires in bundletask in the calling functions so that it can be included without being built for clean and clobber.
4. Made common.jake include unbuilt CommonJS files if built ones aren't present.

Reviewed by me.
2009-10-26 02:10:25 -07:00
Francisco Ryan Tolmasky I b457119925 Added shadow drawing styles.
Reviewed by me.
2009-10-25 23:11:00 -07:00
Randall LueckeandRoss Boucher b5cdcec004 fixed CPSearchField search and cancel buttons so they stay positioned correctly when resized. 2009-10-25 19:17:01 -07:00
Randall LueckeandRoss Boucher 86d5ea6c64 made sheet 10 percent transparent to match Cocoa sheets. 2009-10-25 19:10:15 -07:00
Randall LueckeandRoss Boucher 424611e7c7 fixed frameRectForContentRect:styleMask: so the styleMask argument is actually used and the method no longer outputs an error when called 2009-10-25 19:09:15 -07:00
Ross Boucher de920e959a Fix for updating table column header views after they are initially loaded. 2009-10-25 18:49:49 -07:00
Ross Boucher 9ab75eb662 Fixes a type which was causing columnWithIdentifier: in CPTableView to be broken. 2009-10-25 17:41:45 -07:00
Francisco Ryan Tolmasky I 4870ac86ef Merge branch 'master' into jake 2009-10-25 15:34:50 -07:00
Francisco Ryan Tolmasky I 24c6f0ec9f Fix for broken menu sizing.
Closes #308.

Reviewed by me.
2009-10-25 15:32:42 -07:00
Francisco Ryan Tolmasky I 250ceb69f4 Merge branch 'master' into jake 2009-10-25 11:03:20 -07:00
Francisco Ryan Tolmasky I 0561f69c86 Made cancelTracking send a close menu event so that it doesn't behave passively.
Reviewed by me.
2009-10-22 19:58:34 -07:00
Ross Boucher 341eddb9f9 Fixes a tab view bug with removing tabs.
Closes #274.

Kudos go to jtietema for tracking down the bug.
2009-10-22 10:20:14 -07:00
saikatandRoss Boucher ee8fef4e85 Fixes to autosizing behavior for CPMenu - closes issue #270 2009-10-22 10:08:56 -07:00
saikatandRoss Boucher e6d1753e74 Fixed issue with selectText in CPTextField. Closes issue #295 2009-10-22 10:07:06 -07:00
Seth BuntinandRoss Boucher 891d2a28c1 implement CPException tests 2009-10-22 10:05:58 -07:00
Francisco Ryan Tolmasky I 0af70c04a0 Fixed a bug where windows would not become visible again after closing their platform windows.
Reviewed by me.
2009-10-21 21:01:49 -07:00
Francisco Ryan Tolmasky I efaff96168 Consolidate with browser branch.
Reviewed by me.
2009-10-19 16:52:19 -07:00
Francisco Ryan Tolmasky I 6fc02623df Merge branch 'desktop' into jake
Conflicts:
	Objective-J/CommonJS/objective-j/lib-js/objective-j.js
2009-10-18 17:40:13 -07:00
Francisco Ryan Tolmasky I a27f104a63 Merge branch 'master' into desktop 2009-10-18 17:37:55 -07:00
Francisco Ryan Tolmasky I 9838bbf084 Merge branch 'master' of git@github.com:280north/cappuccino 2009-10-18 17:36:31 -07:00
Francisco Ryan Tolmasky I 6076185da7 Added application activation.
Reviewed by me.
2009-10-18 17:35:53 -07:00
Francisco Ryan Tolmasky I 810f82cc60 Merge branch 'desktop' into jake
Conflicts:
	AppKit/CPSavePanel.j
2009-10-17 10:07:10 -07:00
Francisco Ryan Tolmasky I fce91c7ad3 Cleanuped up open/save panel.
Reviewed by me.
2009-10-17 10:00:50 -07:00
Francisco Ryan Tolmasky I e6ea4c267a Adjustments to save panel.
Reviewed by me.
2009-10-16 17:08:25 -07:00
Francisco Ryan Tolmasky I 95274f618c Merge branch 'desktop' into jake 2009-10-16 16:51:31 -07:00
Ross Boucher 385bec7400 Corrects a style issue. 2009-10-16 15:22:12 -07:00
Andreas FalkandRoss Boucher 41cb21cd0f Made CPCollectionView encode and decode the isSelectable property to the cib 2009-10-16 14:38:48 -07:00
Andreas FalkandRoss Boucher c7520593da Added getter for isSelectable and removed the getter for isSelected 2009-10-16 14:38:23 -07:00
Ross Boucher 666ac4acd1 Added test for 09858caaedfdc9211b7ee7355e104890b67d0d5e
Conflicts:

	Tests/AppKit/CPCollectionViewTest.j
2009-10-16 14:37:58 -07:00
Andreas FalkandRoss Boucher ea15b247d3 Made the item prototype test in the CPCollectionView test check for identity instead of equality 2009-10-16 14:34:49 -07:00
Ross Boucher ea252323d2 Cleaned up the test to better fit the xUnit standard
Conflicts:

	Tests/AppKit/CPCollectionViewTest.j
2009-10-16 14:34:35 -07:00
tlrobinson 42775cb152 Limit tests to those that end with *Test.j 2009-10-16 13:29:40 -07:00
tlrobinson f925585475 Fixed objj command line importing. 2009-10-16 13:29:22 -07:00
Francisco Ryan Tolmasky I aba7ea8bf1 Fixed Debug mode.
Reviewd by me.
2009-10-16 11:50:28 -07:00
Francisco Ryan Tolmasky I 29b0aa7cde Beginning to remove old files.
Reviewed by me.
2009-10-16 11:17:48 -07:00
Francisco Ryan Tolmasky I 375b490678 Removed dependencies on common.jake.
Reviewed by me.
2009-10-16 11:15:02 -07:00
Francisco Ryan Tolmasky I 27c2285600 Jakefile cleanup, beginnings of "install" task.
Reviewed by me.
2009-10-16 09:37:12 -07:00
Francisco Ryan Tolmasky I 1d1f664e07 Made starter_download and docs tasks jake compliant.
Reviewed by me.
2009-10-16 07:58:40 -07:00
Ross Boucher f2e95f7e63 Fix a broken import which caused all tests to fail. 2009-10-15 23:27:15 -07:00
Seth BuntinandRoss Boucher 3055522645 implement CPDictionary Tests 2009-10-15 20:53:21 -07:00
Francisco Ryan Tolmasky I 7347428e94 Merge branch 'master' into jake 2009-10-15 19:48:57 -07:00
Francisco Ryan Tolmasky I 4a8a205ae2 Merge branch 'master' into desktop 2009-10-15 19:48:43 -07:00
Francisco Ryan Tolmasky I 090bf3c46d More nib2cib CommonJS fixes.
Reviewed by me.
2009-10-15 19:47:06 -07:00
Tom Robinson 1691b6f07e Update externals (browserjs suppress warnings, narwhal file module fixes). 2009-10-15 19:35:52 -07:00
Francisco Ryan Tolmasky I 22578c3650 Merge branch 'master' into desktop 2009-10-15 19:05:55 -07:00
Francisco Ryan Tolmasky I 57c7757c2e Merge branch 'master' into jake 2009-10-15 19:05:43 -07:00
Francisco Ryan Tolmasky I 16deb3700d Fixed incompatibilities in nib2cib with CommonJS and JavaScriptCore.
Reviewed by me.
2009-10-15 19:03:59 -07:00
Ross Boucher f5d05a7c93 Change file encodings. 2009-10-15 16:59:19 -07:00
Francisco Ryan Tolmasky I 40b5332c83 Merge branch 'master' into jake 2009-10-15 13:29:21 -07:00
Francisco Ryan Tolmasky I 238da6b80f Narwhal fixes for capp gen.
Reviewed by me.
2009-10-15 13:27:27 -07:00
Ross Boucher 1c4f11c1d2 A few style fixes for the new CPDataTest 2009-10-15 11:00:30 -07:00
Seth BuntinandRoss Boucher e57e7cbbc5 remove unused import 2009-10-15 10:54:06 -07:00
Seth BuntinandRoss Boucher 97cfb5c1f9 clean up to follow style guidelines 2009-10-15 10:53:58 -07:00
Seth BuntinandRoss Boucher 9d7ba990a8 add dataWithPlistObject test CPDataTest 2009-10-15 10:53:52 -07:00
Seth BuntinandRoss Boucher cac6204a96 add tests for CPData.j 2009-10-15 10:53:42 -07:00
Francisco Ryan Tolmasky I b7f41c104c Merge branch 'master' into desktop 2009-10-14 14:05:50 -07:00
Francisco Ryan Tolmasky I 1123e848bf Removed debug logs.
Reviewed by me.
2009-10-14 09:16:30 -07:00
Francisco Ryan Tolmasky I e3fe4ff92f Only sprite images smaller than 32KB.
Reviewed by me.
2009-10-14 09:13:58 -07:00
Francisco Ryan Tolmasky I d6b338b160 Fix for dynamically loading objective-j loader mid-build.
Reviewed by me.
2009-10-13 16:42:05 -07:00
Francisco Ryan Tolmasky I ddada18069 Removed logs.
Reviewed by me.
2009-10-13 16:03:36 -07:00
Francisco Ryan Tolmasky I b43b097d40 Fix for building from scratch.
Reviewed by me.
2009-10-13 15:42:44 -07:00
Francisco Ryan Tolmasky I 2cc723752e Merge branch 'master' into jake
Conflicts:
	Objective-J/Runtime/constants.js
2009-10-13 13:45:41 -07:00
Francisco Ryan Tolmasky I 6b02a4105b Furhter cleanup.
Reviewed by me.
2009-10-13 13:41:45 -07:00
Francisco Ryan Tolmasky I 3098bfe6db Furhter cleanup.
Reviewed by me.
2009-10-13 13:40:28 -07:00
Tom Robinson 5e658354ab Fixes for objj on narwhal-jsc plus Externals update. 2009-10-13 13:31:46 -07:00
Francisco Ryan Tolmasky I 2f5e4d8335 Minor cleanup, much more needed.
Reviewed by me.
2009-10-13 12:34:33 -07:00
Francisco Ryan Tolmasky I a607d79c7d Further spriting work.
Reviewed by me.
2009-10-13 10:19:50 -07:00
Francisco Ryan Tolmasky I 81c71beaa7 Fix for decode errors.
Reviewed by me.
2009-10-11 11:15:09 -07:00
Francisco Ryan Tolmasky I 5bd30fc4e5 Merge branch 'master' into jake 2009-10-10 12:57:56 -04:00
Francisco Ryan Tolmasky I 46d452be5e Merge branch 'master' into desktop 2009-10-10 12:20:22 -04:00
Ross BoucherandFrancisco Ryan Tolmasky I 2338ca2fa2 Add support for minimization. 2009-10-10 12:20:02 -04:00
Ross Boucher 2900163644 Fixes bug in CPAnimation where certain ivars were not initialized correctly.
Closes #287.
2009-10-09 14:30:56 -07:00
Francisco Ryan Tolmasky I e90f0188c3 Merge branch 'master' into desktop 2009-10-09 11:16:51 -04:00
Francisco Ryan Tolmasky I 5fa457621b Merge branch 'master' into jake
Conflicts:
	Objective-J/Runtime/evaluate.js
2009-10-09 07:44:37 -04:00
Jake MacMullinandRoss Boucher e125139777 Fixed a bug where the CPAlert was being displayed with black text on a black background if the styleMask was set to 'CPHUDBackgroundWindowMask' and something else. #220 2009-10-09 00:06:44 -07:00
Nicholas SmallandRoss Boucher bc6f168afa Added some designated initializers to AppKit. 2009-10-09 00:03:52 -07:00
Ross Boucher fc85ae16a5 Fix for the keypress bug introduced in Safari 4.
Closes #280.
2009-10-08 23:10:58 -07:00
Ross Boucher d5f2654eae Merge branch 'master' of git@github.com:280north/cappuccino 2009-10-08 21:50:45 -07:00
Ross Boucher 5e951c1e53 Fix for a break in key view loops from the previous text field change. 2009-10-08 21:50:03 -07:00
Tom Robinson 69cdc2ccd0 Check for "system", fixes press. 2009-10-08 21:41:35 -07:00
Tom Robinson 3474e8baf1 Merge branch 'master' of git@github.com:280north/cappuccino 2009-10-08 19:59:46 -07:00
Ross Boucher 6e7e3ef35e Updates to TextField.
Closes #219.
Closes #283.
Closes #232.
2009-10-08 19:28:45 -07:00
Ross Boucher 8a2cd8c5c6 Fix type in CPAnimation 2009-10-08 13:38:36 -07:00
Ross Boucher 306c1a962a Move tests. 2009-10-08 13:29:24 -07:00
Ross Boucher 8441e62f49 Merge branch 'sheets'
Conflicts:
	AppKit/CPControl.j
	AppKit/CPWindow/CPWindow.j
2009-10-08 13:25:20 -07:00
Ross Boucher 9b948dcac7 CPAnimation: cubic bezier curves - the real, working equation
Conflicts:

	AppKit/CPAnimation.j
2009-10-08 13:20:10 -07:00
Ross Boucher 1fb9c973fe More sheets. 2009-10-08 13:12:30 -07:00
cacaodevandRoss Boucher 048bcc1be7 Improved autoresizing mechanism for attached sheets 2009-10-08 12:58:45 -07:00
cacaodevandRoss Boucher 1d8cebd5be CPWindow : Added missing declarations for _isSheet and _parentView
sheet's subviews autoresizingMask is now correctly restored when the sheet is open or ended.
           Added CPWindow(WillBegin/DidEnd)SheetNotification globals

	   To do : support for maxSize and minSize
2009-10-08 12:58:37 -07:00
cacaodevandRoss Boucher 0e55a5d7c4 Added sample app. Corrected style (tabs) 2009-10-08 12:58:29 -07:00
cacaodevandRoss Boucher c6b934a035 Attached sheet implementation 2009-10-08 12:58:22 -07:00
cacaodevandRoss Boucher 5b531b2005 Improved autoresizing mechanism for attached sheets 2009-10-08 12:13:55 -07:00
cacaodevandRoss Boucher 570a2a56ff Added sample app. Corrected style (tabs) 2009-10-08 12:02:35 -07:00
cacaodevandRoss Boucher d79ed12b5c Attached sheet implementation 2009-10-08 12:02:26 -07:00
Francisco Ryan Tolmasky I 7864a9fa8e Updates to fix building.
Reviewed by me.
2009-10-08 14:59:10 -04:00
Francisco Ryan Tolmasky I 3aa7378699 Merge branch 'master' into desktop 2009-09-30 07:04:58 +01:00
Ross BoucherandFrancisco Ryan Tolmasky I 1d76ac1b91 Addes initial support for window shadow styles.
Reviewed by tolmasky.
2009-09-30 07:03:55 +01:00
Francisco Ryan Tolmasky I 99697926d9 Resource fixes, added index.html support.
Reviewed by me.
2009-09-29 15:44:46 -07:00
Francisco Ryan Tolmasky I 32d0c6ca17 Fix for non imported function in compiler.js.
Reviewed by me.
2009-09-28 05:12:20 -07:00
Francisco Ryan Tolmasky I 2dac122c30 Fix for loading platform dependent code.
Reviewed by me.
2009-09-28 04:27:03 -07:00
Francisco Ryan Tolmasky I e9092007ee Added support for new FileList.
Reviewed by me.
2009-09-27 21:13:50 -07:00
Francisco Ryan Tolmasky I b94c82f4aa Fix for double file inclusion.
Reviewed by me.
2009-09-27 15:31:24 -07:00
Francisco Ryan Tolmasky I 6a32314c0b Merge branch 'master' into desktop 2009-09-26 20:47:06 -07:00
Francisco Ryan Tolmasky I eff3170df1 Updated for jsc support.
Reviewed by me.
2009-09-26 20:05:41 -07:00
Tom Robinson 62d825d970 Merge branch 'master' of git@github.com:280north/cappuccino 2009-09-26 18:49:57 -07:00
Tom Robinson cb416e0277 Use system.engine to detect Rhino. 2009-09-26 18:49:35 -07:00
Francisco Ryan Tolmasky IandTom Robinson 5066a1d395 Fix for gcc args.
Reviewed by me.
2009-09-26 18:49:35 -07:00
Francisco Ryan Tolmasky IandTom Robinson df3658bc96 Update to support new narwhal.
Reviewed by me.
2009-09-26 18:49:35 -07:00
Francisco Ryan Tolmasky I 3ac8ac40bc Jakefile for press.
Reviewed by me.
2009-09-26 02:03:51 -07:00
Francisco Ryan Tolmasky I e5c5378ec0 A bit of work on top level tasks.
Reviewed by me.
2009-09-26 02:03:03 -07:00
Francisco Ryan Tolmasky I ef41abec97 Added loader.js
Reviewed by me.
2009-09-26 01:31:52 -07:00
Francisco Ryan Tolmasky I 72d4675ec4 More spriting stuff.
Reviewed by me.
2009-09-26 00:27:38 -07:00
Francisco Ryan Tolmasky I 1cd8acb92c blend working with jake build system.
Reviewed by me.
2009-09-25 23:37:38 -07:00
Francisco Ryan Tolmasky I 9856e6bfd7 nib2cib and capp building with jake.
Reviewed by me.
2009-09-25 21:52:41 -07:00
Francisco Ryan Tolmasky I be2ffe95c5 Added missing bin.
Reviewed by me.
2009-09-25 17:45:10 -07:00
Francisco Ryan Tolmasky I 3f2d6f24d2 Removed no longer used files.
Reviewed by me.
2009-09-25 03:33:40 -07:00
Francisco Ryan Tolmasky I 714cd402df Moved nib2cib and capp to jake.
Reviewed by me.
2009-09-25 03:28:38 -07:00
Francisco Ryan Tolmasky I ffd99e3ed7 Further jake work.
Reviewed by me.
2009-09-24 01:11:46 -07:00
Francisco Ryan Tolmasky I 64a8e4c5c0 More transition to jake.
Reviewed by me.
2009-09-23 18:46:11 -07:00
Francisco Ryan Tolmasky I bb0a1eadda Added more common routines to common.jake.
Reviewed by me.
2009-09-23 16:28:58 -07:00
Francisco Ryan Tolmasky I a8ab16002e More jakefiles and fixing incorrect commonjs package structure.
Reviewed by me.
2009-09-23 16:27:52 -07:00
Francisco Ryan Tolmasky I 9dc0c3ab6d First set of jake files.
Reviewed by me.
2009-09-23 03:49:08 -07:00
Francisco Ryan Tolmasky I 82df59e7dc Merge branch 'master' into desktop 2009-09-23 03:45:29 -07:00
Francisco Ryan Tolmasky I 47694c2d80 Fix for gcc args.
Reviewed by me.
2009-09-23 03:25:41 -07:00
Francisco Ryan Tolmasky I 4993d16738 Merge branch 'master' into desktop 2009-09-23 00:21:46 -07:00
Francisco Ryan Tolmasky I 43c0db44ea Update to support new narwhal.
Reviewed by me.
2009-09-23 00:20:30 -07:00
Francisco Ryan Tolmasky I ebbf3c4576 More desktop differences.
Reviewed by me.
2009-09-22 19:32:53 -07:00
Francisco Ryan Tolmasky I f109313d32 Reapply desktop differences.
Reviewed by me.
2009-09-22 19:32:23 -07:00
Tom Robinson e305d30c1b Update externals 2009-09-22 18:34:33 -07:00
Ross Boucher 317f1d356c Add copyright info to CPBox 2009-09-22 17:23:54 -07:00
Ross Boucher 25f3d99732 Add support for CPBox. 2009-09-22 17:23:02 -07:00
Tom Robinson b0443fe5e3 Fixed "animationShouldStart" selector missing a trailing colon. 2009-09-22 00:28:16 -07:00
Ross Boucher 3f5bb77230 Fix typo. 2009-09-21 18:51:21 -07:00
Francisco Ryan Tolmasky I 1cf292279c Improved scrolling for tablview and outlineview -- no longer sets non-integral scroll positions.
Reviewed by me.
2009-09-20 15:40:05 -07:00
Ross Boucher 2e350f6bc5 Fix an accidental global in platformwindow 2009-09-20 10:36:30 -07:00
Francisco Ryan Tolmasky I cfd91b7a61 Updated scrollers look.
Reviewed by me.
2009-09-20 02:47:52 -07:00
Tom Robinson 1a8062fbbc Added support for the "//@ sourceName" convention tell debuggers our file names.
http://pmuellr.blogspot.com/2009/06/debugger-friendly.html
2009-09-18 03:27:58 -07:00
Tom Robinson 32096ade9f Oops, OBJJ_HOME got left out of the Rhino scope thingy. Sorry, OBJJ_HOME. 2009-09-18 02:51:11 -07:00
Tom Robinson b7493586e2 Improve stack traces in objj on Rhino. 2009-09-18 02:21:31 -07:00
Francisco Ryan Tolmasky I a02cda6376 Fix for autoresizing breaking with bounds changes.
Reviewed by me.
2009-09-17 01:12:30 -07:00
Francisco Ryan Tolmasky I 2348a8ebd3 Brought cib support up to date with TableView changes.
Reviewed by me.
2009-09-17 00:38:19 -07:00
Michael PorterandFrancisco Ryan Tolmasky I 7728d8abfb Fix window maximise issue in Firefox 2009-09-16 15:23:42 -07:00
Francisco Ryan Tolmasky I b21b08f899 Improved drag and drop.
Reviewd by me.
2009-09-16 00:27:56 -07:00
Francisco Ryan Tolmasky I c752db905d Fix for updating sliders visually when min/max values change.
Reviewed by me.
2009-09-15 21:39:20 -07:00
Francisco Ryan Tolmasky I 7ca50e4d28 Fix for accessing view controllers for a document.
Reviewed by me.
2009-09-15 17:14:14 -07:00
Francisco Ryan Tolmasky I 1862eacc27 Change frame setting behavior to match immediacy of Cocoa/GNUStep.
Reviewed by me.
2009-09-15 14:51:07 -07:00
Francisco Ryan Tolmasky I 0497888edf Made CPCollectionViewItem a subclass of CPViewController and improved nib2cib support for CPCollectionView, CPCollectionViewItem, and CPViewController.
Reviewed by me.
2009-09-15 05:00:56 -07:00
Francisco Ryan Tolmasky I 25d76c9510 Further CPCollectionView nib2cib work.
Reviewed by me.
2009-09-15 03:20:47 -07:00
Francisco Ryan Tolmasky I 46dbce0dbb Fix for not being able to set headers on table view.
Closes #264.

Reviewed by me.
2009-09-15 02:30:18 -07:00
Francisco Ryan Tolmasky I 98ef1bfd05 Fix for Collection views having a gray background when nib2cibed.
Reviewed by me.
2009-09-15 02:22:05 -07:00
Francisco Ryan Tolmasky I 7205146e1b Fixed how children are loaded and reloaded in CPOutlineView and fixed a bug where CPWindowController would call windowControllerWillLoadCib: and windowControllerDidLoadCib: twice.
Reviewed by me.
2009-09-14 23:14:05 -07:00
Francisco Ryan Tolmasky I 02907a599d Minor outline view fix.
Reviewed by me.
2009-09-14 14:40:40 -07:00
Francisco Ryan Tolmasky I d6ac69029b Added sorting capabilities to CPTreeNode.
Reviewed by me.
2009-09-14 03:47:57 -07:00
Francisco Ryan Tolmasky I c8ed0f5436 Changed usages of string paths to CPURL objects.
Reviewed by me.
2009-09-14 01:01:05 -07:00
Francisco Ryan Tolmasky I 20d14d2f81 Added beginnings of tabbed documents support.
Reviewed by me.
2009-09-14 00:51:43 -07:00
Francisco Ryan Tolmasky I 668540d0ce Added CPViewController for managing views and CPWebDAVManager for interacting with web dav servers.
Reviewed by me.
2009-09-13 20:02:07 -07:00
Francisco Ryan Tolmasky I ee46ab23ba Improved arrow control in outline view, still could use considerable work.
Reviewed by me.
2009-09-13 01:10:11 -07:00
Francisco Ryan Tolmasky I dba418a93d Fix for:
- misindented items in outline view
- switched window controller to use synchronous cibs.
- typo in cibloading.

Reviewed by me.
2009-09-12 23:37:44 -07:00
Francisco Ryan Tolmasky I 186adee0f2 Merge branch 'master' of git@github.com:280north/cappuccino 2009-09-12 18:15:30 -07:00
Francisco Ryan Tolmasky I abd3abdfea Fixed only showing disclosure control for items that are expandable, and simplified the row to item mapping.
Reviewed by me.
2009-09-12 18:10:43 -07:00
Ross Boucher 7aa58fa98a Include default methods for nextState and setState 2009-09-12 20:48:44 -04:00
Francisco Ryan Tolmasky I a32368f89a Simply added constants to top of CPURL.j.
Reviewed by me.
2009-09-12 12:09:51 -07:00
Tom Robinson 4f1d9fe836 CPURL -description 2009-09-11 19:46:09 -07:00
Tom Robinson 98df1859af Inital CPURL 2009-09-11 19:46:09 -07:00
Francisco Ryan Tolmasky I 1bdea9ff45 Added selection delegate methods support to tableview and outlineview.
Reviewed by me.
2009-09-11 18:28:57 -07:00
Francisco Ryan Tolmasky I 17273ecbfa Added disclosure views to outline view.
Reviewed by me.
2009-09-11 10:24:16 -07:00
Francisco Ryan Tolmasky I fd62233960 Cleaned up outline view indentation code, and added parentForItem:.
Reviewed by me.
2009-09-10 17:02:47 -07:00
Francisco Ryan Tolmasky I 5b0876b7ed Merge branch 'master' of git@github.com:280north/cappuccino 2009-09-10 14:13:31 -07:00
Francisco Ryan Tolmasky I 96afa4b950 Added deferred loading for outline views (for remote data), and added CPTreeNode class.
Reviewed by me.
2009-09-10 14:12:34 -07:00
Ross Boucher 5e74290486 Fix typo in CPTextField. Closes 247. 2009-09-10 12:18:12 -04:00
Ross Boucher d00197b1f7 This forces a recalculation at the point where autorecalculation is turned off (only if it was dirty).
From what I can tell, this brings it into line with how Cocoa handles the situation.

Closes issue #250.
2009-09-10 12:05:55 -04:00
Ross Boucher 8b9f36043d Add a bit more context to the errors that we can. 2009-09-10 11:38:07 -04:00
Francisco Ryan Tolmasky I 041f8200df First pass at CPOutlineView.
Reviewed by me.
2009-09-09 17:48:59 -07:00
Francisco Ryan Tolmasky I b77eef0cd3 Fix for typo in method name.
Reviewed by me.
2009-09-08 02:44:55 -07:00
Tom Robinson 774e958d49 Properly "export" external git repos so we don't get .git directory. Update externals. 2009-09-07 18:53:59 -07:00
Tom Robinson f7c00df9a9 Sync bundle with TextMate repo 2009-09-07 18:53:59 -07:00
Francisco Ryan Tolmasky I 98e18340b7 Fix for tableview breaking when header view is removed.
Reviewed by me.
2009-09-07 18:22:34 -07:00
Francisco Ryan Tolmasky I 58e06142b9 Added support for external objects in cibs.
Reviewed by me.
2009-09-06 11:49:25 -07:00
Tom Robinson c895170597 Fix capp gen -f with no path. 2009-09-05 00:37:52 -07:00
Francisco Ryan Tolmasky I a619bc15c2 Fix for collection views unarchived from cibs crashing.
Reviewed by me.
2009-09-05 00:28:42 -07:00
Francisco Ryan Tolmasky I 369cacb3aa A bit of cleanup.
Reviewed by me.
2009-09-04 18:07:24 -07:00
Francisco Ryan Tolmasky I 78fe93be68 Imrpoved identifying main menus in cibs.
Reviewed by me.
2009-09-04 12:37:38 -07:00
Francisco Ryan Tolmasky I 1a7a07b51a Fix for draggedView:endedAt:operation: giving 0,0 locations.
Reviewed by me.
2009-09-04 03:54:40 -07:00
Francisco Ryan Tolmasky I 2996404ad4 Merge branch 'master' of git@github.com:280north/cappuccino 2009-09-03 02:32:03 -07:00
Francisco Ryan Tolmasky I 669dff7a9b nib2cib fix for new scrollers.
Reviewed by me.
2009-09-03 02:31:25 -07:00
Tom Robinson 3a7dee6cc2 Added template config file to "capp", and ability to specify an absolute path for a template. 2009-09-03 01:11:19 -07:00
Tom Robinson 7017000c81 Added dictionary methods to objj_dictionary.prototype 2009-09-03 01:11:19 -07:00
Tom Robinson 379eb05144 Various improvements to objj and objjc modules, added plist module. 2009-09-03 01:11:18 -07:00
Francisco Ryan Tolmasky I 8fc45cf345 Workaround for terminate: warning when using cibs.
Reviewed by me.
2009-09-02 23:37:51 -07:00
Francisco Ryan Tolmasky I dc85900780 Final resources for new scrollers.
Reviewed by me.
2009-09-02 03:56:58 -07:00
Francisco Ryan Tolmasky I 0a28127667 Merge branch 'new_Scroller' into master_scroller 2009-09-02 02:40:57 -07:00
Francisco Ryan Tolmasky I 879561f67b Replaced incorrect method names.
Reviewed by me.
2009-09-02 02:39:10 -07:00
Francisco Ryan Tolmasky I 7f9bc98929 Fix for CPSet count increasing even if the same object is added repeatedly.
Reviewed by me.
2009-09-01 17:20:00 -07:00
Francisco Ryan Tolmasky I 4c01bebd07 Minor fixes to segmented control.
Reviewed by me.
2009-09-01 12:54:32 -07:00
Francisco Ryan Tolmasky I 2fbe026215 Further drawing fixes.
Reviewed by me.
2009-08-31 14:39:00 -07:00
Francisco Ryan Tolmasky I efcc5d1054 Fixed a bug that could cause CPAccordionView to infinitely re-layout (due to autoresizing flags in child views), and added option to synchronously load cibs.
Reviewed by me.
2009-08-31 01:22:08 -07:00
Francisco Ryan Tolmasky I 2cf5b90183 Fixes for uncommon drawRect: bugs.
Reviewed by me.
2009-08-30 20:59:01 -07:00
Francisco Ryan Tolmasky I 75060a3385 Fix for accordion view occasionally incorrectly laying out.
Reviewed by me.
2009-08-29 00:20:39 -07:00
Francisco Ryan Tolmasky I b55ddcf4ce Merge branch 'master' of git@github.com:280north/cappuccino 2009-08-27 12:27:37 -07:00
Francisco Ryan Tolmasky I 744e78b7ad Added Accordion View. Also fixed a bug with changing table column withs in CPTableView not updating affected cells.
Reviewed by me.
2009-08-27 12:26:38 -07:00
Tom Robinson f360ab9475 Update objj and browserjs package.json, add Rake task for narwhal modules 2009-08-25 23:22:04 -07:00
Francisco Ryan Tolmasky I 58ac49e0b0 Fix for out of memory errors when building clean.
Reviewed by me.
2009-08-25 19:55:21 -07:00
Francisco Ryan Tolmasky I d1c0237bf3 Fix for recursive notification postings crashing. Also fixed sizing issues with tableview, including crashing when not in a superview.
Closes #238.

Reviewed by me.
2009-08-25 16:08:07 -07:00
Francisco Ryan Tolmasky I abc1c6f2db Merge branch 'master' of git@github.com:280north/cappuccino 2009-08-24 23:04:19 -07:00
Francisco Ryan Tolmasky I 14ba9c95eb Fix for incorrect calculation in rowsInRect when rect is out of bounds, or when there are 0 rows in CPTableView.
Reviewed by me.
2009-08-24 23:03:35 -07:00
Tom Robinson 0b03025924 Implemented rest of CPApplication openFile 2009-08-24 12:30:08 -07:00
Francisco Ryan Tolmasky I b369aa6aff Made CPCibConnector, CPCibOutletConnector, and CPCibControlConnector public classes.
Reviewed by me.
2009-08-24 00:21:15 -07:00
Francisco Ryan Tolmasky I f189ec6eb9 Change default log level from fatal to info.
Reviewed by me.
2009-08-22 16:32:11 -07:00
Francisco Ryan Tolmasky I 3b761ec55e Fixed a bug in the new CPIndexSet when adding indexes to the back of the set. Also added a test to handle this case. Also moved Table visual tests into Tests/ folder.
Reviewed by me.
2009-08-22 02:51:37 -07:00
Francisco Ryan Tolmasky I 1b4a5dc48b Merge branch 'master' of git@github.com:280north/cappuccino 2009-08-22 01:45:30 -07:00
Francisco Ryan Tolmasky I 356d2e9ea7 Merge branch 'tableview-merge' 2009-08-22 01:45:10 -07:00
Francisco Ryan Tolmasky I d3bebfd064 New scroller artwork.
Reviewed by me.
2009-08-22 01:43:29 -07:00
Francisco Ryan Tolmasky I da9221bf71 Fixed resources support being broken in nib2cib.
Reviewed by me.
2009-08-22 01:03:56 -07:00
Francisco Ryan Tolmasky I 8990f6c387 Minor fixes and added licenses to files.
Reviewed by me.
2009-08-21 23:32:34 -07:00
Francisco Ryan Tolmasky I cdaa363a82 Removed unecessary call in header view.
Reviewed by me.
2009-08-21 22:41:40 -07:00
Francisco Ryan Tolmasky I e910fee03f Fixed spacing issue.
Reviewed by me.
2009-08-21 20:03:26 -07:00
Francisco Ryan Tolmasky I 7528c452c4 Cleaned up row highlighting and added support for drawing column selection as well.
Reviewed by me.
2009-08-21 20:03:26 -07:00
Francisco Ryan Tolmasky I 824cd6d5f1 Removed unecessary functions.
Reviewed by me.
2009-08-21 20:03:26 -07:00
Francisco Ryan Tolmasky I 3f7db4ca12 Improved grid drawing code.
Reviewed by me.
2009-08-21 20:03:26 -07:00
Francisco Ryan Tolmasky I 2ee3b93e0d Made it so you can have arbitrary number of alternating row colors.
Reviewed by me.
2009-08-21 20:03:26 -07:00
Francisco Ryan Tolmasky I bd69683dc2 Fix for infinite loop when sizing last column to fit.
Reviewed by me.
2009-08-21 20:03:26 -07:00
Francisco Ryan Tolmasky I 1b8f263224 Fix for using tabledrawview.
Reviewed by me.
2009-08-21 20:03:26 -07:00
RandyandFrancisco Ryan Tolmasky I 58aef6ef74 tableview fixes 2009-08-21 20:03:26 -07:00
Francisco Ryan Tolmasky I 8a1c1b931f Fix for calling undefined function.
Reviewed by me.
2009-08-21 20:03:25 -07:00
Tom Robinson db77e826d4 Fixed syntax error reporting in objjc 2009-08-20 19:15:40 -07:00
Francisco Ryan Tolmasky IandTom Robinson 35fa76064c CPWindow centering 2009-08-20 19:15:31 -07:00
Francisco Ryan Tolmasky I d2df0919a5 Fix for calling undefined function.
Reviewed by me.
2009-08-20 01:07:47 -07:00
Francisco Ryan Tolmasky I b378a4d0fa Merge branch 'master' into tableview 2009-08-20 00:55:16 -07:00
Francisco Ryan Tolmasky I e174edd0dc Added file opening conviniences.
Reviewed by me.
2009-08-19 20:41:27 -07:00
Francisco Ryan Tolmasky I 3060c3f100 Add delegate method to prevent automatically opening a new document on launch in document based applications.
Reviewed by me.
2009-08-19 16:55:28 -07:00
Francisco Ryan Tolmasky I 14528d5a49 Fixed a bug where split view was setting NaN positions and sizes when position was set to 0.
Reviewed by me.
2009-08-17 23:47:33 -07:00
Francisco Ryan Tolmasky I 35c1221905 Fixed a bug with HTML 5 and platform windows.
Reviewed by me.
2009-08-17 14:10:22 -07:00
Francisco Ryan Tolmasky I 300f74bf4d Merge branch 'master' of git@github.com:280north/cappuccino
Conflicts:
	AppKit/CPDragServer.j
	AppKit/Platform/CPPlatform.j
2009-08-17 03:55:02 -07:00
Francisco Ryan Tolmasky I e8dd56bda7 Added HTML 5 drag and drop support for WebKit/Safari.
Reviewed by me.
2009-08-17 03:50:52 -07:00
Francisco Ryan Tolmasky I 0c9f247a82 Slight frame setting modification.
Reviewed by me.
2009-08-17 03:50:52 -07:00
Francisco Ryan Tolmasky I 51e6f92fee Fix for regression with menus showing up too low in menubar.
Reviewed by me.
2009-08-17 03:50:51 -07:00
Francisco Ryan Tolmasky I d1d0d72e32 Slight change from macro to runtime option.
Reviewed by me.
2009-08-17 03:50:51 -07:00
Tom RobinsonandFrancisco Ryan Tolmasky I aef723e160 Update Jack again. 2009-08-17 03:50:51 -07:00
Francisco Ryan Tolmasky I ab8add681e A number of fixes and improvements to the platform window subsystem.
Reviewed by me.
2009-08-17 03:50:51 -07:00
Francisco Ryan Tolmasky I 07da83715b Slight frame setting modification.
Reviewed by me.
2009-08-12 20:42:20 -07:00
Francisco Ryan Tolmasky I 7db40a6b0d Fix for regression with menus showing up too low in menubar.
Reviewed by me.
2009-08-12 17:46:44 -07:00
Francisco Ryan Tolmasky I 55a8084b39 Slight change from macro to runtime option.
Reviewed by me.
2009-08-12 17:34:13 -07:00
Tom Robinson 475cd6a21f Update Jack again. 2009-08-11 15:41:52 -07:00
Tom Robinson 4c3a43989b Merge branch 'master' of git@github.com:280north/cappuccino 2009-08-11 11:46:31 -07:00
Tom Robinson 0d7ba4e872 Update Jack to latest 2009-08-11 11:46:15 -07:00
Francisco Ryan Tolmasky I a40714e14a Merge branch 'master' of git@github.com:280north/cappuccino 2009-08-11 01:18:03 -07:00
Francisco Ryan Tolmasky I c850c0cf45 A number of fixes and improvements to the platform window subsystem.
Reviewed by me.
2009-08-11 01:13:33 -07:00
Francisco Ryan Tolmasky I ddc9334af3 Merge branch 'master' into tableview
Conflicts:
	AppKit/CPTableColumn.j
	AppKit/CPTableView.j
2009-08-10 15:09:10 -07:00
Tom Robinson 654b0493bb Update Narwhal to get readline package, modify objj.js to use readline(). 2009-08-09 20:11:19 -07:00
Tom Robinson 64cbf98140 Update Narwhal to latest 2009-08-09 15:19:21 -07:00
Tom Robinson 5fc8cd697e Merge branch 'master' of git@github.com:280north/cappuccino 2009-08-09 15:16:12 -07:00
Tom Robinson 2423faa8c6 Major improvments to Objective-J Narwhal support.
* Added objj_eval, objj_import_sync, objj_preprocess_sync, etc
* Refactored REPL.
* Added Objective-J plugin for load system, using new Narwhal plugin system.
* Refactored objj and objjc into single module.
2009-08-09 14:40:02 -07:00
Tom Robinson 172c7330ab Make objj a self contained narwhal package. Invert install so narwhal contains objj not vice versa.
Conflicts:

	Tools/Rake/lib/objective-j/bundletask.rb
2009-08-09 14:39:36 -07:00
lowell vizonandFrancisco Ryan Tolmasky I 1a5bf1c8eb CPBezierPath documentation completed.
Signed-off-by: Francisco Ryan Tolmasky I <francisco@280north.com>
2009-08-08 03:50:52 +08:00
lowell vizonandFrancisco Ryan Tolmasky I 377f331b47 Documentation Edits: Replaced <code> and <pre> tags with \c; this allows monospaced text to be displayed with formatted text without needing a new line. See AppKit/CPView after generating documentation for examples. Also added - and + signs to the above changes when referring to either an -instanceMethod or a +classMethod. --lowell@cocoastep
Signed-off-by: Francisco Ryan Tolmasky I <francisco@280north.com>
2009-08-08 03:50:50 +08:00
Francisco Ryan Tolmasky I 3e85bf0e8b Merge branch 'master' of git@github.com:280north/cappuccino 2009-08-07 10:50:54 -07:00
Francisco Ryan Tolmasky I 3f496f1a10 Fixed CPEvent returning a direct reference to its location (as opposed to a copy), and CPPlatformWindow doing geometry gymnastics instead of the well defined conversion methods on CPWindow.
Reviewed by me.
2009-08-03 01:47:33 -07:00
Sergio FelixandFrancisco Ryan Tolmasky I b52da00d46 Fixed a bug in CPTimer 2009-08-01 20:35:31 -07:00
Francisco Ryan Tolmasky I 69fa064509 Merge branch 'master' of git@github.com:280north/cappuccino 2009-07-29 20:28:42 -07:00
Tom Robinson 0c349a8d7f Add option to enable type checking in index-debug.html. 2009-07-29 20:23:40 -07:00
Tom Robinson 3b8664e6ff Disable typechecking by default 2009-07-29 19:23:32 -07:00
Tom Robinson 2bb6da5132 Undoing this so Ross stops complaining. 2009-07-29 19:21:17 -07:00
Francisco Ryan Tolmasky I 0876653ae3 Only include debug.js in DEBUG mode for Objective-J.
Reviewed by me.
2009-07-29 19:06:06 -07:00
Tom Robinson 4876c7142f Merge branch 'typecheck' 2009-07-29 19:02:16 -07:00
Tom Robinson 856373adec Added status code checks to abort Rake early. 2009-07-29 18:57:18 -07:00
Francisco Ryan Tolmasky I fbf559043e Fixed accidentally committed #if 0.
Reviewed by me.
2009-07-28 21:10:16 -07:00
Ross Boucher bbda6e6e77 Added the images for CPSearchField. Closes #205. 2009-07-27 23:28:10 -07:00
Ross Boucher 4cd7d35499 Merge branch 'master' of git@github.com:280north/cappuccino 2009-07-27 23:15:33 -07:00
Francisco Ryan Tolmasky I a8393eaa8a Merge branch 'master' of git@github.com:280north/cappuccino 2009-07-27 22:43:31 -07:00
Francisco Ryan Tolmasky I 6a9804939e More removal of "bridge".
Reviewed by me.
2009-07-27 22:43:01 -07:00
Ross Boucher b50067e39e Add a trim function to CPString. 2009-07-27 22:41:47 -07:00
Ross Boucher 028be939f9 Merge branch 'master' of git@github.com:280north/cappuccino 2009-07-27 18:47:29 -07:00
Ross Boucher b5e84342ac Fix for documentation error. Closes #208. 2009-07-27 18:43:46 -07:00
Francisco Ryan Tolmasky I 5bc92b686b Slight fix to new CPWindowController mechanics.
Reviewed by me.
2009-07-27 18:42:04 -07:00
Francisco Ryan Tolmasky I e8f1763615 Merge branch 'master' of git@github.com:280north/cappuccino 2009-07-27 18:22:53 -07:00
Francisco Ryan Tolmasky I 41dc660140 Added support for document cibs.
Reviewed by me.
2009-07-27 18:19:34 -07:00
Ross Boucher a05ecd2759 Add disabled state for check boxes 2009-07-27 17:03:34 -07:00
Ross Boucher f51222dff6 Add disabled states to CPRadioButton 2009-07-27 16:57:16 -07:00
Ross Boucher 598411c072 remove opacity from disabled buttons -- otherwise its unusable on dark backgrounds 2009-07-27 16:51:05 -07:00
Ross Boucher 241cc2ac06 Add highlighted states to radio buttons. 2009-07-27 16:38:30 -07:00
Ross Boucher 38e2ca3589 Add pushed states to checkboxes. 2009-07-27 16:20:12 -07:00
Ross Boucher 5ccc638baf Add resources for CPButton disabled state. Closes #152. 2009-07-27 15:55:53 -07:00
Ross Boucher 9e6ba1ea06 Merge branch 'master' of git@github.com:280north/cappuccino 2009-07-27 13:18:08 -07:00
Ross Boucher c0400d6362 Fix a bug where press was clobbering CPApplication arguments.
Also changed line endings to Mac/Unix from Windows.
2009-07-27 13:16:31 -07:00
Francisco Ryan Tolmasky I e9fee72744 Merge branch 'master' of git@github.com:280north/cappuccino
Conflicts:
	Foundation/CPKeyValueObserving.j
2009-07-27 12:10:51 -07:00
Francisco Ryan Tolmasky I 59bec06e6e Removed CPDOMWindowBridge file.
Reviewed by me.
2009-07-27 12:06:07 -07:00
Ross BoucherandFrancisco Ryan Tolmasky I 64b81cfcdb Remove several CPDictionaries in favor of Objects, about a 15% performance gain. 2009-07-27 12:06:07 -07:00
Ross BoucherandFrancisco Ryan Tolmasky I 865a2b513f Slight performance improvement and memory improvement by moving the storage of KVO proxy objects. 2009-07-27 12:06:07 -07:00
Francisco Ryan Tolmasky I 2e37945b4f Removed remaining references to CPDOMWindowBridge.
Reviewed by me.
2009-07-27 12:06:07 -07:00
Francisco Ryan Tolmasky I 92594a7ef9 Removed references from CPWindow and CPPlatformWindow to CPDOMWindowBridge.
Reviewed by me.
2009-07-27 12:06:07 -07:00
Francisco Ryan Tolmasky I a34e23fa1c Removed CPDOMWindowBridge dependency in CPTextField.
Reviewed by me.
2009-07-27 12:06:07 -07:00
Francisco Ryan Tolmasky I fa5352ad40 Fix for drag and drop with platform windows.
Reviewed by me.
2009-07-27 12:06:07 -07:00
Francisco Ryan Tolmasky I 4d179b1db7 Remove global references to first window.
Reviewed by me.
2009-07-27 12:06:07 -07:00
Francisco Ryan Tolmasky I d2b1df88e8 FIx for drag and drop without CPDOMWindowBridge.
Reviewed by me.
2009-07-27 12:06:07 -07:00
Francisco Ryan Tolmasky I 756885fd53 Remove debugger command in CPPopUpButton that breaks Release builds.
Reviewed by me.
2009-07-27 12:06:06 -07:00
Ross Boucher 0ef4e9bca5 store dependent keys on the class object itself, rather than in a global map. 2009-07-26 23:56:18 -07:00
Ross Boucher 4370604165 Remove several CPDictionaries in favor of Objects, about a 15% performance gain. 2009-07-26 23:40:52 -07:00
Ross Boucher 5ce96b45bb Slight performance improvement and memory improvement by moving the storage of KVO proxy objects. 2009-07-26 22:46:22 -07:00
Francisco Ryan Tolmasky I 4f4a488762 Remove debugger command in CPPopUpButton that breaks Release builds.
Reviewed by me.
2009-07-26 15:28:41 -07:00
Francisco Ryan Tolmasky I d53207efd5 Furhter platform window support.
Reviewed by me.
2009-07-26 12:52:24 -07:00
Francisco Ryan Tolmasky I ba81b1356d Merge branch 'master' of git@github.com:280north/cappuccino 2009-07-26 02:06:06 -07:00
Francisco Ryan Tolmasky I ae7fbad2b9 Fix for dom layer.
Reviewed by me.
2009-07-26 01:34:16 -07:00
Francisco Ryan Tolmasky I e69d770583 Further deprecation of CPDOMWindowBridge.
Reviewed by me.
2009-07-25 17:10:48 -07:00
Francisco Ryan Tolmasky I 8382bb1ae8 Beginnings of Platform reorg.
Reviewed by me.
2009-07-25 16:47:30 -07:00
Geoffrey GrosenbachandRoss Boucher 82cfc5f994 Created initial test for CPSegmentedControl 2009-07-24 23:00:18 -07:00
Ross Boucher 16be11325f Merge branch 'master' of git@github.com:280north/cappuccino 2009-07-24 22:50:01 -07:00
Ross Boucher 5829c8b682 Fix an issue where removing all items from a CPPopUpButton caused an exception. 2009-07-24 22:49:18 -07:00
cacaodevandFrancisco Ryan Tolmasky I 57ee7bcfce Fixed bug reported by Paul Tomlin http://groups.google.com/group/objectivej/browse_thread/thread/e4bc41026a8f100f/6b14f3b74189df18
Signed-off-by: Francisco Ryan Tolmasky I <francisco@280north.com>
2009-07-25 02:48:58 +08:00
Francisco Ryan Tolmasky I 4824f22e3c Fix for super not working for class methods.
Closes #227.

Reviewed by me.
2009-07-24 11:22:32 -07:00
Tom Robinson 88be473da4 Fixed bug in type check logic, added ability to print stack traces on type check errors 2009-07-23 14:14:34 -07:00
Tom Robinson 3ff945663f Refactored objj_msgSend debug hooks 2009-07-23 13:24:33 -07:00
Francisco Ryan Tolmasky I 9f989297df Merge branch 'master' into tableview 2009-07-22 23:57:30 -07:00
Francisco Ryan Tolmasky I 12d03a5128 Fix for custom objects.
Reviewed by me.
2009-07-22 19:34:44 -07:00
Francisco Ryan Tolmasky I 369e02fb37 Merge branch 'master' into tableview
Conflicts:
	AppKit/CPView.j
2009-07-22 16:14:18 -07:00
Francisco Ryan Tolmasky I 48f0aa0b78 Fix for menuDidClose: sometimes not being sent, and other times being sent after the menu item action (it should be sent before).
Reviewed by me.
2009-07-22 10:43:59 -07:00
Francisco Ryan Tolmasky I 3e8cb8f9c6 Fixed an issue with CPTextField not allowing select all from API, and also made editing field editor take on the alignment properties of the host textfield.
Reviewed by me.
2009-07-20 20:41:15 -07:00
Francisco Ryan Tolmasky I 4865d6b20f Fixed an issue with dependent keys in KVO only working for composed properties, and also made the "frame" key on views dependent on a view's frame origin and frame size.
Reviewed by me.
2009-07-20 20:37:19 -07:00
tlrobinson 745e24d2f5 Rename objj_msgSendTypeCheck to objj_msgSend_TypeCheck to match others 2009-07-20 18:42:54 -07:00
tlrobinson d7b679dc78 * Move type checking to debug.js.
* Use JSON.stringify for serializing types array.
* Print Objective-J objects' names instead of descriptions to prevent inf recursion.
2009-07-20 18:39:37 -07:00
tlrobinson 9b99457871 Preliminary typechecking version of objj_msgSend, and preprocessor support. 2009-07-20 18:16:17 -07:00
Francisco Ryan Tolmasky I 6592328553 Merge branch 'master' into tableview 2009-07-17 12:18:49 -07:00
Marc NijdamandFrancisco Ryan Tolmasky I 9c226ae574 Ensuring all instance variables initialized to same values as initWithFrame: on coder init
Signed-off-by: Francisco Ryan Tolmasky I <francisco@280north.com>
2009-07-18 03:03:14 +08:00
Marc NijdamandFrancisco Ryan Tolmasky I 215619e6e2 Initial nib2cib work on collectionview
Signed-off-by: Francisco Ryan Tolmasky I <francisco@280north.com>
2009-07-18 03:03:12 +08:00
Francisco Ryan Tolmasky I eee6fe0e67 Merge branch 'master' into tableview 2009-07-17 11:47:12 -07:00
Marc NijdamandRoss Boucher 8e3ac66a2d Added '_' as allowed characted in implementation, protocol and interface names 2009-07-13 17:21:43 -07:00
Marc NijdamandRoss Boucher cc90f2e5f0 Added run in browser/refresh browser commands for project level view of run application 2009-07-13 17:21:24 -07:00
Marc NijdamandRoss Boucher 0356c6e622 Reordered a bit and added separator 2009-07-13 17:20:20 -07:00
Francisco Ryan Tolmasky I 308bbb2f8c Updated tableview nib.
Reviewed by me.
2009-07-11 21:01:07 -07:00
Francisco Ryan Tolmasky I d0599aef8f More java call removal from nib2cib.
Reviewed by me.
2009-07-11 20:31:12 -07:00
Francisco Ryan Tolmasky I afba1909bb Improved TableView nib support as well as including several nib2cib improvements.
Reviewed by me.
2009-07-11 18:12:20 -07:00
Francisco Ryan Tolmasky I 3761fb8037 Removed some commented code.
Reviewed by me.
2009-07-09 10:55:38 -07:00
Francisco Ryan Tolmasky I adc2344454 Merge branch 'master' into tableview 2009-07-08 11:55:40 -07:00
Francisco Ryan Tolmasky I a5a43de26e Fix for objectAtIndex: throwing out of range exceptions.
Closes #105.

Reviewed by me.
2009-07-08 11:52:47 -07:00
Francisco Ryan Tolmasky I c281d01974 Updated cib for test project.
Reviewed by me.
2009-07-08 11:17:31 -07:00
Francisco Ryan Tolmasky I 8660c72015 Fix for scrollers and nib2cib, as well as resizing.
Closes #217.
Closes #218.

Reviewed by me.
2009-07-08 11:15:15 -07:00
Francisco Ryan Tolmasky I cb81eeed15 Fix for selection in tableview.
Reviewed by me.
2009-07-07 18:42:44 -07:00
Francisco Ryan Tolmasky I 6ad5ec4d66 Merge branch 'master' into tableview 2009-07-07 11:34:27 -07:00
Francisco Ryan Tolmasky I b2f35b61d3 Fix for making scrolling smoother.
Reviewed by me.
2009-07-07 11:33:58 -07:00
Francisco Ryan Tolmasky I ddbc1e0e94 Changes to tableview nib.
Reviewed by me.
2009-07-07 11:33:19 -07:00
Francisco Ryan Tolmasky I 4086d37dac Slight fixes for resizing tableviews.
Reviewed by me.
2009-07-07 10:26:03 -07:00
Francisco Ryan Tolmasky I b9208c2f59 Fixed bug in Scroll View where disabled scrollable scroller would appear. Also added tests for CPScrollView.
Reviewed by me.
2009-07-06 22:43:43 -07:00
Francisco Ryan Tolmasky I 92bce1a663 Merge branch 'master' into tableview 2009-07-06 14:41:14 -07:00
Francisco Ryan Tolmasky I a5b468bbeb Fix for adding support for NSMutableString and NSMutableDictionary in nib2cib. Also, added support for inline strings.
Reviewed by me.
2009-07-06 14:39:33 -07:00
Francisco Ryan Tolmasky I 761e32a847 Fix for updating window background color to match crushed png.
Reviewed by me.
2009-07-05 21:04:08 -07:00
Marc NijdamandRoss Boucher 1f356053db Expanding zip file to full bundle and adding Objective-C symbol lists 2009-07-05 15:47:02 -07:00
Geoffrey GrosenbachandRoss Boucher 9d64526f26 Emacs mode for editing Objective-J files. 2009-07-05 15:46:06 -07:00
Francisco Ryan Tolmasky I 3c087f01b4 Merge branch 'master' into tableview 2009-07-05 08:36:45 -07:00
Francisco Ryan Tolmasky I 0ef7f53250 Fix for throwing a proper exception when class isn't defined in an archive.
Reviewed by me.
2009-07-05 08:35:44 -07:00
Francisco Ryan Tolmasky I 528ef4394a Beginnings of nib2cib support for new tableview.
Reviewed by me.
2009-07-05 07:59:54 -07:00
Francisco Ryan Tolmasky I b12017cd51 Slight fix for comparing old tableview to new tableview.
Reviewed by me.
2009-07-04 10:43:59 -07:00
Francisco Ryan Tolmasky I 714fc9d5bb Added beginnings of drawing selection.
Reviewed by me.
2009-07-04 10:22:20 -07:00
Francisco Ryan Tolmasky I d131127717 Merge branch 'master' into tableview 2009-07-04 06:52:13 -07:00
Francisco Ryan Tolmasky I b8046c479f Fix for creating outlets and actions that don't exist in interface builder.
Reviewed by me.
2009-07-04 06:49:55 -07:00
Klaas Pieter AnnemaandFrancisco Ryan Tolmasky I af062da99d Fix for selection being lost when changing the number of segments.
Reviewed by tolmasky.

Signed-off-by: Francisco Ryan Tolmasky I <francisco@280north.com>
2009-06-30 20:59:49 +08:00
Francisco Ryan Tolmasky I 21da2c6f56 Merge branch 'master' into tableview 2009-06-29 05:36:20 -07:00
Francisco Ryan Tolmasky I 7cc6e6af0a Fix for having multiple copies of objective-j gem in the system.
Reviewed by me.
2009-06-29 05:35:44 -07:00
Francisco Ryan Tolmasky I ab2cb38362 Fixed incorrect variable in CPIndexSet.
Reviewed by me.
2009-06-27 23:43:49 -07:00
Ross Boucher 8c171e5a40 Add corner views to the table view stuff 2009-06-25 14:42:30 -07:00
Ross Boucher ac6c03f2c7 Fix for incorrectly sized header views 2009-06-24 22:52:42 -07:00
Ross Boucher e97b78477b Merge branch 'tableview' of git@github.com:280north/cappuccino into tableview
Conflicts:
	AppKit/NEWCPTableView.j
	TableTest/AppController.j
2009-06-24 15:16:55 -07:00
Ross Boucher 849dda0725 Add support for header views in table view and scroll view 2009-06-24 15:12:26 -07:00
Francisco Ryan Tolmasky I b8755c113f Merge branch 'master' into tableview 2009-06-24 14:45:29 -07:00
Francisco Ryan Tolmasky I d57e7050db Added CPWindowList and CPWindowObjectList functions for grabbing the currently visible windows.
Reviewed by me.
2009-06-24 14:41:37 -07:00
Francisco Ryan Tolmasky I dd4db720ef Added selection methods.
Reviewed by me.
2009-06-23 21:26:41 -07:00
Francisco Ryan Tolmasky I 202d59475b Slight movement of debug code.
Reviewed by me.
2009-06-23 20:46:17 -07:00
Francisco Ryan Tolmasky I 1fecae3dc0 Further improvements to tableview, and reimplemented getIndexes: for CPIndexSet to match the new architecture.
Reviewed by me.
2009-06-23 10:51:16 -07:00
Francisco Ryan Tolmasky I 998f52c4a4 Merge commit 'origin/tableview' into tableview
Conflicts:
	Tests/Foundation/CPIndexSetTest.j
2009-06-21 23:08:32 -07:00
Francisco Ryan Tolmasky I bd07054a1b Fix for removeIndex in CPIndexSet and added tests for CPIndexSet.
Reviewed by me.
2009-06-21 20:25:29 -07:00
Ross Boucher adde315e2d Fix a bug in [CPArray indexOfObject:sortedByDesciptors:], add a matching test. 2009-06-21 16:16:45 -07:00
Ross Boucher c97bb6cbdd CPIndexSet test 2009-06-21 15:20:24 -07:00
Francisco Ryan Tolmasky I f4171f9afa Made all initializers call designated initializers and fixed numerous spacing issues.
Reviewed by me.
2009-06-21 13:59:58 -07:00
Francisco Ryan Tolmasky I d165761740 Began work on rewriting CPIndexSet.
Reviewed by me.
2009-06-21 03:50:06 -07:00
Francisco Ryan Tolmasky I ca1ea3721f Merge branch 'master' into tableview 2009-06-20 17:13:17 -07:00
Saikat ChakrabartiandFrancisco Ryan Tolmasky I 7d158de356 Fix for incorrect chain received mouseEntered events.
Closes #199.

Reviewed by me.
2009-06-20 17:12:03 -07:00
Francisco Ryan Tolmasky I 71a99deada Further work on loading system and fixed faulty test.
Reviewed by me.
2009-06-20 17:06:24 -07:00
Nabil ElisaandRoss Boucher c7f81691bf Added more colors to satisfy issue #182 2009-06-20 14:32:57 -07:00
Francisco Ryan Tolmasky I 05cdc2bab3 Changed file type to UTF-8.
Reviewed by me.
2009-06-20 01:56:38 -07:00
Francisco Ryan Tolmasky I 8beb71aa76 Work on appropriately sizing table view.
Reviewed by me.
2009-06-19 03:37:14 -07:00
Francisco Ryan Tolmasky I 201fda96a5 Getting something on the screen.
Reviewed by me.
2009-06-18 16:56:49 -07:00
Francisco Ryan Tolmasky I 4e94fa51fe Further fleshed out methods.
Reviewed by me.
2009-06-18 01:28:33 -07:00
Francisco Ryan Tolmasky I f920202bec Merge branch 'master' into tableview 2009-06-17 23:45:23 -07:00
tlrobinson 19f1657824 Disable encoding/decoding of plusses in URIs 2009-06-17 01:43:39 -07:00
Francisco Ryan Tolmasky I 5d1db76be2 Merge branch 'master' of git@github.com:280north/cappuccino 2009-06-16 17:22:33 -07:00
Francisco Ryan Tolmasky I c6795fdfcf Merge branch 'master' into tableview 2009-06-16 17:22:13 -07:00
Francisco Ryan Tolmasky I 35a9305347 Add setters/getters to cib custom objects/view/windows.
Reviewed by me.
2009-06-16 17:21:52 -07:00
tlrobinson e36ab855e8 Missing import for CibLoading in CPApplication 2009-06-15 18:20:12 -07:00
Francisco Ryan Tolmasky I d516037286 Merge branch 'master' into tableview 2009-06-15 12:43:07 -07:00
Francisco Ryan Tolmasky I b4abc5a99d Further key handling fixes.
Reviewed by me.
2009-06-15 12:33:16 -07:00
Francisco Ryan Tolmasky I 9bb9db760e Added removeObjectsInArray: convinience method to CPMutableSet.
Reviewed by me.
2009-06-13 21:45:46 -07:00
Francisco Ryan Tolmasky I 831ea11a6b Merge branch 'master' into tableview 2009-06-13 18:28:23 -07:00
Francisco Ryan Tolmasky I bfcb94a844 Various key input fixes.
Reviewed by me.
2009-06-13 18:27:31 -07:00
Francisco Ryan Tolmasky I 1e3b79de17 Fix for superview's not remaining mouseEntered when mouse moves over subviews.
Closes #126.

Reviewed by me.
2009-06-13 14:50:38 -07:00
Francisco Ryan Tolmasky I fe21fc82c4 Updating version strings to 0.7.1.
Reviewed by me.
2009-06-12 13:50:26 -07:00
Francisco Ryan Tolmasky I cb9d81aa7f Fix for capitalization issue with circular slider images.
Reviewed by me.
2009-06-11 14:05:12 -07:00
Francisco Ryan Tolmasky I 8f1a02cb0f Merge branch 'master' into tableview 2009-06-10 13:17:37 -07:00
Francisco Ryan Tolmasky I 1f0e4b0eca Fix for window returning a direct reference to its frame instead of a copy.
Reviewed by me.
2009-06-10 13:17:09 -07:00
Francisco Ryan Tolmasky I e0f53b89ca Merge branch 'master' into tableview 2009-06-10 11:50:07 -07:00
Francisco Ryan Tolmasky I 8b25240d04 Cleaned up CPControl ephemeral views code and got rid of some dead code in cib logic.
Reviewed by me.
2009-06-10 11:49:16 -07:00
Francisco Ryan Tolmasky I 7e88b1abfd Minor stylistic changes.
Reviewed by me.
2009-06-09 17:54:18 -07:00
Francisco Ryan Tolmasky I e38dfc4335 Merge branch 'master' into tableview 2009-06-09 16:45:59 -07:00
Francisco Ryan Tolmasky I 90fe0d64f5 Fix for dragged types not working on decoded views.
Reviewed by me.
2009-06-09 16:45:27 -07:00
Francisco Ryan Tolmasky I eab4f4bf78 Made CPImageView accept image drag and drop.
Reviewed by me.
2009-06-09 15:36:53 -07:00
Francisco Ryan Tolmasky I ece999662d Beginnings of new versions of these classes.
Reviewed by me.
2009-06-08 10:27:25 -07:00
Francisco Ryan Tolmasky I 8c049c3de4 Merge branch 'master' into tableview 2009-06-07 16:08:00 -07:00
Francisco Ryan Tolmasky I 6cab77e005 More hash->UID name changes.
Reviewed by andrew.
2009-06-07 16:07:08 -07:00
Francisco Ryan Tolmasky I c74642b641 Replacing several instances of -hash with the new -UID method. Partial fix for http://github.com/280north/cappuccino/issues#issue/10 .
Reviewed by andrew.
2009-06-07 15:47:21 -07:00
tlrobinson e7e804cae3 TableTest 2009-06-07 14:58:24 -07:00
aburkhalter 7ca3473b64 failing test for issue #112, fix for said issue of _doubleAction ReferenceError 2009-06-06 17:51:32 -07:00
aburkhalterandtlrobinson 927b94244a Added test coverage for CPSearchField instantiation, recentSearch getter/setter, added DOM protection to class init 2009-06-06 16:49:46 -07:00
tlrobinson a5c467fba5 Add CPSearchField.j to AppKit.j imports 2009-06-06 16:12:02 -07:00
cacaodevandtlrobinson fc74bba68c CPSearchField contributed by cacaodev 2009-06-06 15:27:25 -07:00
Tom Robinson 656c94a8cd Merge branch 'master' of git@github.com:280north/cappuccino 2009-06-05 23:45:41 -07:00
Tom Robinson 896eaf7937 Update Externals to latest. Remove first arg in objj, objjc, and cplutil to match changes to Narwhal. 2009-06-05 23:40:31 -07:00
Francisco Ryan Tolmasky I 886b4ef118 Fix for image views in toolbar items not displaying their images.
Reviewed by me.
2009-06-05 20:01:30 -07:00
Francisco Ryan Tolmasky I c42fb68d8a Made class swapping more robust.
Reviewed by me.
2009-06-05 17:31:35 -07:00
Francisco Ryan Tolmasky I 3f27fca518 Added support for custom classes on non-customviews in nib2cib.
Reviewed by me.
2009-06-04 02:38:06 -07:00
Francisco Ryan Tolmasky I c7823a92f8 Fix for -description in CPArray containing null or undefined values.
Reviewed by me.
2009-06-02 21:14:22 -07:00
Francisco Ryan Tolmasky I c61c892732 Merge branch 'master' of git@github.com:280north/cappuccino 2009-06-02 21:13:47 -07:00
Tom Robinson b0470ca2d7 Update to use JSON.{parse,stringify} 2009-06-02 15:07:07 -07:00
Tom Robinson 7c305c45fc Merge branch 'master' of git@github.com:280north/cappuccino 2009-06-02 15:04:09 -07:00
Tom Robinson cfda93d1e3 Update JSON support to json2.js, added in Objective-J. Deprecate CPJSObjectCreateJSON and CPJSObjectCreateWithJSON. 2009-06-02 15:02:25 -07:00
Francisco Ryan Tolmasky I b4c7af498b Spacing fix.
Reviewed by me.
2009-06-01 17:38:19 -07:00
Francisco Ryan Tolmasky I 6ddb7851f6 Added generation code in a comment for future use if necessary.
Reviewed by me.
2009-06-01 17:17:45 -07:00
Ross Boucher 7f60bdec4f Update the documentation of methods define with the BRIDGE macro 2009-06-01 10:01:44 -07:00
Ross Boucher 8971c320bd Don't capture errors during DOM events in DEBUG mode, to make it easier to debug IE 2009-05-31 19:17:56 -07:00
Ross Boucher a710dc974f Fix for VML paths 2009-05-31 19:17:36 -07:00
cacaodevandRoss Boucher e1b63b848f Set disabled CPMenuItem's text color to lightGrayColor instead of darkGrayColor 2009-05-31 15:12:13 -07:00
Francisco Ryan Tolmasky I 5409face8c Fix for providing too many image slices breaking CPView.
Reviewed by me.
2009-05-31 13:44:58 -07:00
Ross Boucher c9e40cbfba Fix for a change in CGContextAddEllipseInRect that was breaking existing core graphics code 2009-05-31 13:06:50 -07:00
Ross Boucher 35947697f2 Fix for KAPPA missing in CGPath. Looks like it was auto-merged out. 2009-05-31 12:12:51 -07:00
Ross Boucher 3e1f09bb7a Merge branch 'master' of git@github.com:280north/cappuccino 2009-05-31 11:26:32 -07:00
Martin HäckerandRoss Boucher 82ef2356a5 fixes as per the review from Ross Boucher 2009-05-31 11:26:00 -07:00
Nicholas SmallandFrancisco Ryan Tolmasky I 33f96dacd1 Fix for undefined key handling.
Reviewed by me.
2009-05-31 01:34:03 -07:00
Francisco Ryan Tolmasky I cc24cd9a73 Fix for nib2cib's separator menu items not showing up.
Reviewed by me.
2009-05-31 01:32:56 -07:00
Francisco Ryan Tolmasky I 0fff3bade6 Support for new CPEvent mechanism.
Reviewed by me.
2009-05-30 23:18:48 -07:00
Francisco Ryan Tolmasky I b1c410d42c Merge branch 'master' of git@github.com:280north/cappuccino 2009-05-30 23:16:57 -07:00
Francisco Ryan Tolmasky I f4b4d38165 Coat tailed CPEvents on native DOM events if they exist, saving the creation of many objects.
Reviewed by me.
2009-05-30 23:16:18 -07:00
Ross Boucher f46aa870a7 adding briefs and unifying class header structure
Conflicts:

	Foundation/CPArray.j
	Foundation/CPAttributedString.j
	Foundation/CPBundle.j
	Foundation/CPCountedSet.j
	Foundation/CPIndexSet.j
	Foundation/CPJSONPConnection.j
2009-05-30 13:49:10 -07:00
Ross Boucher 7d4c2840eb All Foundation classes briefed
Conflicts:

	Foundation/CPSet.j
	Foundation/CPTimer.j
	Foundation/CPURLConnection.j
2009-05-30 13:46:42 -07:00
Ross Boucher 8fb0abd3d6 Added briefs to all Foundation and made some cleanups to docs
Conflicts:

	Foundation/CPArray.j
	Foundation/CPBundle.j
	Foundation/CPCountedSet.j
	Foundation/CPIndexSet.j
	Foundation/CPTimer.j
	Foundation/CPURLConnection.j
2009-05-30 13:45:26 -07:00
Ross Boucher f6bd4ddd96 Added a new group Cocoa Compatability for the empty compatability
classes like CPMutableArray

Conflicts:

	Foundation/CPAttributedString.j
	Foundation/CPSet.j
2009-05-30 13:42:57 -07:00
Ross Boucher 5f5efffe9d A few updates in preparation of the new media panel 2009-05-30 13:41:48 -07:00
Ross Boucher 48f31743dd Update to docs of replaceCharactersInRange in CPAttributedString.
Conflicts:

	Foundation/CPAttributedString.j
2009-05-30 13:41:18 -07:00
Tom Robinson 1224ca9493 Rename plutil back to cputil. Oops. 2009-05-29 18:28:06 -07:00
Tom Robinson 45ec895df0 Fixed incorrect variables in regexp-rhino-patch 2009-05-29 17:12:12 -07:00
Tom Robinson 318d0456af Merge branch 'master' of git@github.com:280north/cappuccino 2009-05-29 16:58:00 -07:00
Tom Robinson 5446e1f98f Bring back the Rhino regex patch to use native Java regex. 2009-05-29 16:57:28 -07:00
Francisco Ryan Tolmasky I d4b9c4c5e1 Merge branch 'master' of git@github.com:280north/cappuccino 2009-05-27 01:35:26 -07:00
Francisco Ryan Tolmasky I 5cb9f5f7c2 Fix for Unicode chars being mangled when building.
Closes #146.

Reviewed by me.
2009-05-27 01:34:56 -07:00
cacaodevandRoss Boucher a7bd5e1bf0 Allow rake to process files located subfolders of Foundation/ 2009-05-26 23:59:59 -07:00
Francisco Ryan Tolmasky I bf21fbd000 Slight color modification to theme showcase.
Reviewed by me.
2009-05-26 00:30:58 -07:00
Ross Boucher 377107d63a Fix for stringByReplacingOccurrencesOfString: not working with strings that have regex control characters in them. 2009-05-25 16:12:27 -07:00
Francisco Ryan Tolmasky I 25d20df5f3 Merge branch 'master' of git@github.com:280north/cappuccino 2009-05-25 15:29:41 -07:00
Francisco Ryan Tolmasky I cfdb6b0df2 Further work on theme showcase.
Reviewed by me.
2009-05-25 15:29:17 -07:00
tlrobinson 9955346958 When loading modules escape "+" in case they're converted to spaces later.
Updated to latest Narwhal and Jack
2009-05-25 15:22:07 -07:00
Francisco Ryan Tolmasky I a71822cee8 Added Demos, Aristo, and WebSite to .gitignore so they can be checked out together and eventually built together.
Reviewed by me.
2009-05-24 16:09:02 -07:00
Francisco Ryan Tolmasky I 3523a9ff12 Organized BlendKit classes into their own files and added licensing info.
Reviewed by me.
2009-05-24 15:00:14 -07:00
Francisco Ryan Tolmasky I 1f64cb6393 Merge branch 'master' of git@github.com:280north/cappuccino 2009-05-24 14:20:44 -07:00
Francisco Ryan Tolmasky I 0235076fb6 Fix for typos in CPButton.j.
Closes #139.

Reviewed by me.
2009-05-24 14:20:18 -07:00
Ross Boucher c56e552d6e Merge branch 'master' of git@github.com:280north/cappuccino 2009-05-24 13:43:44 -07:00
Ross Boucher 5a3f1c81a0 Add open panel beginnings 2009-05-24 13:43:23 -07:00
Francisco Ryan Tolmasky I 25c145e490 Fix Info.plist name for Aristo blend.
Reviewed by me.
2009-05-24 12:49:25 -07:00
Francisco Ryan Tolmasky I 44dc4f6595 Fix for scroll wheel not working in Firefox 3 and up.
Closes #102.

Reviewed by me.
2009-05-24 12:45:51 -07:00
Ross Boucher d3938f3031 Merge branch 'master' of git@github.com:280north/cappuccino 2009-05-23 17:28:55 -07:00
Ross Boucher cfa21b0c96 Add a randomColor method. Useful for debugging. 2009-05-23 17:28:21 -07:00
Francisco Ryan Tolmasky I 83bceaa867 Fix for HUD button misrendered in Aristo theme gallery until pressed for first time.
Closes #141.

Reviewed by me.
2009-05-23 13:04:29 -07:00
Francisco Ryan Tolmasky I f6a731ff91 Updated loading page and removed some unused resources from Aristo blend.
Reviewed by me.
2009-05-23 12:55:20 -07:00
Francisco Ryan Tolmasky I 354fddf6b2 Updated template theme project to use new theme gallery.
Reviewed by me.
2009-05-23 12:43:35 -07:00
Francisco Ryan Tolmasky I aebbdbe0a3 Fixed a few graphics bugs and made the automatically generated theme gallery nicer.
Reviewed by me.
2009-05-23 12:33:24 -07:00
Francisco Ryan Tolmasky I 15bff97388 Fix for MainMenu.cib not displaying images.
Closes #140.

Reviewed by me.
2009-05-22 03:23:08 -07:00
Francisco Ryan Tolmasky I ffab4bdf56 README/Download fix.
Reviewed by me.
2009-05-21 16:38:59 -07:00
Francisco Ryan Tolmasky I fff40499cc Fix for CPPopUpButton being broken in nib2cib.
Reviewed by me.
2009-05-21 14:11:21 -07:00
Francisco Ryan Tolmasky I 0b24bf8fe8 Automate NibApplication for Starter package.
Reviewed by me.
2009-05-20 12:34:14 -07:00
Ross Boucher 429dd80409 updated documentatino for CPTextField 2009-05-20 12:15:55 -07:00
Francisco Ryan Tolmasky I bee5d36fbf Merge branch 'master' of git@github.com:280north/cappuccino 2009-05-20 12:14:39 -07:00
Francisco Ryan Tolmasky I 8428edad37 Fix for menus not being clickable until you resize the browser window in NibApplication.
Reviewed by me.
2009-05-20 12:13:54 -07:00
Thomas BalthazarandRoss Boucher 2ba2bb8115 readme file updated (issue tracker + system requirements) 2009-05-20 09:38:55 -07:00
Tom Robinson b8be5d3bf5 Fix zipping to *not* follow symlinks. Breaks narwhal. 2009-05-20 02:05:28 -07:00
Tom Robinson b99ba2c25e Update Starter and Tools READMEs for 0.7 2009-05-20 02:04:35 -07:00
Francisco Ryan Tolmasky I 289a21156c Fix for Tools Rakefile: nib2cib should be built before capp.
Reviewd by me.
2009-05-19 23:53:29 -07:00
Tom Robinson 66ca70acd2 "Save for web" then pngcrush images to prevent color profile problems 2009-05-19 16:08:24 -07:00
Francisco Ryan Tolmasky I 578113d557 Updated version strings on products.
Reviewed by me.
2009-05-19 15:04:25 -07:00
Francisco Ryan Tolmasky I 79c9a2781f Fix for right scrollbar button not showing up completely.
Reviewed by me.
2009-05-19 13:18:00 -07:00
Francisco Ryan Tolmasky I fd7436527d Merge branch '0.7b' of git@github.com:280north/cappuccino into 0.7b 2009-05-19 13:04:29 -07:00
Francisco Ryan Tolmasky I 20f128b9c3 Added easy creation methods for textfields and labels and touched up sizeToFit in CPTextField.
Reviewed by me.
2009-05-19 13:03:41 -07:00
Ross Boucher e6a1370ae5 Update the default cib app to make the window full bridge 2009-05-19 12:48:05 -07:00
Francisco Ryan Tolmasky I 4758154014 Fix for mis-sized sizeToFit in CPButton.
Reviewed by me.
2009-05-19 12:22:15 -07:00
Ross Boucher a7ed62a108 Remove references to NSArray 2009-05-19 12:10:06 -07:00
Francisco Ryan Tolmasky I 8f8e2343a0 Merge branch '0.7b' of git@github.com:280north/cappuccino into 0.7b 2009-05-19 12:03:13 -07:00
Francisco Ryan Tolmasky I 6d8e1705b8 Cleaned up button's sizeToFit.
Reviewed by me.
2009-05-19 12:02:10 -07:00
Ross Boucher a84bc49540 pngcrushed image files 2009-05-19 11:41:59 -07:00
Ross Boucher fe56cbb77f update alerts to 0.7 2009-05-19 10:02:24 -07:00
tlrobinson ac9b6af56a Update browserjs to fix XHR not decoding responseText as UTF-8 2009-05-19 06:40:07 -07:00
tlrobinson 4ff99126d6 In objj module, ensure we read Objective-J as UTF-8 2009-05-19 06:36:41 -07:00
Francisco Ryan Tolmasky I 3e4763df68 Merge branch '0.7b' of git@github.com:280north/cappuccino into 0.7b 2009-05-19 05:37:49 -07:00
Francisco Ryan Tolmasky I f3fdcf327d Scroller fix.
Reviewed by me.
2009-05-19 05:37:03 -07:00
Tom Robinson e5dd36d807 Add --force to capp gen 2009-05-19 05:05:16 -07:00
Francisco Tolmasky ad03ab01e2 Temporary fix for gif/UTF 8 issue.
Reviewed by me.
2009-05-19 04:01:30 -07:00
Francisco Tolmasky be72a3ff47 Allow fully building capp apps with Rake, and added to template Rakefiles.
Reviewed by me.
2009-05-19 03:54:54 -07:00
Francisco Tolmasky d8b2946fb5 Updated themes so Rakefile will build your theme.
Reviewed by me.
2009-05-19 02:48:21 -07:00
Francisco Tolmasky aa3e049565 Merge branch '0.7b' of git@github.com:280north/cappuccino into 0.7b 2009-05-19 00:42:11 -07:00
Francisco Tolmasky bf49d7b766 Fix for intermittent failures with nib2cib and checkboxes.
Reviewed by me.
2009-05-19 00:41:13 -07:00
Ross Boucher b9cbf8274e Make url connection delegate methods optional 2009-05-19 00:35:51 -07:00
Francisco Tolmasky 07ec530442 Fix for repeating checkboxes/radio buttons.
Reviewed by me.
2009-05-19 00:12:36 -07:00
Francisco Tolmasky 12cbbcd485 Fixed some remaining __Product__ references in capp templates.
Reviewed by me.
2009-05-18 23:53:46 -07:00
Francisco Tolmasky d2be23e354 Aristo HUD resources.
Reviewed by me.
2009-05-18 22:58:14 -07:00
Francisco Tolmasky ea1783504d Added HUD to Aristo.
Reviewed by me.
2009-05-18 22:57:39 -07:00
Francisco Tolmasky 8391f593d9 Various unicode fixes.
Reviewed by me.
2009-05-18 21:24:46 -07:00
Francisco Tolmasky dc3ffdff08 Fix for cibed menus not opening.
Closes #94.

Reviewed by me.
2009-05-18 20:18:05 -07:00
Francisco Tolmasky ef6cf18aaa Merge branch '0.7b' of git@github.com:280north/cappuccino into 0.7b 2009-05-18 19:45:08 -07:00
Francisco Tolmasky a31c8891ba Fix for NibApplication template being broken.
Reviewed by me.
2009-05-18 19:44:32 -07:00
Francisco Tolmasky 36b65f3f30 Partial fix for NibApplication no longer containing a valid .cib.
Reviewed by me.
2009-05-18 19:13:08 -07:00
Ross Boucher dff2a5656f Merge branch '0.7b' of git@github.com:280north/cappuccino into 0.7b 2009-05-18 18:55:08 -07:00
Ross Boucher 5507855bee update to default template, doxygen config file 2009-05-18 18:54:30 -07:00
Francisco Tolmasky 7266821eae Some minor theme fixes.
Reviewed by me.
2009-05-18 16:44:07 -07:00
Francisco Tolmasky 27e79c2222 Fix for geming breaking install.
Reviewed by me.
2009-05-18 16:24:05 -07:00
Francisco Tolmasky d3f67947ef Merge branch '0.7b' of git@github.com:280north/cappuccino into 0.7b 2009-05-18 15:58:09 -07:00
Francisco Tolmasky a0cd03caa4 Added config option to capp and default Rakefiles for new projects.
Reviewed by me.
2009-05-18 15:57:39 -07:00
Ross Boucher 850125b8ab Add documentation groups 2009-05-18 15:43:36 -07:00
Ross Boucher 6b9b9b544b Add support for building docs and download files 2009-05-18 14:30:18 -07:00
Francisco Tolmasky 45e3f776cf Fix for quoted params in objj programs.
Reviewed by me.
2009-05-18 13:36:03 -07:00
Ross Boucher 1a00998357 Temporarily disable the gem subrake until it can be repaired 2009-05-18 11:14:13 -07:00
Ross Boucher ac02592c13 Merge branch '0.7b' of git@github.com:280north/cappuccino into 0.7b 2009-05-18 10:41:34 -07:00
Ross Boucher 52d3115ad6 update the doc config to exclude themes 2009-05-18 10:41:11 -07:00
tlrobinson 97492fcb29 Update narwal external to fix arguments grouping 2009-05-18 02:37:17 -07:00
Tom Robinson 1d39235a45 Added support for app: protocol in CPURLConnection, for use with Titanium 2009-05-18 01:07:05 -07:00
Francisco Tolmasky 15dc89fe2f Only build Objective-J gem when installing or creating the tools download.
Reviewed by me.
2009-05-18 00:11:33 -07:00
Ross Boucher e27e4309da Merge branch '0.7b' of git@github.com:280north/cappuccino into 0.7b 2009-05-18 00:09:11 -07:00
Francisco Tolmasky 7f733fdf34 Building Cappuccino apps with rake now automatically nib2cibs all .nibs and .xibs in the project.
Reviewed by me.
2009-05-18 00:02:18 -07:00
Ross Boucher e190ba82b4 Merge branch '0.7b' of git@github.com:280north/cappuccino into 0.7b 2009-05-17 22:31:31 -07:00
Tom Robinson f2f99833a6 Fix absolute path in instal-tools 2009-05-17 22:30:44 -07:00
Ross Boucher 5daf874f6c Merge branch '0.7b' of git@github.com:280north/cappuccino into 0.7b 2009-05-17 21:55:17 -07:00
Ross Boucher 8beb7848a2 Adjust highlight color for CPMenu 2009-05-17 21:54:39 -07:00
Tom Robinson c7313f519f Merge branch '0.7b' of git@github.com:280north/cappuccino into 0.7b 2009-05-17 21:27:00 -07:00
Tom Robinson 43a3e6d984 Add objective-j gem to Tools distro and instal scripts 2009-05-17 21:26:24 -07:00
Ross Boucher 0bafdfd43a Merge branch '0.7b' of git@github.com:280north/cappuccino into 0.7b 2009-05-17 20:59:39 -07:00
Ross Boucher 3fc7b7573d New loading page for Cappuccino templates 2009-05-17 20:58:04 -07:00
Francisco Tolmasky 8fc213a134 Forgot to check in NSMatrix.j
Reviewed by me.
2009-05-17 20:05:40 -07:00
Francisco Tolmasky eb96d48230 Merge branch '0.7b' of git@github.com:280north/cappuccino into 0.7b 2009-05-17 20:04:24 -07:00
Francisco Tolmasky 4ff6590e74 Added support for NSMatrix of radio buttons.
Reviewed by me.
2009-05-17 20:03:36 -07:00
Tom Robinson b8cac31e85 Updated to lastest External repos 2009-05-17 19:50:11 -07:00
Francisco Tolmasky c3d698bcac Merge branch '0.7b' of git@github.com:280north/cappuccino into 0.7b 2009-05-17 18:47:23 -07:00
Francisco Tolmasky 28da8ccacf Prelminary support for radio buttons and checkboxes in nib2cib.
Reviewed by me.
2009-05-17 18:46:28 -07:00
Ross Boucher 00b1d893e2 Merge branch '0.7b' of git@github.com:280north/cappuccino into 0.7b 2009-05-17 16:51:33 -07:00
Ross Boucher 4a1630b7ba Add IE7 compatibility meta tag to new project templates. For now. 2009-05-17 16:50:54 -07:00
Tom Robinson 7ea048f5bd Fix root submodules task and for older versions of git 2009-05-17 15:18:48 -07:00
Ross Boucher bd3895e6c1 make windows not white by default 2009-05-17 13:00:06 -07:00
Ross Boucher 71200ca5f3 Update to the ciruclar slider images 2009-05-16 22:34:33 -07:00
Tom Robinson 00456fe62c Fixed press. Added --platforms option. 2009-05-16 19:42:31 -07:00
Francisco Tolmasky 269b61d6c4 Merge branch '0.7b' of git@github.com:280north/cappuccino into 0.7b 2009-05-16 17:40:18 -07:00
Francisco Tolmasky b23d62190d Further cleanup of encoding/decoding for AppKit classes.
Reviewed by me.
2009-05-16 17:39:22 -07:00
Tom Robinson 113131a2b3 Merge branch '0.7b' of git@github.com:280north/cappuccino into 0.7b 2009-05-16 17:37:47 -07:00
Tom Robinson d4436acea3 Switch browser.js to browserjs. Fix External build problems 2009-05-16 17:37:09 -07:00
Ross Boucher fc581e3d3d Merge branch '0.7b' of git@github.com:280north/cappuccino into 0.7b 2009-05-16 16:51:24 -07:00
Ross Boucher 83cdbec1d3 Fix for broken cgcontext (stroke/fill ellipse) 2009-05-16 16:51:05 -07:00
Francisco Tolmasky 9f237c2d1a Automatically update submodules when building.
Reviewed by me.
2009-05-16 16:21:48 -07:00
Ross Boucher cfed10bbac Add bezier path to appkit.j, fix slight code bug 2009-05-16 16:18:26 -07:00
Francisco Tolmasky 67cfe69f38 Forgot to include these files in the last commit.
Reviewed by me.
2009-05-16 15:55:07 -07:00
Francisco Tolmasky 94f83a92b7 Added Radio and checkbox classes.
Remaining works:
- Fix artwork issue
- nib2cib support

Closes #77.

Reviewed by me.
2009-05-16 15:53:49 -07:00
Francisco Tolmasky 738d9186a6 Merge branch '0.7b-integration' into 0.7b 2009-05-16 15:33:23 -07:00
Francisco Tolmasky 1b494389a6 Fixed crash when selecting "About New Application..." in nib app. About panel still not implemented, but at least it no longer crashes.
Reviewed by me.
2009-05-15 22:33:39 -07:00
Francisco Tolmasky 4588d1db08 Further CPView/CPMenuItem cleanup.
Reviewed by me.
2009-05-15 22:16:15 -07:00
Francisco Tolmasky 8c1f6f3014 CPButton cleanup from residual pre-theme code.
Reviewed by me.
2009-05-15 21:40:11 -07:00
Seth BuntinandRoss Boucher abb49664f9 add prefix arg to 'rake install' 2009-05-15 14:55:58 -07:00
Ross Boucher c0fc298082 Update the new app template. 2009-05-15 12:30:17 -07:00
Ross Boucher 32af35492d Style fix. 2009-05-15 11:49:33 -07:00
Martin HäckerandRoss Boucher ad58952a32 Allows to leave of the suffix .cib from the filenames of cib files (just like cocoa does and states in the documentation). 2009-05-15 11:47:43 -07:00
Ross Boucher e05816419e Some documentation enhancements. 2009-05-14 22:48:42 -07:00
Ross Boucher 3b0feec801 Closes 113. 2009-05-14 22:16:06 -07:00
Ross Boucher 688fd5725d Missing scroller images. 2009-05-14 22:10:02 -07:00
Ross Boucher 9c7f07979b Add CPBezierPath, clean up some of CGPath and CGContext 2009-05-14 19:06:58 -07:00
Ross Boucher 22f7985d20 Fix for unicode characters being screwed up by shrinksafe 2009-05-14 16:39:36 -07:00
Ross Boucher 675b9df44c fix usage printout for nib2cib 2009-05-14 11:02:55 -07:00
tlrobinson af0b06ff28 Merge branch '0.7b' of git@github.com:280north/cappuccino into tlr0.7b 2009-05-13 18:40:20 -07:00
Ross Boucher a71a984a03 Accidentally committed logs to CPSegmentedContorl 2009-05-13 18:28:18 -07:00
Ross Boucher f4231dd890 Fix for closing an already not visible window causing app to break. 2009-05-13 18:19:41 -07:00
tlrobinson cfaf2d26a5 Update jack submodule 2009-05-13 17:58:47 -07:00
tlrobinson 43197b3099 Update capp to use CAPP_BUILD if present, falling back to STEAM_BUILD, erroring if neither. 2009-05-13 17:57:00 -07:00
tlrobinson 3c30a2fc3d Merge commit 'origin/0.7b' into tlr0.7b 2009-05-13 17:51:24 -07:00
Ross Boucher 4c31b25110 A couple minor segmented control changes. Still needs work. 2009-05-13 12:46:18 -07:00
Ross Boucher a5ef85c676 Mistake 2009-05-13 11:48:22 -07:00
Ross Boucher b747cd339a Closes 123. 2009-05-13 11:33:44 -07:00
Ross Boucher 8e7ce7c814 Merge branch '0.7b' of git@github.com:280north/cappuccino into 0.7b 2009-05-13 11:33:34 -07:00
Thomas BalthazarandRoss Boucher a4b75b0132 CPURLConnection calls didFailWithError instead of didReceiveResponse for successful HTTP responses other than 200 2009-05-12 16:12:07 -07:00
Ross Boucher 453845dd20 Merge branch '0.7b' of git@github.com:280north/cappuccino into 0.7-integration 2009-05-12 16:11:25 -07:00
tlrobinson 33ff286635 Fix "rake install" task 2009-05-11 18:06:49 -07:00
tlrobinson a45c3efa38 Add Jack submodule to External 2009-05-11 18:06:34 -07:00
tlrobinson 0925d41db6 Start migrating press to Narwhal 2009-05-11 16:22:53 -07:00
tlrobinson c63f92d1ea Force symlinks to prevent "File exists" errors 2009-05-11 16:22:28 -07:00
tlrobinson e249937457 Merge branch '0.7b' of git@github.com:280north/cappuccino into tlr0.7b 2009-05-11 16:14:45 -07:00
Francisco Tolmasky 645affad93 Fixed a few issues with nib2cib and hiding scrollers.
Reviewed by me.
2009-05-11 13:45:09 -07:00
Francisco Tolmasky 77c2ab3822 Fix for webview being broken (-window returnign domwindow isntead of cpwindow).
Reviewed by me.
2009-05-11 03:20:05 -07:00
tlrobinson 6aa4940e2b Merge branch '0.7b' of git@github.com:280north/cappuccino into tlr0.7b 2009-05-11 00:04:59 -07:00
Ross Boucher 78ec4046cc bug in nib2cib segmented controls 2009-05-10 21:20:14 -07:00
Ross Boucher 5604fa23a8 Merge branch '0.7b' of git@github.com:280north/cappuccino into 0.7b
Conflicts:
	AppKit/CPSegmentedControl.j
2009-05-10 21:13:23 -07:00
Ross Boucher 41f3146c47 Segmented controls with improved theming and nib2cibing 2009-05-10 21:06:22 -07:00
Francisco Tolmasky e395d6e0e0 Merge branch '0.7b-integration' into 0.7b 2009-05-10 18:46:29 -07:00
Francisco Tolmasky 99c29c5e61 Fix for subclasses not inherting themes, as well as finalizing theme API.
Closes #36.
Closes #109.

Reviewed by me.
2009-05-10 18:44:23 -07:00
Francisco Tolmasky 862af9cbae First stab at fixing Themeing API.
Reviewed by me.
2009-05-10 13:04:02 -07:00
tlrobinson 6c0a281ac2 Remove importClass for java.io.File 2009-05-10 03:56:13 -07:00
tlrobinson dcec480f08 Synced narwhal 2009-05-10 03:40:57 -07:00
tlrobinson 6e11a66cb0 Updated all Rakefiles and tools to work with Narwhal 2009-05-10 03:35:31 -07:00
tlrobinson b31abab595 Sync ojunit 2009-05-10 02:23:01 -07:00
tlrobinson ff23f320ac Add submodules for narwhal, ojtest and browser.js 2009-05-10 01:16:44 -07:00
Ross Boucher 2d55fb3443 Cache CPNumber and CPData class objects 2009-05-09 21:53:21 -07:00
Ross Boucher 9f3a1f1e7e Remove the need to call Function.apply for most objj_msgSends 2009-05-09 21:52:49 -07:00
Ross Boucher a8394baa1a Make debug mode name functions again 2009-05-09 21:52:30 -07:00
Ross Boucher 0533ddcc3e Some fixes for secure text fields in IE 2009-05-08 17:05:22 -07:00
Ross Boucher 2825560c1f keep key view loops established in interface builder 2009-05-08 14:37:31 -07:00
Ross Boucher 1497944eff Removing CPLog's from cibs. 2009-05-08 12:35:17 -07:00
Francisco Ryan Tolmasky I bda437985e Fix for Objective-J build breaking with the removal of resolve_flags.
Closes #117.

Reviewed by me.
2009-05-08 12:07:06 -07:00
Ross Boucher 4f024a0974 Merge branch '0.7b' of git@github.com:280north/cappuccino into 0.7b 2009-05-07 15:59:27 -07:00
Ross Boucher 3d2cf3f6b4 Add segmented controls to Aristo 2009-05-07 15:58:53 -07:00
Francisco Tolmasky 0cd33120cf Fix for Cappuccino no longer being compressed in release builds.
Closes #33.

Reviewed by me.
2009-05-07 00:47:28 -07:00
Francisco Tolmasky c5f4e0a268 Cleanup code for nib2cib.
Reviewed by me.
2009-05-06 23:57:21 -07:00
Ross Boucher aaafb59976 removing comment 2009-05-06 23:55:17 -07:00
Ross Boucher 06e3221c0f Massive hack for VML gradients in 280 Slides.
Conflicts:

	AppKit/CoreGraphics/CGContextVML.j
2009-05-06 23:53:37 -07:00
Francisco Tolmasky 120768c74b Merge branch '0.7b-integration' into 0.7b 2009-05-06 01:37:45 -07:00
Francisco Tolmasky 864c62b6e0 Fix for replacementObjectForKeyedArchiver: not working properly (incorrect decoding class).
Closes #111.

Reviewed by me.
2009-05-06 01:34:00 -07:00
nciagraandRoss Boucher 854d1c0afa CGContextDrawLinearGradient() now works in CGContextVML. 2009-05-05 23:50:06 -07:00
Ross Boucher ae8fd0c2d4 add size to fit for buttons. Closes #34. 2009-05-05 22:10:00 -07:00
Ross Boucher 81d23aafab Fix for broken image resources in Aristo Menus 2009-05-05 21:32:57 -07:00
Ross Boucher 7bc26d5e40 Merge branch '0.7b' of git@github.com:280north/cappuccino into 0.7b 2009-05-05 21:09:34 -07:00
Ross Boucher fedf0ef7ce Fix for highlight state on default menu bar 2009-05-05 21:07:26 -07:00
Francisco Tolmasky bfefe5e80f Merge branch '0.7b' into 0.7b-integration 2009-05-05 14:26:22 -07:00
Francisco Tolmasky f76b14dd83 Fix for rake sometimes not picking up on file changes.
Closes #108.

Reviewed by me.
2009-05-05 14:24:53 -07:00
Ross Boucher 06947ef9d3 Fix for controlTextDidChange not firing. Closes 35. 2009-05-05 13:51:35 -07:00
Ross Boucher 8dc8d6f367 Add an index-debug to the nibapp template 2009-05-05 13:30:50 -07:00
Ross Boucher 31ed6254db Fix for null values in CPJSObjectCreateWithJSON. Closes #19
.
2009-05-05 13:20:35 -07:00
Ross Boucher 88d8a409bb Enable text selection for CPTextField in Internet Explorer 2009-05-05 12:23:36 -07:00
Ross Boucher c976557346 Fixes text field regressions in Firefox and IE 2009-05-05 12:12:17 -07:00
Ross Boucher 6cd92e1278 Force windows to stay within the bounds of the browser window 2009-05-04 21:54:02 -07:00
Ross Boucher dd41c319ee Merge branch '0.7b' of git@github.com:280north/cappuccino into 0.7b 2009-05-04 18:08:16 -07:00
Ross Boucher 0501f12017 Add support for clear color. Closes #60. 2009-05-04 18:07:16 -07:00
Vladimir PouzanovandFrancisco Tolmasky 2176785370 Fix for adding initWithObjectsAndKeys: and dictionaryWithObjectsAndKeys: to CPDictionary.
Made a few minor changes for speed to Vladimir's commit.

Closes #38.

Reviewed by me.
2009-05-03 16:52:56 -07:00
Martin HäckerandFrancisco Tolmasky ad866e44f5 Fix for CPMutableDictionary not existing.
Closes #13.

Reviewed by me.
2009-05-03 16:18:19 -07:00
Thomas BalthazarandFrancisco Tolmasky b28146aa47 Fix for typo in CPTableView.
Reviewed by me.
2009-05-03 16:11:44 -07:00
Francisco Tolmasky 390cf2c16c Fix for MainMenu.cib needing to be loaded manually in cib apps.
Closes #9.

Reviewed by me.
2009-05-02 22:47:42 -07:00
Francisco Tolmasky 586a1e347d Fix for track no longer stretching in vertical sliders.
Closes #8.

Reviewed by me.
2009-05-01 02:00:50 -07:00
Francisco Ryan Tolmasky I 08b4bdada1 Fix for placeholder strings showing up as bullets in CPSecureTextField.
Closes #7.

Reviewed by me.
2009-04-30 16:32:57 -07:00
Francisco Ryan Tolmasky I 0f357c24a7 Fix for Cappuccino sometimes failing to build on Mac OS X.
Thanks to Josh Wilson for tracking this down!

Closes #6.

Reviewed by me.
2009-04-30 13:47:22 -07:00
Francisco Tolmasky f887aca66f Fix for menu bars created in Interface Builder not showing up with nib2cib.
Closes #5.

Reviewed by me.
2009-04-28 09:51:20 -07:00
tlrobinson ff6487caf3 import -> @import in Tests and NibApp 2009-04-27 20:32:59 -07:00
tlrobinson aa146613ac Added missing "var"s to various parts of Objective-J 2009-04-27 19:31:36 -07:00
tlrobinson dadabd899d Improved subrake missing WARNING 2009-04-26 16:34:25 -07:00
Francisco Tolmasky 2f790c6503 Fix for file evaluation showing up as "(anonymous)" in Safari profiler.
Closes #4.

Reviewed by me.
2009-04-23 04:38:59 -07:00
Ross Boucher 120dcdac54 A few changes to the xcode lang spec 2009-04-22 12:21:05 -07:00
Alex KarahaliosandRoss Boucher a95aae22ab Initial commit of Xcode editor integration 2009-04-22 12:05:56 -07:00
Ross Boucher 64010672eb Merge branch '0.7b' of git@github.com:280north/cappuccino into 0.7b 2009-04-22 12:05:10 -07:00
Ross Boucher f9640fb99e Make sliders work with nib2cib again 2009-04-22 12:04:47 -07:00
Francisco Tolmasky 1614855353 Forgot to add this in the last commit. 2009-04-22 11:47:37 -07:00
Francisco Tolmasky f9a1fb8d3f Fix for CPSecureTextField not being in nib2cib.
Closes #2.

Reviewed by me.
2009-04-22 11:20:26 -07:00
Ross Boucher 2e32688ad6 Add support for x-requested-with in CPURLConnection [#231 state:resolved milestone:0.7] 2009-04-19 13:54:01 -07:00
Thomas BalthazarandRoss Boucher b24011cd6c [#262 state:resolved] Typo in CAAnimation 2009-04-19 12:09:15 -07:00
Ross Boucher 1cf40a7d7a Temporary fix for #269 2009-04-17 12:23:31 -07:00
Ross Boucher 6d8d4b59cc Add an opacity slider to the color panel 2009-04-16 22:51:47 -07:00
Ross Boucher f4e329f5de CPSlider was going counter clockwise in circular mode 2009-04-16 20:02:34 -07:00
Francisco Tolmasky 0eb86fd4b6 Removed unecessary _sliderType ivar.
Reviewed by me.
2009-04-16 19:09:56 -07:00
Ross Boucher a284275ffe Update the color panel to use the new attribute name for track-color 2009-04-16 18:09:23 -07:00
Ross Boucher a8317177c6 Typo 2009-04-16 18:07:00 -07:00
Ross Boucher df7fab7e03 Add CPCircularSlider to CPSlider 2009-04-16 17:47:33 -07:00
Ross Boucher 7d0d01211b bug in color panel 2009-04-16 12:18:43 -07:00
Ross Boucher 8b9ae1c1b8 Fix CPTextField + nib2cib 2009-04-15 16:20:39 -07:00
Francisco Tolmasky 844919cfda Combined brightness bar and slider.
Reviewed by me.
2009-04-15 00:57:43 -07:00
Ross Boucher d01bc09b5b Add focus rings for CPTextFields 2009-04-15 00:32:34 -07:00
Ross Boucher e55de4bf8d Missing method in CPResponder 2009-04-14 22:21:45 -07:00
Ross Boucher b6b3e7f492 Make setting initial first responder in IB work 2009-04-14 22:20:22 -07:00
Ross Boucher 4ce0bbe1c0 run recalculateKeyViewLoop automatically when a window is created 2009-04-14 22:10:50 -07:00
Ross Boucher d2b5a7362e support for autorecalculateskeyviewloop 2009-04-14 20:42:44 -07:00
nciagraandRoss Boucher 66e3c90655 Fix for infinite loop in CPView -enclosingMenuItem. 2009-04-14 18:43:36 -07:00
Ross Boucher b508ccab08 Fix placeholder strings with new text field code 2009-04-14 17:04:52 -07:00
Ross Boucher a138e9bde4 Merge branch '0.7b' of git@github.com:280north/cappuccino into 0.7b 2009-04-14 16:19:48 -07:00
Ross Boucher 822a4310cd Add support for key views and tabbing 2009-04-14 16:11:51 -07:00
Francisco TolmaskyandRoss Boucher d0399eb902 Fixed a bug where placeholder state was not updated correctly.
Reviewed by me.
2009-04-14 16:11:51 -07:00
Tom Robinson 86b780aa2e Add Build to gitignore 2009-04-14 15:55:41 -07:00
Ross Boucher db6c70215a Next key view support, plus text field support 2009-04-14 15:40:12 -07:00
Francisco Tolmasky c55e1ac99c Fixed a bug where placeholder state was not updated correctly.
Reviewed by me.
2009-04-14 15:29:37 -07:00
Ross Boucher a60ce80141 Merge branch '0.7b' of git@github.com:280north/cappuccino into 0.7b 2009-04-14 01:32:58 -07:00
Ross Boucher acb1929b49 Add default button style 2009-04-14 01:32:14 -07:00
Francisco Tolmasky 1ab9170a9b Merge branch '0.7b' into 0.7b-integration 2009-04-14 00:26:05 -07:00
Francisco Tolmasky 0e8e725f59 Fix for all ObjJ methods showing up as anonymous functions in Safari profiler.
[#266 state:resolved]

Reviewed by me.
2009-04-14 00:21:16 -07:00
Ross Boucher 0c63a5aba4 Add defaultButton to CPWindow, set up default key bindings 2009-04-13 21:22:32 -07:00
Ross Boucher 831bbef9e1 First take of new CPSecureTextField. Known issues in IE. 2009-04-13 14:33:27 -07:00
Ross Boucher 6b7c610676 Fix a bug in CPColorPanel where the color would jump around on the wheel picker. 2009-04-09 18:01:31 -07:00
Ross Boucher 092a6b922e disabled this performance test for the moment, to fix the build. 2009-04-09 15:07:39 -07:00
Ross Boucher f2ced978c9 methodForSelector: should return the implementation, not the method object (per Cocoa docs). 2009-04-09 15:07:19 -07:00
Ross Boucher 213c70e00d Modify CPAttributedString test to treat undefined and null as equal. I believe it must work this way, worth verifying. 2009-04-09 15:00:00 -07:00
Ross Boucher dc014e9b1d Print the test output if the build fails 2009-04-09 13:18:04 -07:00
Ross Boucher 417f5c3f0f Add failing builds when tests fail 2009-04-09 13:11:41 -07:00
Ross Boucher 5365d1d1fd a few UI tweaks in the color panel 2009-04-07 01:12:02 -07:00
nciagraandRoss Boucher 9c0777991b Added CPMenuBarHighlightColor, CPMenuBarHighlightTextColor and CPMenuBarHighlightTextShadowColor to CPMenuBarAttributes. 2009-04-07 00:54:12 -07:00
nciagraandRoss Boucher c61ba5f050 Added setActivateColor: and setActivateShadowColor: to _CPMenuItemView. 2009-04-07 00:54:03 -07:00
nciagraandRoss Boucher e10445807c Fix for CPTabView not having its bezel drawn before being added as a subview. 2009-04-06 22:26:25 -07:00
nciagraandRoss Boucher 3bc50c1c3b Allow _CPWindowView to set its own toolbarItem labelShadowColor. 2009-04-06 21:19:46 -07:00
Ross Boucher 15b383886e Adding support for shadows in the title bar. 2009-04-05 16:00:42 -07:00
Ross Boucher 91d1ba6713 Additional fix for hasVerticalScroller. 2009-04-05 13:54:10 -07:00
Rich CollinsandRoss Boucher 4cb516d8b1 deref CPImage from dom image to prevent memory leak 2009-04-04 22:44:21 -07:00
nciagraandRoss Boucher ecee86cc6d Added allowsEmptySelection to CPCollectionView. 2009-04-04 22:43:08 -07:00
Thomas BalthazarandRoss Boucher 5500792ed3 [#243 state:resolved] : Error in CPTabView.indexOfTabViewItemWithIdentifier 2009-04-04 22:41:12 -07:00
Ross Boucher 51b0231f68 Cached +color returned colors so we create fewer objects in most apps. 2009-04-04 22:34:59 -07:00
Ross Boucher b55140d50a Add isEqual: to CPColor. 2009-04-04 22:34:42 -07:00
Ross Boucher 43af999d41 Add autoscroll: support to CPView, CPClipView, and the dragging server (which may not be generic enough) 2009-04-04 22:16:24 -07:00
Jesse RossandRoss Boucher 64b41ffb8e Added initial documentation for CPFlashMovie 2009-04-04 16:13:19 -07:00
Ross Boucher 0e8bf56284 Removing git submodules. 2009-04-04 16:10:54 -07:00
Ross Boucher f2c9719c23 Merge branch '0.7b' of git@github.com:280north/cappuccino into 0.7 2009-04-04 15:44:25 -07:00
Ross Boucher fb3ddb035c Typo in objj_dictionary exposes accidental global. 2009-04-04 15:43:52 -07:00
Francisco Tolmasky 390208d16a Fixed a bug where registerForDraggedTypes: replaced current drag types instead of appending to them.
Reviewed by me.
2009-03-27 17:32:53 -07:00
Ross Boucher 4963f8401a Merge branch '0.7b' of git@github.com:280north/cappuccino into 0.7 2009-03-27 17:02:21 -07:00
Francisco Tolmasky 9ce20d50ac Fix for drag and drop being broken.
Reviewed by me.
2009-03-27 15:29:53 -07:00
Ross Boucher 717781655f Support CPImageOverlaps mode for _CPImageAndTextView 2009-03-27 11:27:08 -07:00
Tom Robinson 4ffed5edf2 CPTableView binary search fixes 2009-03-26 17:35:52 -07:00
Francisco Tolmasky 21ab1b7e06 Textfields are a little better -- still more work required for Firefox/IE.
Reviewed by me.
2009-03-26 13:17:26 -07:00
tlrobinson e07c98b418 nib2cib NSColor colorspace 3 and 4 fix 2009-03-26 12:54:46 -07:00
Ross Boucher 20eaf1455d Change the color panel to use the standard window theme. 2009-03-26 02:14:47 -07:00
Ross Boucher 6e75a13a90 Print detailed usage on capp 2009-03-25 21:03:47 -07:00
tlrobinson d970bd5830 Update ojunit 2009-03-25 18:19:32 -07:00
tlrobinson 2652ece827 Submodules task and subrake check 2009-03-25 18:17:14 -07:00
tlrobinson 5b95ff5ff3 Added ojunit as a submodule 2009-03-25 17:02:29 -07:00
Ross Boucher 50ed22c63c [#247 state:resolved milestone:0.7] 2009-03-25 02:59:53 -07:00
Ross Boucher e0af565824 [#218 state:resolved milestone:0.7] 2009-03-25 02:56:53 -07:00
Ross Boucher b96285a56c Merge branch '0.7b' of git@github.com:280north/cappuccino into 0.7 2009-03-25 02:52:55 -07:00
Ross Boucher 49accf9fc8 Fix for CPAttributedString bug #245 [#245 state:resolved milestone:0.7] 2009-03-25 02:51:54 -07:00
Tom RobinsonandRoss Boucher 932aa87d87 Cleanup of shell scripts, change shebang to bash, etc 2009-03-25 02:51:54 -07:00
Tom Robinson c1c5c67b36 Merge branch '0.7b' of git@github.com:280north/cappuccino into 0.7b 2009-03-25 02:35:18 -07:00
Tom Robinson a5a622cf92 Cleanup of shell scripts, change shebang to bash, etc 2009-03-25 02:34:34 -07:00
stephenandRoss Boucher f04a199f4c Documentation for CPAttributedString 2009-03-25 01:37:43 -07:00
Ross Boucher 70da3e287d Replace removed __Product__. 2009-03-25 01:35:47 -07:00
Ross Boucher 57d0e12b1f Merge branch '0.7b' of git@github.com:280north/cappuccino into 0.7 2009-03-25 01:16:08 -07:00
Tom RobinsonandRoss Boucher e2eefe350d require rubygems in case it isn't automatically 2009-03-25 00:59:08 -07:00
Tom RobinsonandRoss Boucher e5b0094f7d Remove unecessary header.txt reference 2009-03-25 00:59:08 -07:00
Tom RobinsonandRoss Boucher 3fe872c125 Delete old blend and nib2cib directories 2009-03-25 00:59:08 -07:00
Tom Robinson 3739710fba require rubygems in case it isn't automatically 2009-03-25 00:57:23 -07:00
Ross Boucher 65593c5200 Update styles for noscript section of index.html 2009-03-25 00:57:10 -07:00
Tom Robinson 46cc218694 Remove unecessary header.txt reference 2009-03-25 00:56:45 -07:00
Tom Robinson c08ec3e52a Delete old blend and nib2cib directories 2009-03-25 00:56:01 -07:00
Nabil ElisaandRoss Boucher 9420c22298 changed Javascript to JavaScript in all natural-language references. 2009-03-25 00:11:06 -07:00
Nabil ElisaandRoss Boucher a05e116ceb see issue #114 2009-03-25 00:10:56 -07:00
Tom Robinson 99b04827d1 Fix for renamed header.txt in Objective-J 2009-03-24 21:28:15 -07:00
Francisco Tolmasky 40027c2266 Fix for case sensitive issues with Ubuntu.
Reviewed by me.
2009-03-24 14:52:59 -07:00
Francisco Ryan Tolmasky I 6db2aa5354 Fix for capp not respecting '-f' option.
Reviewed by me.
2009-03-22 20:41:03 -07:00
Francisco Ryan Tolmasky I 9d8a4f14e3 Merge branch '0.7b' of git@github.com:280north/cappuccino into tolmasky 2009-03-22 20:31:26 -07:00
Francisco Ryan Tolmasky I 6b1180caa4 Added principal_class support to Rake task. Fixed loading bundles with new platform-aware code.
Reviewed by me.
2009-03-22 20:30:31 -07:00
Francisco Tolmasky e5ea6b242d Fixed Aristo affecting unbordered pop up buttons.
Reviewed by me.
2009-03-22 12:40:06 -07:00
Francisco Tolmasky 0638de200b Use visibleFrame for full bridge windows, not contentBounds.
Reviewed by me.
2009-03-22 12:20:18 -07:00
nciagraand280 North, Inc. 8dc6500649 Fix for setting toolbar on bridge window losing its origin.
Signed-off-by: 280 North, Inc. <admin+280north@280north.com>
2009-03-23 02:47:25 +08:00
nciagraand280 North, Inc. bb2697a1d8 Fix to make CPMenuItem send itself as the sender with its action.
Signed-off-by: 280 North, Inc. <admin+280north@280north.com>
2009-03-23 02:47:24 +08:00
Francisco Ryan Tolmasky I 65d9df9c54 Removed stray Application folder in NibApplication template.
Reviewed by me.
2009-03-22 11:35:05 -07:00
Francisco Ryan Tolmasky I 14d91c6bec Added bundle type to BlendKit.
Reviewed by me.
2009-03-22 08:16:09 -07:00
Francisco Ryan Tolmasky I 3bd28b28ab Fixed nib2cib importing of external custom frameworks and added bundle types.
Reviewed by me.
2009-03-22 08:12:54 -07:00
Francisco Ryan Tolmasky I f1601d01ea Got rid of ant specific jars that we no longer needs.
Reviewed by me.
2009-03-21 18:46:05 -07:00
Francisco Ryan Tolmasky I c27cc7ddf1 Building should be significantly faster.
Reviewed by me.
2009-03-21 18:23:27 -07:00
Francisco Ryan Tolmasky I f58940d92d Fixed a bug in the build system where Aristo would sometimes not build on the first run.
Reviewed by me.
2009-03-21 17:03:16 -07:00
Francisco Tolmasky a1b680b722 Updated README to reflect new build instructions.
Reviewed by me.
2009-03-21 07:42:02 -07:00
Francisco Tolmasky 56364d187a Deleted some remaining build.xml files.
Reviewed by me.
2009-03-21 07:35:02 -07:00
Francisco Tolmasky 0023c5753a Got rid of remaining old ant stuff and added TODO's to current Rakefile.
Reviewed by me.
2009-03-21 07:31:47 -07:00
Francisco Tolmasky 436c466e2d Fixed typos Tools README and updated to reflect new tools.
[#240 state:resolved]

Reviewed by me.
2009-03-21 06:58:35 -07:00
Francisco Tolmasky ffe1f9c7a4 Fix for infinite loop in isHiddenOrHasHiddenAncestors.
[#235 state:resolved]

Reviewed by me.
2009-03-21 06:35:45 -07:00
Francisco Tolmasky 0b4701f96d Made error message a bit better.
Reviewed by me.
2009-03-20 16:58:07 -07:00
Francisco Tolmasky 93ea03972b Added NibApplication template.
Reviewed by me.
2009-03-20 06:19:11 -07:00
Francisco Tolmasky c9fcc22875 Added auto installing of plist gem.
Reviewed by me.
2009-03-20 01:07:44 -07:00
Francisco Tolmasky 32e302b1b6 Got rid of a lot of the old build.xml files.
Reviewed by me.
2009-03-19 21:58:09 -07:00
Francisco Tolmasky 844d8fbe08 Added install task.
Reviewed by me.
2009-03-19 21:45:30 -07:00
Francisco Tolmasky b60a99008e Added READMEs.
Reviewed by me.
2009-03-19 20:03:02 -07:00
Francisco Tolmasky 4c6959191d Added Editors to Tools download.
Reviewed by me.
2009-03-19 18:46:58 -07:00
Francisco Tolmasky 4a50eb2e05 No longer need the NewApplication Tools folder (we simply use capp to generate the app).
Reviewed by me.
2009-03-19 18:26:54 -07:00
Francisco Tolmasky 661fd3446d Added beginnings of downlaods task.
Reviewed by me.
2009-03-19 18:25:25 -07:00
Francisco Tolmasky 02a997e28c Added shorthands:
all
debug
release

clean-debug, cleandebug
clean-release, cleanrelease
clean-all, cleanall

clobber-debug, clobberdebug
clobber-release, clobberrelease
clobber-all, clobberall

Reviewed by me.
2009-03-19 07:17:54 -07:00
Francisco Tolmasky 221b4329c6 Added clean/clobber to current tasks.
Reviewed by me.
2009-03-19 06:54:48 -07:00
Francisco Tolmasky 6930357351 Added clean/clobber to Objective-J.
Reviewed by me.
2009-03-19 06:36:07 -07:00
Francisco Tolmasky 28ebace7c6 Began supporting non-framework bundles in gem. 2009-03-19 04:06:21 -07:00
Tom Robinson 486d0ae25a Reverting AppKit/Info.plist 2009-03-19 03:40:23 -07:00
Tom Robinson 41ba12b1d7 Update press for new build system. Also fixed bug that was supposedly fixed previously (hasOwnProperty) 2009-03-19 03:25:02 -07:00
Tom Robinson b525be4680 Merge branch 'master' of git@github.com:tolmasky/cappuccino into tolmasky 2009-03-19 00:51:57 -07:00
Francisco Tolmasky 87389c7ca6 Began moving over press to new build system.
Reviewed by me.
2009-03-19 00:38:22 -07:00
Francisco Tolmasky f372e7ae11 Beginning to move over bake.
Reviewed by me.
2009-03-19 00:30:14 -07:00
Francisco Tolmasky 018fe182d3 Fixed bug in setting clip view.
Reviewed by me.
2009-03-18 23:48:25 -07:00
Tom Robinson d0b437bc74 Merge branch 'master' of git@github.com:tolmasky/cappuccino into tolmasky 2009-03-18 23:39:04 -07:00
Francisco Tolmasky 50a5abe321 Added Aristo Theme Project.
Reviewed by me.
2009-03-18 23:30:58 -07:00
Francisco Tolmasky 9dcdf84824 Gemed up Objective-J rake stuff.
Reviewed by me.
2009-03-18 23:29:26 -07:00
Francisco Tolmasky 880e4dfb3a Merge branch 'master' into tolmasky
Conflicts:
	AppKit/CPControl.j
	AppKit/CPTextField.j
2009-03-18 17:41:17 -07:00
Francisco Tolmasky c6e266b08f Name changes.
Reviewed by me.
2009-03-18 16:53:00 -07:00
Francisco Tolmasky 3eed879fd2 More name changes.
Reviewed by me.
2009-03-18 16:51:01 -07:00
Francisco Tolmasky 07b6f54990 Name change.
Reviewed by me.
2009-03-18 16:48:44 -07:00
Francisco Tolmasky bd07c5338a Name changes
Reviewed by me.
2009-03-18 16:41:42 -07:00
Francisco Tolmasky 31279a0cdc Fix for copy bug and added capp changes.
Reviewed by me.
2009-03-18 16:37:06 -07:00
Francisco Tolmasky 487bf288e5 Moved all editing modes to one folder.
Reviewed by me.
2009-03-17 19:28:12 -07:00
Francisco Tolmasky ad93ad55cc Fixed some build bugs and moved capp to new build system.
Reviewed by me.
2009-03-17 19:19:08 -07:00
tlrobinson 9e7ca719d8 Merge branch 'master' of git@github.com:280north/cappuccino 2009-03-17 18:38:47 -07:00
tlrobinson b7b0ca40b0 Fixed CPString pathComponents and lastPathComponent to match Cocoa. Added tests. 2009-03-17 18:38:14 -07:00
Francisco Tolmasky 1dcc6db079 Moved BlendKit to new build system.
Reviewd by me.
2009-03-17 00:33:22 -07:00
Francisco Tolmasky 10422caa92 Moved nib2cib to new build system.
Reviewed by me.
2009-03-17 00:22:09 -07:00
Francisco Tolmasky 319127f88a Cleaned up build scripts.
Reviewed by me.
2009-03-16 23:39:16 -07:00
Francisco Tolmasky b4cf1ba041 Added altIncrementValue/setAltIncrementValue:.
Reviewed by me.
2009-03-16 18:07:20 -07:00
Francisco Tolmasky 0a32d13cb0 Support for blends.
Reviewed by me.
2009-03-16 17:00:02 -07:00
Francisco Tolmasky 6d34f53e43 Fix for platform stuff.
Reviewed by me.
2009-03-16 14:50:45 -07:00
Francisco Tolmasky b3cc75fe46 Added significantly improved platform support.
Reviewed by me.
2009-03-16 07:10:42 -07:00
Francisco Tolmasky 409fab31e6 Added beginnings of bundle app.
Reviewed by me.
2009-03-16 00:39:28 -07:00
Francisco Tolmasky df6ec644e9 Started moving blend over.
Reviewed by me.
2009-03-15 19:36:24 -07:00
Francisco Tolmasky 101cf4db2c Further Tools changes.
Reviewed by me.
2009-03-15 15:32:29 -07:00
Francisco Tolmasky 9c3c239162 Added rakefile to cplutil.
Reviewed by me.
2009-03-15 02:54:55 -07:00
Francisco Tolmasky b22d1837be Added cplutil to rake.
Reviewed by me.
2009-03-15 02:54:09 -07:00
Tom Robinson 7ed2efd584 Merge branch 'master' of git@github.com:tolmasky/cappuccino into tolmasky 2009-03-15 02:44:49 -07:00
Francisco Tolmasky eaa9003aea Added common file for rake use.
Reviewed by me.
2009-03-15 02:28:48 -07:00
Francisco Tolmasky 9c4d4ccb70 Started moving build system to rake.
Reviewed by me.
2009-03-15 02:25:23 -07:00
Ross Boucher 9f8ca93a57 Collection views should be selectable by default. 2009-03-13 15:51:54 -07:00
Tom Robinson 3aa97c7e0f Merge branch 'master' of git@github.com:tolmasky/cappuccino into tolmasky 2009-03-12 13:25:43 -07:00
Ross Boucher 38d72bc672 Respect _isSelectable on CPCollectionView 2009-03-10 23:18:43 -07:00
Francisco Ryan Tolmasky I 229d814866 Fix for using unbuilt blend.
Reviewed by me.
2009-03-10 16:06:24 -07:00
Francisco Ryan Tolmasky I 5cc1ef9609 Fix commented code.
Reviewed by me.
2009-03-10 15:26:13 -07:00
Francisco Ryan Tolmasky I 8913ef8929 Make Debug use Debug blend.
Reviewed by me.
2009-03-10 15:25:17 -07:00
Francisco Tolmasky 71ee5f6b4b Java to JS string.
Reviewed by me.
2009-03-10 14:59:59 -07:00
Francisco Tolmasky 07000fd86f Changes.
Reviewed by me.
2009-03-10 14:59:07 -07:00
Ross Boucher 19d26f148f Reverting the tooltip change, fixes bug in CPToolbar. 2009-03-10 11:50:31 -07:00
Francisco Tolmasky 47c20911c3 Updated build stuff.
Reviewed by me.
2009-03-09 16:01:34 -07:00
Francisco Tolmasky a07211253c Making CPThemedAttribute more robust.
Reviewed by me.
2009-03-09 15:07:29 -07:00
Thomas BalthazarandRoss Boucher 2f85a417d6 [#239 state:resolved] : typo in CPNotificationCenter 2009-03-09 11:27:14 -07:00
Francisco Tolmasky ee3b7deb07 Removed old art.
Reviewed by me.
2009-03-08 21:01:14 -07:00
Francisco Tolmasky 2664e30a8b A number of changes.
Reviewed by me.
2009-03-08 20:40:11 -07:00
Ross Boucher 3268081d1f CPDictionary should check for isa's before calling isEqual: in isEqualToDictionary: 2009-03-07 21:54:39 -08:00
Ross Boucher 88035429bb Fix in CPString setPlaceholderString
[#238 state:resolved]
2009-03-07 21:05:18 -08:00
Tom Robinson 25c7d98d2c Fix cplutil using "arguments" instead of "args" 2009-03-07 19:35:14 -08:00
Tom Robinson 4422530fe4 Fixed press bug (hasOwnProperty to lookup dependencies) and cleaned up output 2009-03-07 19:34:24 -08:00
Tom Robinson 17b3fc044d Might as well commit these, tolmasky branch is useless without Aristo anyway 2009-03-07 18:16:30 -08:00
Vladimir PouzanovandRoss Boucher bbe1b58437 Added more api docs to CPObject 2009-03-05 14:57:50 -08:00
cacaodevandRoss Boucher 546c95bdf6 Fixed typos in CPArray+KVO ; added suport for *objects:atIndexes: 2009-03-05 14:48:48 -08:00
cacaodevandRoss Boucher faac82287f Fixed bug in previous commit of setToolTip: 2009-03-05 14:46:25 -08:00
Ross Boucher 0fdfd8919f Remove the tabs. 2009-03-05 14:45:34 -08:00
M ESCOandRoss Boucher 55fa6024db Added tooltip support 2009-03-05 14:40:56 -08:00
cacaodevandRoss Boucher a1e3feda4f Fixed typo 2009-03-05 14:39:45 -08:00
Ross Boucher 46a975b966 Updated CPObject's instancesRespondToSelector to return BOOL 2009-03-05 14:30:38 -08:00
stephenandRoss Boucher 0508c54799 Defgroups must go at end of comment otherwise previous obj-j statements
become part of the group name.
2009-03-05 14:21:25 -08:00
stephenandRoss Boucher 89e776281f Added @mainpage for doxygen that simply includes the README and LiCENSE
docs. Also added groups for appkit and foundation classes.
2009-03-05 14:20:39 -08:00
tlrobinson 1188da3c21 Much improved but still unbearable CPTableView 2009-03-02 20:07:52 -08:00
Ross Boucher d81c944e45 minor fix to the objective-j mode. 2009-03-02 15:59:58 -08:00
Ross Boucher 6750b90671 Fixes for some new CPString tests. 2009-02-26 21:30:54 -08:00
Russell MullandRoss Boucher 723c9ae556 improved CPStringTest 2009-02-26 21:00:58 -08:00
Thomas BalthazarandRoss Boucher 1d38ca64c7 ticket 220 fixed http://cappuccino.lighthouseapp.com:80/projects/16499/tickets/220-typo-in-cppopupbutton-indexofitemwithrepresentedobject#ticket-220-1 2009-02-26 17:46:41 -08:00
Leif SingerandRoss Boucher 547ed38855 Modified CPColor's hexToRGB to also accept hex colors with only three characters, as is possible in CSS. E.g., 'ccc' will expand to 'cccccc', etc. 2009-02-26 17:24:34 -08:00
Ross Boucher 8da7b0ee91 Fix some spacing/style issues in CPDate. 2009-02-26 17:21:40 -08:00
Landon FullerandRoss Boucher 1da9e93241 Implement support for UNIX epoch initialization.
Add support for the +[CPDate dateWithTimeIntervalSince1970:]
and -[CPDate initWithTimeIntervalSince1970].
2009-02-26 17:13:37 -08:00
tlrobinson 3200f1c6ca Merge branch 'master' of git@github.com:tolmasky/cappuccino into tolmasky 2009-02-23 20:38:37 -08:00
Francisco Tolmasky a25ffe0899 Temporary fix for webview white background.
Reviewed by me.
2009-02-23 20:34:13 -08:00
Francisco Tolmasky 7b04023f54 bleh.
Reviewed by me.
2009-02-23 19:10:41 -08:00
Ross Boucherandtlrobinson 1c79db2303 Stop propagation for all events, not just single finger ones. 2009-02-22 17:18:15 -08:00
Ross Boucherandtlrobinson b1fc23af08 Make mouseUp work with the "touch" bridge. 2009-02-22 17:18:05 -08:00
Ross Boucherandtlrobinson 4280c3513a Remove the callout from iPhone on touch and hold. 2009-02-22 17:17:51 -08:00
Ross Boucherandtlrobinson 9eab840f37 Add mouse simulation using native touch events 2009-02-22 17:17:42 -08:00
Francisco Tolmasky ce31353a7a Updated menu images.
Reviewed by me.
2009-02-22 02:06:21 -08:00
Francisco Tolmasky f22684b5e8 I need to commit this?
Reviewed by me.
2009-02-22 02:04:47 -08:00
Francisco Tolmasky 12459aae1e Minor changes.
Reviewed by me.
2009-02-22 02:04:00 -08:00
Tom Robinson fd0a0de4b2 Table View "correctly" purge cells 2009-02-22 01:45:38 -08:00
Tom Robinson 0e3ead62fb CPWebView resize fixes (sorta) 2009-02-21 21:57:53 -08:00
Tom Robinson 8b36cddd9c Init _isFullBridge and cast too BOOL in setFullBridge: 2009-02-21 21:56:24 -08:00
Francisco Tolmasky 415e826a73 Major CPScroller nib2cib fixes.
Reviewed by me.
2009-02-21 18:15:37 -08:00
Francisco Tolmasky 6a0958f9c1 Some scroll view nib fixes.
Reviewed by me.
2009-02-21 17:17:29 -08:00
Francisco Tolmasky 2788af6922 Fix for setValue:forThemedAttributeName: not updating display like inControlState:.
Reviewed by me.
2009-02-21 04:31:13 -08:00
Tom Robinson 49e4e8e2fd Auto select scrollbar mode in CPWebView 2009-02-21 01:48:48 -08:00
Tom Robinson 63585dfea6 Merge branch 'master' of git@github.com:tolmasky/cappuccino into tolmasky 2009-02-21 01:34:36 -08:00
Francisco Tolmasky 27035770d7 Fix for adding awakeFromCib.
Reviewed by me.
2009-02-21 01:37:28 -08:00
Tom Robinson f2a70194c8 Merge branch 'master' of git@github.com:tolmasky/cappuccino into tolmasky 2009-02-21 01:23:57 -08:00
Tom Robinson 8bdd8258be CPWebView support for CPScrollView scrollbars 2009-02-21 01:23:08 -08:00
Francisco Tolmasky aa0135515c Forgot to add this file.
Reviewed by me.
2009-02-20 19:01:05 -08:00
Francisco Tolmasky 9a0fe44acc Better placeholder string support.
Reviewed by me.
2009-02-20 15:36:09 -08:00
Francisco Tolmasky b74b382e30 Fix for resize indicator always showing up.
Reviewed by me.
2009-02-20 14:47:34 -08:00
Francisco Tolmasky 180c42b9d5 Added setFullBridge:/isFullBridge.
Reviewed by me.
2009-02-19 22:56:07 -08:00
Tom Robinson ec3dcaa287 Delete the stupid debug.txt file after building documentation. 2009-02-19 04:32:15 -08:00
Tom Robinson ac6260bf0d CPException CPCoding bug fixes 2009-02-19 04:19:22 -08:00
Francisco Tolmasky 1f54d5de0e Some cleanup.
Reviewed by me.
2009-02-18 23:28:13 -08:00
Tom Robinson 2c335e37b0 Merge branch 'master' of git@github.com:tolmasky/cappuccino into tolmasky 2009-02-18 19:45:34 -08:00
Francisco Tolmasky 4afed0067e Fix for CPSlider not encoding/decoding its value correctly.
Reviewed by me.
2009-02-18 19:19:05 -08:00
Tom Robinson 49719a2e8c Merge branch 'master' of git@github.com:tolmasky/cappuccino into tolmasky 2009-02-18 18:43:18 -08:00
Tom Robinson 197bdf8228 CPTableView doubleAction, clickedRow, clickedColumn methods 2009-02-18 18:42:43 -08:00
Tom Robinson 9890fbd57a CPDictionary dictionaryWithJSObject methods 2009-02-18 18:41:43 -08:00
Francisco Tolmasky 72ae296db0 Fix for new textfield encoding/decoding.
Reviewed by me.
2009-02-18 17:16:10 -08:00
Francisco Tolmasky 51ad4b2b06 Further work on CPTextField.
Reviewed by me.
2009-02-18 13:06:56 -08:00
Francisco Tolmasky 80bc3e3455 Typo.
Reviewed by me.
2009-02-18 04:04:45 -08:00
Tom Robinson 0fe9de4f09 Merge branch 'master' of git@github.com:tolmasky/cappuccino into tolmasky 2009-02-18 04:01:12 -08:00
Francisco Tolmasky 958d17831c Fixed remaining reference to CPThemedValue.
Reviewed by me.
2009-02-18 03:52:27 -08:00
Tom Robinson 6b6991bf6a Merge branch 'master' of git@github.com:tolmasky/cappuccino into tolmasky 2009-02-18 03:49:39 -08:00
Tom Robinson bc9b36165c Merge branch 'master' of git@github.com:tolmasky/cappuccino into tolmasky 2009-02-18 03:45:17 -08:00
Tom Robinson 5fdf39edb3 Better Rhino exception messages for objj 2009-02-18 03:44:37 -08:00
Tom Robinson 00c6a8905d Various CPTableView improvements and nib2cib support 2009-02-18 03:43:49 -08:00
Francisco Tolmasky 6ad037e469 Fix for major theme state bug.
Reviewed by me.
2009-02-18 02:22:10 -08:00
Tom Robinson aaa56f7c02 Merge branch 'master' of git@github.com:tolmasky/cappuccino into tolmasky 2009-02-17 17:05:21 -08:00
Francisco Tolmasky f6c0d93c47 Merged from master.
Reviewed by me.
2009-02-17 14:46:40 -08:00
Francisco Tolmasky cd3b5b7cea It's easier if I just commit this.
Reviewed by me.
2009-02-17 14:27:44 -08:00
Francisco Tolmasky 2bdb0575ad == to ===.
Reviewed by me.
2009-02-17 14:23:25 -08:00
Francisco Tolmasky e095b245e2 Fix for resizing scrollviews when scrollers is scrolled all the way down.
Reviewed by me.
2009-02-17 14:08:54 -08:00
Ross Boucher b7f2f315e2 Bugfix for new splitview resze behavior. 2009-02-17 02:37:26 -08:00
Ross Boucher 0bd543b57b Added support for autoresizing inner split view subviews. 2009-02-17 02:37:16 -08:00
Tom Robinson 7c4b1daed6 Merge branch 'master' of git@github.com:tolmasky/cappuccino into tolmasky 2009-02-16 16:16:57 -08:00
Francisco Tolmasky 66203b0685 Fixed a bug where we were posting frame changed notifications before autoresizing -- causing autoresizing to happen in reverse order.
Reviewed by me.
2009-02-16 14:53:51 -08:00
Tom Robinson a5f23035ae Added Frameworks to .gitignore 2009-02-15 22:54:29 -08:00
Tom Robinson 0ff64751e8 Include previous $CLASSPATH in objj's $CLASSPATH 2009-02-15 03:30:05 -08:00
Francisco Tolmasky 670ebee06d A number of Cib improvments.
Reviewed by me.
2009-02-15 01:11:57 -08:00
Francisco Tolmasky 53aadde343 Added class_replaceMethod.
Reviewed by me.
2009-02-15 01:08:44 -08:00
Francisco Tolmasky 699550c879 Fixes to Cib support.
Reviewed by me.
2009-02-13 14:45:18 -08:00
Francisco Tolmasky 58111b3ba1 Better CPTextField, still not completed.
Reviewed by me.
2009-02-13 01:51:34 -08:00
Francisco Tolmasky 44d837c1eb A number of improvements to theming and bug fixes.
Reviewed by me.
2009-02-13 01:48:44 -08:00
Francisco Tolmasky 689dd72363 Fix for typo that broke copying of CPSets.
Reviewed by me.
2009-02-12 19:38:23 -08:00
Francisco Tolmasky 0f34966f43 Updated CPTextField.
Reviewed by me.
2009-02-10 02:41:38 -08:00
Francisco Tolmasky 50baf5fd50 Further improvements.
Reviewed by me.
2009-02-10 01:12:34 -08:00
Ross Boucher 48fb8f00ca Add convenience methods for full screen. 2009-02-09 23:34:49 -08:00
Francisco Tolmasky a30e91052e Removed themability from title and image in CPButton.
Reviewed by me.
2009-02-07 20:21:03 -08:00
Francisco Tolmasky abd86c676b Theming for CPScroller.
Reviewed by me.
2009-02-07 18:38:34 -08:00
Francisco Tolmasky df5f6c692f Additional theme changes.
Reviewed by me.
2009-02-05 21:17:59 -08:00
Ross Boucher 3f410ea688 Add missing _delegate to CAAnimation.j 2009-02-04 23:11:00 -07:00
Ross Boucher c29b5f2fef Use cached math library functions in UUID. 2009-02-04 14:37:48 -07:00
nciagraandRoss Boucher 471f6cb5e5 Added setTitle: accessors to CPAlert. 2009-02-04 14:33:03 -07:00
nciagraandRoss Boucher 1758e18bd2 Added UUID generator method to CPString. 2009-02-04 14:27:30 -07:00
Marc ChungandRoss Boucher 40def352d9 Removing borking characters from CPURLResponse.j 2009-02-04 11:26:33 -07:00
Ross Boucher 0e965f73b7 Return type was incorrect on "center" 2009-02-04 09:17:45 -07:00
Ross Boucher ecaab49c08 In addition to setting the center of a view's frame, now you can query it. 2009-02-04 08:52:18 -07:00
Ross Boucher f671b89da5 Add "setCenter:" to CPView, which takes a point and moves the center of the view's frame to that point. 2009-02-04 08:11:46 -07:00
Francisco Ryan Tolmasky I e4b2988864 Added more customizability.
Reviewed by me.
2009-02-03 22:47:02 -08:00
Francisco Ryan Tolmasky I 8ea3963f62 Fix for typo.
Reviewed by me.
2009-02-02 17:58:15 -08:00
Francisco Ryan Tolmasky I 99b192c4bc Removed Acidentaly committed Frameworks/ 2009-02-02 17:56:18 -08:00
Ross Boucher 94c838dfde Various fixes. 2009-02-02 18:24:06 -07:00
Ross Boucher a9034de9cd Fix for textfield placeholders being completely broken. 2009-02-02 18:16:23 -07:00
Francisco Ryan Tolmasky I 69833f3d72 Fix for circular dependency stuff.
Reviewed by me.
2009-02-02 17:10:12 -08:00
Francisco Ryan Tolmasky I 6671414da5 Added better templating support.
Reviewed by me.
2009-02-02 12:46:21 -08:00
Francisco Ryan Tolmasky I a4a075655d Forgot to add build.xml.
Reviewed by me.
2009-02-02 02:00:27 -08:00
Francisco Ryan Tolmasky I 9aad67ae04 Added create-frameworks to steam, and began adding Templating system.
Reviewed by me.
2009-02-02 01:59:50 -08:00
Francisco Ryan Tolmasky I 63f813d8ad Typo fixes, deprecating, minor fixes to CPSlider.
Reviewed by me.
2009-02-02 00:09:10 -08:00
Francisco Ryan Tolmasky I e35c4b1461 Added setNeedsLayout and layoutSubviews. Changed CPSlider to use them.
Reviewed by me.
2009-02-01 17:36:22 -08:00
Francisco Ryan Tolmasky I 9ec781fb41 Improved support for resources in nib2cib.
Reviewed by me.
2009-02-01 14:51:12 -08:00
Francisco Ryan Tolmasky I 064a554985 Fix for steam build file.
Reviewed by me.
2009-02-01 01:14:36 -08:00
Francisco Ryan Tolmasky I 8aef955c77 Temporary circular dependency fix.
Reviewed by me.
2009-02-01 00:56:49 -08:00
Francisco Ryan Tolmasky I 492f4b6480 First pass at themes in Cappuccino.
Reviewed by me.
2009-02-01 00:19:50 -08:00
nciagraandRoss Boucher 69cf9b34b1 Some refactoring of CPAlert to allow setting window style. 2009-01-29 21:15:52 -08:00
nciagraandRoss Boucher d2b11a9ba4 Updated CPAlert code and window style 2009-01-29 20:51:41 -08:00
nciagraandRoss Boucher 66bbfbbb3c Added verticalMargin accessor to CPCollectionView. 2009-01-29 20:26:22 -08:00
nciagraandRoss Boucher 9295e2436d Fix to automatically reload arguments when they've changed 2009-01-29 13:51:33 -08:00
nciagraandRoss Boucher 615383e665 Possible changeset for [CPApp setArguments:]. Please review 2009-01-29 13:51:25 -08:00
Nicholas SmallandFrancisco Ryan Tolmasky I d1977f148e Added numberOfRows and numberOfColumns to CPCollectionView.
Reviewed by me.
2009-01-29 11:30:53 -08:00
Francisco Ryan Tolmasky I 9d70c6ad9c Removed menu color change until we have a better API to control it.
Reviewed by me.
2009-01-28 23:23:58 -08:00
Francisco Ryan Tolmasky I c8101d481e Fix spacing issues in CPPopUpButton.
Reviewed by me.
2009-01-28 17:20:29 -08:00
Francisco Ryan Tolmasky I 3ac6b3c1fb Fixed it so that pop ups are properly placed over their buttons.
Reviewed by me.
2009-01-28 16:43:24 -08:00
Francisco Ryan Tolmasky I d0db80335b Fixed bug where buttons wouldn't shrink after sizeToFitting.
Reviewed by me.
2009-01-28 12:38:55 -08:00
Francisco Ryan Tolmasky I f0defa1799 Fix for exception in IE with new imageandtextview code.
Reviewed by me.
2009-01-28 00:10:37 -08:00
Francisco Ryan Tolmasky I f73c569f9a Merge branch 'master' of git@github.com:280north/cappuccino 2009-01-27 19:30:44 -08:00
Francisco Ryan Tolmasky I 6819743850 Fix for issues with new pop up menu code.
Reviewed by me.
2009-01-27 19:21:47 -08:00
Francisco Ryan Tolmasky I f28f2c6e8c Performance improvements to pop up menus.
Reviewed by me.
2009-01-27 16:57:46 -08:00
Francisco Ryan Tolmasky I 10b34965bd Added support for cross-browser text shadows in _CPImageAndTextView.
Reviewed by me.
2009-01-27 15:41:32 -08:00
Francisco Ryan Tolmasky I 9e7fd7f74f Began integrating new imageandtextview into CPButton.
Reviewed by me.
2009-01-27 01:06:21 -08:00
Francisco Ryan Tolmasky I b0d5ca2830 Added vertical alignment support to _CPImageAndTextView.
Reviewed by me.
2009-01-26 22:35:01 -08:00
Francisco Ryan Tolmasky I 6273929184 Added -init to CPMenu, which just calls initWithTitle: with empty string.
Reviewed by me.
2009-01-24 09:14:19 -08:00
Francisco Ryan Tolmasky I 9e9266712a Changed _CPImageAndTitleView to _CPImageAndTextView.
Reviewed by me.
2009-01-23 18:01:05 -08:00
Francisco Ryan Tolmasky I 6acb074993 Moved all text and image dom element operations to drawRect:.
Reviewed by me.
2009-01-23 13:59:32 -08:00
Francisco Ryan Tolmasky I 986a8815ff Moved tiling to drawRect: in _CPDOMImageAndTitleView.
Reviewed by me.
2009-01-23 13:18:28 -08:00
Francisco Ryan Tolmasky I add96e9c04 First pass at removing CPTextField from _CPImageAndTitleView.
Reviewed by me.
2009-01-23 12:13:34 -08:00
Francisco Ryan Tolmasky I 289d0cac63 Added close button to standard window look.
Reviewed by me.
2009-01-23 10:10:56 -08:00
Francisco Ryan Tolmasky I 90389996d1 Fixed a DOM protection issue in CPWindow.
Reviewed by me.
2009-01-23 09:59:29 -08:00
Francisco Ryan Tolmasky I d28bfee704 Fix for fonts not working in nib2cib and performance improvement for adding views.
Reviewed by me.
2009-01-22 17:30:56 -08:00
Francisco Ryan Tolmasky I cc32844a9c Fixed a missing DOM protection guard.
Reviewed by me.
2009-01-22 14:40:26 -08:00
Francisco Ryan Tolmasky I 6f3a0bdc55 Fixed a few minor issues in steam.
Reviewed by me.
2009-01-22 13:47:33 -08:00
Ross Boucher 06601ba5df Error in the CPCountedSet archiving code. Removing for now, will reattack later. 2009-01-22 00:46:39 -08:00
Ross Boucher 928be8d8e7 Add CPCountedSet and fix a few CPSet errors. 2009-01-22 00:33:10 -08:00
Rich CollinsandFrancisco Ryan Tolmasky I 7fabb182f1 Fix for typo in CPPopUpButton.
[#189 state:resolved].

Reviewed by me.
2009-01-22 00:18:22 -08:00
Francisco Ryan Tolmasky I 815e12be66 Added support for new tracking in CPTextField and CPImageView.
Reviewed by me.
2009-01-21 15:07:41 -08:00
Francisco Ryan Tolmasky I 7c2e6875c6 Fixed a slight typo.
Reviewed by me.
2009-01-21 11:50:49 -08:00
Francisco Ryan Tolmasky I 8de321c780 Final fix for buttons not working when disabled.
[#188 state:resolved]

Reviewed by me.
2009-01-21 11:43:45 -08:00
Thomas BalthazarandFrancisco Ryan Tolmasky I 99f6492f29 work in progress
Signed-off-by: Francisco Ryan Tolmasky I <francisco@280north.com>
2009-01-22 00:59:35 +08:00
Francisco Ryan Tolmasky I bb135f041a Changed CPArray_KVO.j to CPArray+KVO.j.
Reviewed by me.
2009-01-21 07:27:14 -08:00
Tom Robinson a45869be49 Fixed various press bugs. 2009-01-21 01:45:24 -08:00
Tom Robinson 26b7d5fa8b Removed awful Rhino hack (fixed in Rhino 1.7) https://bugzilla.mozilla.org/show_bug.cgi?id=374918 2009-01-21 01:44:23 -08:00
Tom Robinson 9ef4a92613 Better stack trace reporting in objj 2009-01-21 01:39:34 -08:00
Tom Robinson 86cc38cd69 Rhino now supports DOM properties, but we need to cast to JavaScript string.
Checks type during XML plist serialization.
2009-01-21 01:38:00 -08:00
Tom Robinson 19a4140f7d Better file/line number reporting in stack traces in Rhino 2009-01-21 01:35:52 -08:00
Ross Boucher 62284c9218 Merge branch '280north/master' 2009-01-20 21:38:04 -08:00
Ross Boucher 6291804775 Support, fixes, and tests for KVC array operators. 2009-01-20 20:06:46 -08:00
Ross Boucher 0b05b4b7d8 Add KVC+KVO support for "To Many" keys (i.e. Arrays). 2009-01-20 18:51:10 -08:00
Ross Boucher 490ad97f7b Make stringWithHash: not use sprintf, for performance reasons. 2009-01-20 17:29:27 -08:00
Francisco Ryan Tolmasky I 03ec852804 Fixed a bug where changes in one toolbar affected other toolbars.
Reviewed by rossco.
2009-01-20 13:36:34 -08:00
Francisco Ryan Tolmasky I 1ef0e1c078 Modified executable loader to be much more efficient than just calling objj_import recursively.
Reviewed by me.
2009-01-20 08:26:38 -08:00
Francisco Ryan Tolmasky I b371a73644 Merge branch 'master' of git@github.com:280north/cappuccino 2009-01-19 18:17:30 -08:00
Ross Boucher e859e9efc0 Add additional support for dependent keys, some performance improvements. 2009-01-19 01:42:39 -08:00
Ross Boucher 3b82ef5fde Fix an error where we were casting CPNull to a string, forcing calls to sprintf. 2009-01-19 01:41:38 -08:00
Ross Boucher 17bb6aac05 Fix typo in CPTabView.j 2009-01-19 01:25:54 -08:00
Ross Boucher 44e4af0f02 Experimental support for dependent keys. I say experimental because it slows down KVO by nearly 2x when its used. 2009-01-18 22:09:24 -08:00
Ross Boucher 9d34f3d4e6 Remove dead code, use just in time setter replacement.
Typo fix.

Better way to replace methods, courtesy of Francisco.
2009-01-18 16:55:15 -08:00
Francisco Ryan Tolmasky I e05e8788d6 Fix for CPDocument not opening with file local URLs.
Reviewed by me.
2009-01-17 13:50:37 -08:00
Francisco Ryan Tolmasky I e926aad568 Fixed an issue where local documents could not be opened by Cappuccino's document-apps.
Reviewed by me.
2009-01-17 13:31:07 -08:00
Ross Boucher 0559bac7a9 Minor tweak to the dimensions.
[#124 state:resolved]
2009-01-15 20:27:41 -08:00
Thomas BalthazarandRoss Boucher c2ed5b68a1 solve the problem reported by Ross here :
http://groups.google.com/group/objectivej-dev/msg/02549260a9d66f27
2009-01-15 20:14:39 -08:00
Thomas BalthazarandRoss Boucher 03f1cf8ec4 Patch for : http://cappuccino.lighthouseapp.com/projects/16499/tickets/124-cptextfield-rounded-style-has-incorrect-positioning 2009-01-15 20:12:13 -08:00
Jari BakkenandRoss Boucher cc1a3ee93f Fix for CPArray -removeObjectsAtIndexes: 2009-01-15 19:59:12 -08:00
Jari BakkenandRoss Boucher 869db920a9 Add [CPArrayTest testRemoveObjectsAtIndexes] 2009-01-15 19:58:59 -08:00
Francisco Ryan Tolmasky I 6d27e5d0f8 Added DOM protections to CPControl and CPWebView.
Reviewed by me.
2009-01-14 19:22:34 -08:00
Francisco Ryan Tolmasky I 32372c68cd A few minor adjustments to CPImageView nib support.
Reviewed by me.
2009-01-09 05:33:45 -08:00
Francisco Ryan Tolmasky I fb3c43ef6a Made CPImageView nib2cib compliant.
Reviewed by me.
2009-01-09 04:38:35 -08:00
Francisco Ryan Tolmasky I 0af841cfd4 Added .gitignore.
Reviewed by me.
2009-01-08 18:37:43 -08:00
Francisco Ryan Tolmasky I 4a24923edb Fixed a number of subtle bugs introduced with the last keyed archiver change.
Reviewed by me.
2009-01-08 18:26:12 -08:00
Francisco Ryan Tolmasky I 33cd18e109 Merge branch 'master' of git@github.com:280north/cappuccino 2009-01-07 00:08:12 -08:00
Francisco Ryan Tolmasky I 84f6564cd2 Added CGContextStrokeRoundedRect.
Reviewed by me.
2009-01-07 00:05:54 -08:00
Francisco Ryan Tolmasky I f61a82d0eb Merge branch 'master' of git@github.com:280north/cappuccino 2009-01-06 23:57:34 -08:00
Tom Robinson 88f3186839 Merge branch 'integration' of git@github.com:280north/cappuccino into integration 2009-01-06 23:33:00 -08:00
Francisco Ryan Tolmasky IandTom Robinson 541b73e322 Fixed typos.
Signed-off-by: Tom Robinson <yachttom@gmail.com>
2009-01-07 15:30:33 +08:00
Francisco Ryan Tolmasky IandTom Robinson 89476fb54e Fix for tags not being encoded/decoded in CPMenuItems.
[#132 state:resolved].

Signed-off-by: Tom Robinson <yachttom@gmail.com>
2009-01-07 15:30:32 +08:00
Tom RobinsonandTom Robinson 1a56d10bef Better JSON method names.
Signed-off-by: Tom Robinson <yachttom@gmail.com>
2009-01-07 15:27:27 +08:00
Tom RobinsonandTom Robinson b3c71fef9e Simpler JSON APIs as CPString class/instance methods.
Signed-off-by: Tom Robinson <yachttom@gmail.com>
2009-01-07 15:27:24 +08:00
Francisco Ryan Tolmasky I 6696eca847 Merge branch 'master' of git@github.com:280north/cappuccino 2009-01-06 02:43:11 -08:00
Francisco Ryan Tolmasky I d942ed415b Fix for Dragging can happen across views.
Reviewed by me.
2009-01-05 23:46:57 -08:00
Francisco Ryan Tolmasky I fb7535286c Fixed typos. 2009-01-05 17:26:14 -08:00
Francisco Ryan Tolmasky I 2c51252c09 Fix for tags not being encoded/decoded in CPMenuItems.
[#132 state:resolved].
2009-01-05 17:20:14 -08:00
Francisco Ryan Tolmasky I 6a5bf822ab Fix for setIgnoresMouseEvents: in CPWindow.
[#195 state:resolved].

Reviewed by me.
2009-01-05 01:58:21 -08:00
Francisco Ryan Tolmasky I c6529f6bf7 Minor style changes to nciarga's menu changes.
Reviewed by me.
2009-01-04 16:22:22 -08:00
Francisco Ryan Tolmasky I 481cedb871 Merge branch 'integration' of git@github.com:280north/cappuccino into integration 2009-01-04 15:53:09 -08:00
nciagraand280north 78b84be3fd Further fixes for separator items
Signed-off-by: 280north <admin+280north@280north.com>
2009-01-05 07:50:49 +08:00
Nicholas Smalland280north 3235cfd288 Few fixes for previous menu commits
Signed-off-by: 280north <admin+280north@280north.com>
2009-01-05 07:50:47 +08:00
Nicholas Smalland280north 899db8fe0b Fix for disabled menu items still firing actions
Signed-off-by: 280north <admin+280north@280north.com>
2009-01-05 07:50:40 +08:00
Nicholas Smalland280north 08ba49ed46 Updated all blank key equivalents to nil, which works now
Signed-off-by: 280north <admin+280north@280north.com>
2009-01-05 07:50:34 +08:00
Nicholas Smalland280north 0a8b08ebec Fix for flash view transparency
Signed-off-by: 280north <admin+280north@280north.com>
2009-01-05 07:50:31 +08:00
Nicholas Smalland280north 78503a9380 Fix for disabled menu items still highlighting
Signed-off-by: 280north <admin+280north@280north.com>
2009-01-05 07:50:30 +08:00
Nicholas Smalland280north 67658876d5 Added menu item separators and a + menuBarHeight
Signed-off-by: 280north <admin+280north@280north.com>
2009-01-05 07:50:29 +08:00
Francisco Ryan Tolmasky I d361cffc75 Fixed a typo "_arguments" instead of "_argument".
Reviewed by me.
2009-01-04 15:38:36 -08:00
Francisco Ryan Tolmasky I b9cd78fde9 Added comment explaining the run loop business in CPScrollView.
Reviewed by me.
2009-01-04 15:37:42 -08:00
Francisco Ryan Tolmasky I 42451ece28 Merge branch 'master' into localint 2009-01-04 14:54:01 -08:00
Francisco Tolmaskyand280north f5963ecc30 Fix for CPKeyedArchiver
Signed-off-by: 280north <admin+280north@280north.com>
2009-01-05 06:42:01 +08:00
Francisco Tolmaskyand280north 74e3bfe6ce Fix for _CPCibCustomView
Signed-off-by: 280north <admin+280north@280north.com>
2009-01-05 06:42:00 +08:00
Tom Robinsonand280north 2b455ecfc3 nib2cib/archiving support for CPScrollView, CPScroller, and CPClipView
Signed-off-by: 280north <admin+280north@280north.com>
2009-01-05 06:41:59 +08:00
Tom Robinson a1802ff043 Merge branch 'master' of git@github.com:280north/cappuccino 2009-01-03 21:09:52 -08:00
Tom Robinson 5b7d6e2e1f Fixed "objectForKey:" returning undefined instead of nil.
Reviewed by tolmasky.

[#194 state:resolved responsible:tlrobinson]
2009-01-03 21:08:46 -08:00
Francisco Ryan Tolmasky I ac8ecdb7f3 A number of CPTableView improvements, still not built by default.
Reviewed by me.
2009-01-03 16:16:24 -08:00
Francisco Ryan Tolmasky I 0af5bb05fc Replacing a few instances of Math.min/max with MIN/MAX and == with ===.
Reviewed by me.
2009-01-03 15:44:29 -08:00
Francisco Ryan Tolmasky I 35fc44e183 Fixed convertPoint/rect to work across different windows.
[#193 state:resolved]

Reviewed by me.
2009-01-03 12:14:04 -08:00
Francisco Ryan Tolmasky I aabe06eb3f Fix for adding draggedViewLocation and draggedImageLocatio to CPDraggingInfo.
[#192 state:resolved]

Reviewed by me.
2009-01-03 01:11:06 -08:00
Francisco Ryan Tolmasky I ef7000a29d Fix for menus showing up under modal windows.
[#182 state:resolved].

Reviewed by me.
2008-12-29 17:53:51 -08:00
Francisco Ryan Tolmasky I bec47ec814 Added -objectEnumerator to CPSet.
[#185 state:resolved].

Reviewed by me.
2008-12-29 17:32:03 -08:00
Francisco Ryan Tolmasky I b29dc6052e Further reorg.
Reviewed by me.
2008-12-26 23:54:20 -08:00
Francisco Ryan Tolmasky I 3afd7a9a69 A bit more CPWindow code reorg.
Reviewed by me.
2008-12-26 21:35:10 -08:00
Francisco Ryan Tolmasky I 3305385311 Removed unnecesary code.
Reviewed by me.
2008-12-26 20:38:08 -08:00
Francisco Ryan Tolmasky I ce5cfca43d Fix for tag not being set on button in toolbar.
Reviewed by me.
2008-12-23 01:12:39 -08:00
Francisco Ryan Tolmasky I 08a3b64483 Fix for impropert animationCurve being set.
[#175 state:resolved].
[#176 state:resolved].

Reviewed by me.
2008-12-22 16:37:22 -08:00
Francisco Ryan Tolmasky I 9fa56531c6 Updated nib2cib to support new window styles.
Reviewed by me.
2008-12-22 15:10:20 -08:00
Francisco Ryan Tolmasky I 459316f102 Major Window Fixes/Changes.
[#65 state:resolved].
[#58 state:resolved].
[#94 state:resolved].

Reviewed by me.
2008-12-22 13:53:48 -08:00
Leif SingerandRoss Boucher 554aa77707 CPLogPopup printed [null] as log level; removed. 2008-12-22 12:18:02 -05:00
Ross Boucher 4eb1490d80 Fix for http://cappuccino.lighthouseapp.com/projects/16499/tickets/177-cpapplication-trytoperformwith-causes-infinite-recursion
Not entirely sure this is the correct implementation, but I did fix the two typos and the infinite recursion.

[#177 state:resolved milestone:0.6.5]
2008-12-22 12:14:40 -05:00
Ross Boucher 670efb196e Merge branch 'master' of git@github.com:280north/cappuccino 2008-12-22 11:48:11 -05:00
Ross Boucher 8b68729041 Fix for http://cappuccino.lighthouseapp.com/projects/16499/tickets/60-cpcolorpanel-does-not-update-color-correctly
and for http://cappuccino.lighthouseapp.com/projects/16499/tickets/59-cpcolorpanel-defaults-to-white-on-init

[#59 state:resolved milestone:0.6.5]
[#60 state:resolved milestone:0.6.5]
2008-12-22 11:46:25 -05:00
Francisco Ryan Tolmasky I 3b299aa5b4 Merge branch 'master' of git@github.com:280north/cappuccino 2008-12-19 18:45:57 -08:00
Francisco Ryan Tolmasky I 14f267da47 Fixed a problem in building nib2cib that caused way too many files to end up in the distro.
Reviewed by me.
2008-12-19 18:44:40 -08:00
Tom Robinson 059456571d plist <data> support. NSColor unarchiving for nib2cib. 2008-12-19 00:48:13 -08:00
Tom Robinson f7571f83c8 Better CPLog sprintf integration (only uses sprintf if param 0 is a string and there is more than one param) 2008-12-18 19:23:40 -08:00
Francisco Ryan Tolmasky I bd42a03cf0 Merge branch 'master' of git@github.com:280north/cappuccino 2008-12-18 18:11:24 -08:00
Francisco Ryan Tolmasky I 66c7997ed0 Fix for [CPMenu setMenuBarVisible:NO] being broken.
[#172 state:resolved].

Reviewed by me.
2008-12-18 18:10:52 -08:00
Ross Boucher 9cbefdda28 another typo. silly me. 2008-12-17 18:44:00 -08:00
Ross Boucher 389a44dfc1 typo 2008-12-17 18:39:55 -08:00
Ross Boucher bc30541b9c Add 2 missing methods on CPDictionary.
[#157 state:resolved milestone:0.6.1]
2008-12-17 18:21:29 -08:00
Ross Boucher 8fa5217318 Fix for a few errors francisco noticed. 2008-12-17 18:21:03 -08:00
Ross Boucher 7ad1c68249 incorrect method name 2008-12-17 18:11:23 -08:00
Ross Boucher ef0baea3ad Merge branch 'master' into bindings 2008-12-17 18:09:08 -08:00
Ross Boucher 69b1685280 Fix for http://cappuccino.lighthouseapp.com/projects/16499/tickets/170-appkitcptextfieldj-textfieldbackground-argreturn-types-are-incorrect
[#170 state:resolved milestone:0.6.1]
2008-12-17 18:07:37 -08:00
Bailey CarlsonandRoss Boucher 508e8b04a1 Add CPSet to Foundation. Thanks Bailey and Nabil. 2008-12-17 18:02:17 -08:00
Joubert NelandRoss Boucher 365a5f182c Fixed documentation for dragView: 2008-12-17 16:50:53 -08:00
Ross Boucher bbd632fa34 Add missing method to CPDictionary. 2008-12-17 16:49:31 -08:00
Francisco Ryan Tolmasky I 488078ac04 Merge branch 'master' of git@github.com:280north/cappuccino 2008-12-16 19:44:53 -08:00
Francisco Ryan Tolmasky I a9b57d4187 Fix for +isKindOfClass: and +isMemberOfClass: not being there.
[#171 state:resolved].

Reviewed by me.
2008-12-16 19:43:48 -08:00
Tom Robinson 2d887d0a7e Initial CPSegmentedControl archiving/nib2cib support (currently useless) 2008-12-16 16:43:00 -08:00
Tom Robinson cd9a3a68ec Spurious CPLog 2008-12-16 16:42:21 -08:00
Tom Robinson d73450d8fa CPSplitView fix for more than one splitter 2008-12-15 21:18:36 -08:00
Ross Boucher 5eb7be054e Merge branch 'master' of git@github.com:280north/cappuccino 2008-12-15 18:46:44 -08:00
Ross Boucher 70e1fe5a4b Fix for misplaced ; in CPCompatibility 2008-12-15 18:46:20 -08:00
Francisco Ryan Tolmasky I 75015ce466 Fix for making CPAnimation "pausable".
[#168 state:resolved].

Reviewed by me.
2008-12-15 18:40:33 -08:00
Francisco Ryan Tolmasky I c2b9ebd4b9 Fix for "unkown class NSObject" warnings.
[#166 state:resolved].

Reviewed by me.
2008-12-15 00:48:27 -08:00
Francisco Ryan Tolmasky I 7c117f22a7 Added support for external frameworks in nib2cib.
[#167 state:resolved].

Reviewed by me.
2008-12-15 00:47:42 -08:00
Francisco Ryan Tolmasky I f278de3a8c Fix for adding clean-all.
[#165 state:resolved]

Reviewed by me.
2008-12-15 00:45:47 -08:00
Francisco Ryan Tolmasky I b584f8bc46 Fix for _currentMousePosition errors.
[#163 state:resolved].

Reviewed by me.
2008-12-14 10:50:51 -08:00
Francisco Ryan Tolmasky I b08e98d0ab Fix for item not being ull width in non-integral collection views.
[#164 state:resolved].

Reviewed by me.
2008-12-14 10:49:38 -08:00
Francisco Ryan Tolmasky I de5d83aedd Updated nibs/xibs in NibApp project to be "MainMenu" instead of "HelloWorld" now that nib2cib doesn't always choose "MainMenu.cib".
Reviewed by me.
2008-12-12 20:22:40 -08:00
Francisco Ryan Tolmasky I 0b48863a51 Fix for nib2cib always using MainMenu.cib as output filename.
Reviewed by me.
2008-12-12 20:21:46 -08:00
Francisco Ryan Tolmasky I 5f66874d3e Fix for infinite looping with unterminated msgsends and array literals.
[#161 state:resolved]

Reviewed by me.
2008-12-12 15:59:33 -08:00
Tom Robinson 79ba2af699 Added utilities.js in Objective-J with Base64 encoding/decoding, sprintf moved from CPString. Tests for base64 and sprintf utilities. 2008-12-11 05:23:47 -08:00
Tom Robinson 2aacd3e807 Better xib/nib examples 2008-12-10 23:53:17 -08:00
Tom Robinson 1d2d37334c nib2cib installation fix. 2008-12-10 23:42:21 -08:00
Francisco Ryan Tolmasky I fbf4f426db Merge branch 'master' of git@github.com:280north/cappuccino 2008-12-10 23:41:56 -08:00
Francisco Ryan Tolmasky I 5ecb83aafa Fix for menus in IE.
Reviewed by me.
2008-12-10 23:41:25 -08:00
tlrobinson 77315d0268 Merge branch 'master' of git@github.com:280north/cappuccino 2008-12-10 19:03:03 -08:00
tlrobinson f29be2f69c CPTabView and CPTabViewItem coding and nib2cib support 2008-12-10 19:02:22 -08:00
Francisco Ryan Tolmasky I 4a9f09570e Updated SubEthaEdit syntax mode.
Reviewed by me.
2008-12-10 18:04:18 -08:00
Francisco Ryan Tolmasky I fd46487c82 Updated default bake template.
Reviewed by me.
2008-12-10 16:56:28 -08:00
Francisco Ryan Tolmasky I d92fc8c4d0 Cleaned up old deprecated documentation stuff and added documentation to deploy.
Reviewed by me.
2008-12-10 15:57:31 -08:00
Francisco Ryan Tolmasky I b87493bd5f Merge branch 'master' of git@github.com:280north/cappuccino 2008-12-10 12:06:37 -08:00
Francisco Ryan Tolmasky I 6925bfd416 RemainingBuild change.
Reviewed by me.
2008-12-10 12:06:00 -08:00
Francisco Ryan Tolmasky I 2d9d9f3e93 Fix for timer issue in firefox.
Reviewed by me.
2008-12-10 11:24:19 -08:00
Francisco Ryan Tolmasky I 87f644e5ba Forgot to commit this earlier.
Reviewed by me.
2008-12-09 15:03:41 -08:00
Francisco Ryan Tolmasky I 5c57d241ca Changed an import to @import.
Reviewed by me.
2008-12-09 14:43:18 -08:00
Francisco Tolmasky a966e7520f Added better support for debugging.
Reviewed by me.
2008-12-09 14:08:57 -08:00
tlrobinson f6b3afa75c Various nib2cib conversion improvements (sizes, autoresize, button/window styles, etc) 2008-12-09 02:00:09 -08:00
tlrobinson cfbdb1ce76 nib2cib support for CPMenu, CPMenuItem, CPPopUpButton, including MainMenu support. New test NIBs. 2008-12-09 01:58:42 -08:00
tlrobinson 39ff2b46ab Another fix for non-ASCII characters in NIBs 2008-12-09 01:54:29 -08:00
tlrobinson 29d33193cd bridge.js XMLHttpRequest force UTF-8 encoding to fix nib2cib NIBs w/ non-ASCII characters.
Possibly incorrect assumption, but nothing appears to have broken.
2008-12-09 01:47:39 -08:00
Francisco Tolmasky 5babf3708e Fix for broken steam with new build system.
Reviewed by me.
2008-12-06 15:12:05 -08:00
Francisco Tolmasky ab40761a6c Merge branch 'master' of git@github.com:280north/cappuccino 2008-12-05 20:43:17 -08:00
Francisco Tolmasky cf5fa034b9 Fix for textfields no longer working with new timers -- timers firing before one native run loop has occured.
[#154 state:resolved]

Reviewed by me.
2008-12-05 20:42:12 -08:00
Thomas Robinson 9d6ebf79cd Merge branch 'master' of git@github.com:280north/cappuccino 2008-12-05 19:38:59 -08:00
Thomas Robinson c992b61ca2 Fixed _imageScaling typos 2008-12-05 19:38:18 -08:00
Ross Boucher 3ba2f208d4 Some changes to color pickers to allow you to make your own. 2008-12-05 14:57:50 -08:00
Francisco Tolmasky 462bed7d67 Merge branch 'master' of git@github.com:280north/cappuccino 2008-12-05 09:30:20 -08:00
Francisco Tolmasky d938d39929 Fix for (At least one occurence of) the "empty menu" bug.
Reviewed by me.
2008-12-05 09:29:32 -08:00
Tom Robinson abe2e14af4 CPLog integration with sprintf. 2008-12-04 22:16:24 -08:00
Tom Robinson 3516e026d0 Improved nib2cib support for windows (min/max size, correct autoresize mask, flipped Y coordinate) 2008-12-04 22:13:41 -08:00
Tom Robinson 10db0dab7e Add %b specifier to sprintf for printing in binary. 2008-12-04 22:11:25 -08:00
Tom Robinson e0967272e7 Explicitly set radix to 10 for Ross. 2008-12-04 22:04:41 -08:00
Tom Robinson c0aa78eb76 Make CPColorWell resize correctly, and display immediately upon unarchiving. 2008-12-04 21:58:01 -08:00
Tom Robinson 09d03bf270 Merge branch 'master' of git@github.com:280north/cappuccino 2008-12-04 21:55:53 -08:00
Tom Robinson 6399ac0c95 Fixed CPStringFromRect and CPStringFromPoint 2008-12-04 21:54:50 -08:00
Francisco Tolmasky 2639b7beeb Added "all" target for building both debug and release.
Reviewed by me.
2008-12-04 21:48:00 -08:00
Francisco Tolmasky 062ff28a5c Fixed a few issues with bootstrap.
Reviewed by me.
2008-12-04 17:52:04 -08:00
Francisco Tolmasky d59403cc5b We don't need steam.xml in common.xml.
Reviewed by me.
2008-12-04 17:33:42 -08:00
Francisco Tolmasky 9565ad2cb2 Improvements to the build system.
Reviewed by me.
2008-12-04 16:29:42 -08:00
Francisco Tolmasky 72375fe1cd Fix for CPMenuItem dieing with nil keyEquivalent.
[#153 state:resolved]

Reviewed by me.
2008-12-02 18:25:29 -08:00
Francisco Tolmasky ce696a50f1 Fix for windowShouldClose: being called twice.
[#152 state:resolved]

Reviewed by me.
2008-12-02 18:08:41 -08:00
Thomas Robinson a7a4740c60 Ant task for creating docs ("ant docs") and removed absolute paths from Doxyfile. 2008-12-02 02:10:44 -08:00
Francisco Ryan Tolmasky I d0b52f7118 Replaced some imports with @imports.
Reviewed by me.
2008-11-28 11:28:20 -08:00
Francisco Ryan Tolmasky I a92243314a Fix for using transform() instead of in code calculation when available.
[#148 state:resolved]

Reviewed by me.
2008-11-24 19:42:00 -08:00
Francisco Ryan Tolmasky I 538adfeb61 Merge branch 'master' of git@github.com:280north/cappuccino 2008-11-24 17:03:42 -08:00
Francisco Ryan Tolmasky I 2dc5458e63 Fix for intervals not being clearable after one run.
[#147 state:resolved]

Reviewed by nciagra
2008-11-24 16:49:34 -08:00
Thomas Robinson 043bcc5729 gzip support in steam, removed special "cat" dependency, improved install-tools script 2008-11-21 17:24:11 -08:00
Francisco Ryan Tolmasky I 2ff51a3dbb Further press fix.
Reviewed by me.
2008-11-21 16:04:37 -08:00
Tom RobinsonandFrancisco Ryan Tolmasky I 5d8cea9ed6 Fix for press being broken.
[#143 state:resolved]

Reviewed by tolmasky.
2008-11-21 03:48:19 -08:00
Francisco Ryan Tolmasky I f3dcfbac52 Fix for hiTests always returning true in CPView.
Reviewed by me.
2008-11-20 04:39:22 -08:00
Ross Boucher 952fe0091b Compatibilty update to the whitespace commit. 2008-11-19 16:31:31 -08:00
Rich CollinsandRoss Boucher 6ea22a96ad Fix for line break bug from Rich Collins. 2008-11-19 14:19:48 -08:00
Tom Robinson b4b28cda92 Merge branch 'master' of git@github.com:280north/cappuccino 2008-11-18 20:19:56 -08:00
Tom Robinson db542fa905 objj console fix for missing file/bundle 2008-11-18 20:19:15 -08:00
Francisco Ryan Tolmasky I 30f905a253 Changed imports to @imports.
Reviewed by me.
2008-11-18 20:17:24 -08:00
Francisco Ryan Tolmasky I cc8e6e5820 Merge branch 'master' of git@github.com:280north/cappuccino 2008-11-18 20:13:05 -08:00
Francisco Ryan Tolmasky I 67ee22c6d9 Fix for nib2cib with new timeout system.
Reviewed by me.
2008-11-18 20:12:31 -08:00
Tom Robinson 20830ae349 Merge branch 'master' of git@github.com:280north/cappuccino 2008-11-18 19:42:37 -08:00
Tom Robinson 44b6f8cfc5 Objective-J backtrace prints object hash id 2008-11-18 19:38:33 -08:00
Francisco Ryan Tolmasky I 1be4ba0075 Merge branch 'master' of git@github.com:280north/cappuccino 2008-11-18 19:38:19 -08:00
Francisco Ryan Tolmasky I bbeba1e735 Fix for regression in toolbar copying behavior.
Reviewed by me.
2008-11-18 19:34:42 -08:00
Tom Robinson 3b65f460d6 Simplified stringWithHash 2008-11-18 19:28:55 -08:00
Tom Robinson fbb3959e66 Merge branch 'master' of git@github.com:280north/cappuccino 2008-11-18 18:15:29 -08:00
Francisco Ryan Tolmasky I 663f28e541 Fix for objj in the console.
Reviewed by me.
2008-11-18 18:13:39 -08:00
Tom Robinson 9321084d84 CPTimer semicolon/comma typo 2008-11-18 18:11:09 -08:00
Tom Robinson 7e352676c9 nib2cib null _superview bug fix 2008-11-18 18:10:28 -08:00
Nick TakayamaandFrancisco Ryan Tolmasky I 4c8d7b0f1c Timers.
[#116 state:resolved]

Reviewed by ross and me.
2008-11-18 02:09:35 -08:00
Francisco Ryan Tolmasky I 827e56b23f Merge branch 'master' of git@github.com:280north/cappuccino 2008-11-15 14:57:36 -08:00
Francisco Ryan Tolmasky I 04294cf8b9 Updated SubEthaEdit mode with new syntax additions.
Reviewed by me.
2008-11-15 14:57:05 -08:00
Francisco Ryan Tolmasky I 7f0aa75ba1 Fixed inconsistency in docs.
[#118 state:resolved]

Reviewed by me.
2008-11-15 14:04:08 -08:00
Francisco Ryan Tolmasky I cb7c8046e4 Fix for plist URL encoding instead of HTML entity encoding.
[#81 state:resolved]

Reviewed by me.
2008-11-15 02:57:29 -08:00
Francisco Ryan Tolmasky I ad2bf51fd9 Merge branch 'master' of git@github.com:280north/cappuccino 2008-11-14 17:56:29 -08:00
Francisco Ryan Tolmasky I 26333c3d2b A number of improvements to the parser.
Reviewed by me.
2008-11-14 17:56:04 -08:00
Thomas Robinson cbf51a6127 Removed AppKit from test task until we actually have AppKit tests 2008-11-14 04:16:03 -08:00
Tom Robinson 4dbfe1f23e Make ant test task depend on build task 2008-11-13 21:27:45 -08:00
Tom Robinson ea5221bfda Merge branch 'master' of git@github.com:280north/cappuccino 2008-11-13 21:27:29 -08:00
Ross Boucher ea0c9af0f8 Merge branch 'master' into atrstring 2008-11-13 21:25:52 -08:00
Tom Robinson ba43925f22 "ant test" now tests frameworks in $STEAM_BUILD/Release instead of installed 2008-11-13 21:06:02 -08:00
Tom Robinson e51b1cb7e1 Integrated OJUnit with build scripts ("ant test" runs tests, "ant release" now pulls OJUnit from separate repo) 2008-11-13 20:54:40 -08:00
Ross Boucher d64e55226d Add CPMutableAttributedString 2008-11-13 19:33:48 -08:00
Patrick CrosbyandFrancisco Ryan Tolmasky I 311939ecb9 Fix for indeterminate check in CPProgressIndicator.
[#140 state:resolved]

Reviewed by me.
2008-11-13 16:59:55 -08:00
Francisco Ryan Tolmasky I e1d57aac3b Fix for broken insertObjects:atIndexes: and tests and isEqual.
[#136 state:resolved]

Reviewed by me.
2008-11-13 16:55:33 -08:00
Ross Boucher 102c741ca3 Initial commit of CPAttributedString, and test cases. All test cases currently pass. 2008-11-13 11:23:00 -08:00
Francisco Ryan Tolmasky I 1a8093c314 Fix for minimizer not recognizing a var.
Reviewed by me.
2008-11-13 00:40:40 -08:00
Francisco Ryan Tolmasky I 7d8b02dd96 Fix for addSubview:positioned:relativeTo: not working with view already in the view treey.
Reviewed by me.
2008-11-13 00:21:13 -08:00
Glenn RempeandFrancisco Ryan Tolmasky I 6e15ce0c00 Some updates to NewApplication.
[#137 state:resolved]

Reviewed by me.
2008-11-12 19:24:04 -08:00
Francisco Ryan Tolmasky I 9e8eff4543 Fix for broken resources in DEBUG builds.
[#139 state:resolved]

Reviewed by me.
2008-11-12 18:25:42 -08:00
Thomas Robinson eee0338b63 Build script changes to allow a bootstrapped build with no existing installed tools 2008-11-11 17:55:40 -08:00
Ross Boucher 75bedef465 Merge branch 'master' into atrstring 2008-11-11 13:40:01 -08:00
Francisco Ryan Tolmasky I 8adaa2d3c8 Added CGContextSetAlpha VML implementation for use in IE, and fixed a bug where CGContextCanvas.j and CGContextVML.j were being added to AppKit.sj inappropriately.
Reviewed by me.
2008-11-11 12:21:33 -08:00
Tom Robinson 581a004ed0 Merge branch 'master' of git@github.com:280north/cappuccino 2008-11-11 02:30:44 -08:00
Tom Robinson 88fbecb4d3 Intial CPToolbar coding / nib2cib support (still need CPToolbarItem support) 2008-11-11 02:29:33 -08:00
Tom Robinson ac5c59f8ba Fixed incorrect viewClass/windowClass archiving keys 2008-11-11 02:27:56 -08:00
Ross Boucher add1776125 Fix for local CPURLConnection requests (file:///) 2008-11-10 23:16:29 -08:00
Ross Boucher 937865ef83 There was a missing @end in CPAlert.j 2008-11-10 11:17:39 -08:00
Ross Boucher bf72b5cd13 Merge branch 'master' into atrstring 2008-11-10 10:34:36 -08:00
Ross Boucher 88f12bad93 implement NSString compare:options:range
Thanks to Cacaodev for the ticket and initial stab at this.

[#105 state:resolved milestone:0.6]
2008-11-10 10:29:46 -08:00
Ross Boucher 9b764caf79 Fixes for CPAlert (style, cleanup, and some behavior). 2008-11-10 10:15:35 -08:00
Ross Boucher 56c2b9d755 Revert previous tools commit. 2008-11-10 10:07:50 -08:00
Ross Boucher 814696070d Merge branch 'master' into alert 2008-11-10 09:31:01 -08:00
Brian TaylorandRoss Boucher 0907f287af fix for future installs not overwriting previous installs
[#134 state:resolved milestone:0.6]
2008-11-10 09:29:24 -08:00
Francisco Ryan Tolmasky I 08c1973f11 Merge branch 'master' of git@github.com:280north/cappuccino 2008-11-09 18:51:21 -08:00
Francisco Ryan Tolmasky I 3156de3a5c Fixed bad CPNotificationCenter call.
Reviewed by me.
2008-11-09 18:50:46 -08:00
Tom Robinson 16209b3e3f press --main fix 2008-11-09 16:55:35 -08:00
Sam McDonaldandFrancisco Ryan Tolmasky I 9f9cc4c22c Fix for stringByDeletingLastPathComponent.
[#126 state:resolved]

Reviewed by tolmasky
2008-11-08 13:53:53 -08:00
Francisco Ryan Tolmasky I 9def3ba765 Added error output.
Reviewed by me.
2008-11-08 13:01:13 -08:00
Francisco Ryan Tolmasky I 5d5aa0a4d2 Fix for typo in build.xml.
Reviewed by me.
2008-11-08 12:38:11 -08:00
Tom Robinson edf463ab31 Fixed missing CPTabView and CPFlashView/Movie imports in AppKit.j
[#128 state:resolved responsible:tlrobinson]
2008-11-08 04:39:38 -08:00
Francisco Ryan Tolmasky I 7702fd9929 Merge branch 'master' of git@github.com:280north/cappuccino 2008-11-07 11:30:44 -08:00
Francisco Ryan Tolmasky I eae1dc2568 Fix for setHidden: not working in main menu bar.
[#78 state:resolved]

Reviewed by me.
2008-11-07 11:29:18 -08:00
Francisco Ryan Tolmasky I 204739e220 Merge branch 'master' of git@github.com:280north/cappuccino 2008-11-07 11:07:21 -08:00
Francisco Ryan Tolmasky I 41b3d7987a Hopefully this resolved the issues with isntalling the tools.
[#13 state:resolved]

Reviewed by me.
2008-11-07 11:06:39 -08:00
Francisco Ryan Tolmasky I f5b0542d35 Ugh, two remaining references.
Reviewed by me.
2008-11-07 03:09:37 -08:00
Francisco Ryan Tolmasky I b754d60752 Forgot to take out these references to the old arrow images.
Reviewed by me.
2008-11-07 03:04:56 -08:00
Francisco Ryan Tolmasky I edd49f222e Added a number of customization options to the main menubar.
Reviewed by me.
2008-11-06 00:12:47 -08:00
Francisco Ryan Tolmasky I 6cff27c7bb Fix for minimization in Cappuccino.
[#9 state:resolved]

Reviewed by ross.
2008-11-03 16:57:28 -08:00
Francisco Ryan Tolmasky I 54d48e9292 Fix for minimization in Cappuccino.
Need to figure out licensing for this.

[#9 state:resolved]

Reviewed by rossco.
2008-11-03 16:53:46 -08:00
Francisco Ryan Tolmasky I 07507eac1e Make press create 280North style plists instead of xml plists.
Reviewed by me.
2008-11-02 18:30:08 -08:00
Francisco Ryan Tolmasky I 912895d1ad Added cplutil app to convert between plist types.
Reviewed by me.
2008-11-02 10:42:05 -08:00
Ross Boucher 5823db8319 Fix for bug in CPKeyedArchiver (typo aNuumber). 2008-10-28 18:35:02 -07:00
Tom Robinson b9b109daf0 More comprehensive test XIB 2008-10-28 01:20:12 -07:00
Tom Robinson ed5aa5b54c CPColorWell coding and nib2cib support. 2008-10-28 01:08:07 -07:00
Tom Robinson 1457f5d1c8 Changed deprecated setValues/value to setFloatValue/floatValue. 2008-10-28 01:07:03 -07:00
Tom Robinson e8febcda15 Reverting to previous CPControl/CPSlider event system 2008-10-28 00:56:21 -07:00
Ross Boucher 5c04acf840 Make isEqual: more like Cocoa's version. 2008-10-27 19:27:37 -07:00
Tom Robinson a3ae869f1d Removed CPLogs and an extra performSelectors, cleaned up rest of string literals. 2008-10-27 16:49:18 -07:00
Tom Robinson 7a3fab1d6d Numerous improvements and nib2cib support for CPControl, CPSlider, CPTextField, CPWebView, etc.
Fixed broken @accessors preprocessing.
2008-10-27 04:54:43 -07:00
Francisco Ryan Tolmasky I 745df353c4 Fix for toolbar item's target set to null.
[#115 state:resolved]

Reviewed by me.
2008-10-27 01:51:08 -07:00
Francisco Ryan Tolmasky I f7dd436b81 Stop flash of scrollers when autohidden.
Reviewed by me.
2008-10-27 01:20:23 -07:00
Ross Boucher 80f95e4d58 Fix binary search in CPArray to allow searching for 0. 2008-10-26 23:06:23 -07:00
Ross Boucher 8fcf7581e6 Starting a test class for attributed string. 2008-10-26 14:37:54 -07:00
Francisco Ryan Tolmasky I 12b58cd938 Merge branch 'master' of git@github.com:280north/cappuccino 2008-10-26 00:49:28 -07:00
Francisco Ryan Tolmasky I 5144a5a579 Added @accessor support, @import, and fixed spacing bug with @selector.
Reviewed by ross.
2008-10-26 00:48:49 -07:00
Ross Boucher b5ad11323c Merge branch 'master' into string 2008-10-26 00:16:53 -07:00
Nick TakayamaandRoss Boucher 748d5b84bd ix for bad code in CPArray (incorrect range calculations) 2008-10-25 23:59:04 -07:00
Francisco Ryan Tolmasky I b7bba7dc7f Added @synthesize.
Reviewed by tom.
2008-10-24 17:40:30 -07:00
Nick TakayamaandFrancisco Ryan Tolmasky I 3e6fa883cf Removed Kuler Color Picker from Cappuccino.
Reviewed by tolmasky.
2008-10-24 14:07:14 -07:00
Francisco Ryan Tolmasky I 6f8a6bde62 Whitespace cleanup.
Reviewed by ross.
2008-10-24 13:59:32 -07:00
Francisco Ryan Tolmasky I 75aa1e591a Fix for bad copyright and spacing in NewApplication.
Reviewed by ross.
2008-10-24 13:57:09 -07:00
Ross Boucher 7568d91d28 Add copy method on CPDictionary 2008-10-23 15:36:03 -07:00
Ross Boucher 5023588af4 CPAttributedString necessary additions 2008-10-22 18:54:19 -07:00
Francisco Ryan Tolmasky I 98e5c0ed3e Merge branch 'master' of git@github.com:280north/cappuccino 2008-10-22 18:16:24 -07:00
Francisco Ryan Tolmasky I 2e9e38ebaf Fix for multiline string literals not working in Objective-J.
[#80 state:resolved]

Reviewed by me.
2008-10-22 18:13:44 -07:00
Tom Robinson f34265a864 nib2cib fix for multiple subviews in a Custom View 2008-10-22 18:01:54 -07:00
Tom Robinson cb53db05dc Merge branch 'master' of git@github.com:280north/cappuccino 2008-10-22 17:04:15 -07:00
Tom Robinson 88c64c5071 Temporary fix for lack of <data> tag support in PLISTs (for nib2cib) 2008-10-22 17:03:39 -07:00
Francisco Ryan Tolmasky I abebe2e081 Get rid of this.
Reviewed by me.
2008-10-22 16:33:05 -07:00
Tom Robinson fabd1df4dd Fix for missing debug variable 2008-10-22 16:22:41 -07:00
Tom Robinson abbbc6e8f0 Replaced regex literals with RegExp objects, due to bug [#117] 2008-10-22 16:00:26 -07:00
Tom Robinson a6e4712524 Cleanup of bridge.js. "correct" setTimeout and setInterval implementations. Removed extra code. 2008-10-22 01:04:31 -07:00
Tom Robinson 0798e47459 Cleanup of objj. Fixed bug preventing static code from working. 2008-10-22 01:03:58 -07:00
Tom Robinson 5c6b82c172 Missing headers 2008-10-21 22:28:02 -07:00
Tom Robinson 2c7c53084f Merge branch 'master' of git@github.com:280north/cappuccino 2008-10-21 16:26:55 -07:00
Tom Robinson 04695597b2 Coerce Java string to JS string in "switch" statement (otherwise they don't match) 2008-10-21 16:26:06 -07:00
Tom Robinson 956bc7fe14 Merge branch 'master' into experimental 2008-10-21 16:24:30 -07:00
Francisco Ryan Tolmasky I 75117d77a9 This shouldn't be in there.
Reviewed by me.
2008-10-21 15:59:28 -07:00
Ross Boucher 3190b57ad3 Merge branch 'array' 2008-10-21 15:54:30 -07:00
Ross Boucher 94ea70f4d4 Add binary search of a sorted array. 2008-10-21 15:53:42 -07:00
Tom Robinson d3a0d90ce7 "press" support for flattening to a single JavaScript file, and foundation of intelligent image sprites 2008-10-21 03:42:24 -07:00
Tom Robinson 010fe01265 CPBundle -resourcePath 2008-10-20 21:26:35 -07:00
Ross Boucher f8ee950339 Add a doxygen configuration. If you have doxygen, you should be able to build your own docs with this. 2008-10-20 16:17:29 -07:00
Ross Boucher f7aa5c15c9 New style for documentation (/*! vs. /*).
Enabled doxygen support.

Merge branch 'documentation'

Conflicts:
	AppKit/CPTextField.j
2008-10-20 16:14:09 -07:00
Ross Boucher 17ec9a0cae Add -l option to steam create 2008-10-20 16:05:43 -07:00
Ross Boucher 42a68812a9 Missing import in CPString 2008-10-20 01:56:24 -07:00
Ross Boucher 82f26fbdc0 Fix for an error in the last commit. 2008-10-20 01:17:22 -07:00
Nick TakayamaandRoss Boucher f19793f8a3 add delegate functions to CPTextField and CPControl 2008-10-20 00:57:54 -07:00
Jake MacMullinandRoss Boucher 13940ad38f Added an initial implementation of CPAlert. 2008-10-19 22:12:52 -07:00
Tom Robinson abe4dd7abc sprintf and related functions support for "%@" format specifier 2008-10-19 20:39:04 -07:00
Ross Boucher c6a2d55821 Fix for a broken exception raise in CPToolbar.
THanks terhorst for reporting the issue.

[#102 state:resolved];
2008-10-19 20:35:25 -07:00
Nick TakayamaandRoss Boucher dd56b75bd6 Better behavior for placeholder text in CPTextField.
Primarily from Nick, partially from me.

[#101 state:resolved]
2008-10-19 20:08:24 -07:00
Tom Robinson cd2a66a644 objjc now checks syntax of preprocessed code. 2008-10-18 22:42:16 -07:00
Tom Robinson 32fd299d1d Fixed encoding issue with objj console.
[#108 state:resolved responsible:tlrobinson]
2008-10-18 21:45:05 -07:00
Nick TakayamaandRoss Boucher fc9e5b3a4c implementing CPString compare: so that sorting will work with default selector 2008-10-17 14:43:43 -07:00
Francisco Ryan Tolmasky I 0ac0a84b18 Fix for CPSplitView indents its subviews by frame.origin.
[#106 state:resolved]

Reviewed by me.
2008-10-16 05:39:28 -07:00
Francisco Ryan Tolmasky I dad6d613e6 Merge branch 'master' of git@github.com:280north/cappuccino 2008-10-14 22:26:44 -07:00
Francisco Ryan Tolmasky I fd23867c93 Make sure non-static files store their fragments.
Reviewed  by me.
2008-10-14 22:23:23 -07:00
Ross Boucher 59b7c55ba2 Else protecting dom opacity access. 2008-10-13 20:11:22 -07:00
Ross Boucher 0997042dcd Performance improvement in CPView setAlphaValue: 2008-10-13 19:49:53 -07:00
Ross Boucher 847118c35b Addendum to previous commit.
Thanks to Jake MacMullin for this fix.

[#99 state:resolved]
2008-10-12 21:23:19 -07:00
Jake MacMullinandRoss Boucher 5a086243f5 Implemented missing methods on CPString:
stringByReplacingOccurrencesOfString:target withString:replacement options:options range:searchRange
stringByReplacingCharactersInRange:range withString:replacement

Signed-off-by: Jake MacMullin <jmacmullin@mac.com>
2008-10-12 21:05:56 -07:00
Ross Boucher f228934e54 Initial conversion to Doxygen style comments. 2008-10-12 15:57:01 -07:00
Ross Boucher 5404b0bbfa style guide fix 2008-10-09 23:19:00 -07:00
Ross Boucher c2b1130e23 Fix for setStringValue on CPTextField being broken if first responder.
First commit by Nick Takayama! Thanks!

[#100 state:resolved]
2008-10-09 23:15:18 -07:00
904 changed files with 78269 additions and 24027 deletions
+7
View File
@@ -0,0 +1,7 @@
.DS_Store
Frameworks
Build
Demos
./Aristo
WebSite
.push-package
+65 -41
View File
@@ -20,44 +20,68 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
import "CALayer.j"
import "CPAnimation.j"
import "CPApplication.j"
import "CPButton.j"
import "CPClipView.j"
import "CPCollectionView.j"
import "CPColor.j"
import "CPColorPanel.j"
import "CPColorWell.j"
import "CPCompatibility.j"
import "CPControl.j"
import "CPCookie.j"
import "CPDocument.j"
import "CPDocumentController.j"
import "CPEvent.j"
import "CPFont.j"
import "CPFontManager.j"
import "CPGeometry.j"
import "CPImage.j"
import "CPImageView.j"
import "CPMenu.j"
import "CPMenuItem.j"
import "CPPanel.j"
import "CPPasteboard.j"
import "CPPopUpButton.j"
import "CPProgressIndicator.j"
import "CPResponder.j"
import "CPScroller.j"
import "CPScrollView.j"
import "CPSecureTextField.j"
import "CPSegmentedControl.j"
import "CPShadow.j"
import "CPSlider.j"
import "CPSplitView.j"
import "CPTextField.j"
import "CPToolbar.j"
import "CPToolbarItem.j"
import "CPView.j"
import "CPWebView.j"
import "CPWindow.j"
import "CPWindowController.j"
@import "CALayer.j"
@import "CPAlert.j"
@import "CPAnimation.j"
@import "CPApplication.j"
@import "CPBezierPath.j"
@import "CPBox.j"
@import "CPButton.j"
@import "CPButtonBar.j"
@import "CPCheckBox.j"
@import "CPCib.j"
@import "CPCibConnector.j"
@import "CPCibControlConnector.j"
@import "CPCibLoading.j"
@import "CPCibOutletConnector.j"
@import "CPClipView.j"
@import "CPCollectionViewItem.j"
@import "CPCollectionView.j"
@import "CPColor.j"
@import "CPColorPanel.j"
@import "CPColorWell.j"
@import "CPCompatibility.j"
@import "CPControl.j"
@import "CPCookie.j"
@import "CPCursor.j"
@import "CPDocument.j"
@import "CPDocumentController.j"
@import "CPEvent.j"
@import "CPFlashMovie.j"
@import "CPFlashView.j"
@import "CPFont.j"
@import "CPFontManager.j"
@import "CPGeometry.j"
@import "CPImage.j"
@import "CPImageView.j"
@import "CPMenu.j"
@import "CPMenuItem.j"
@import "CPOpenPanel.j"
@import "CPOutlineView.j"
@import "CPPanel.j"
@import "CPPasteboard.j"
@import "CPPopUpButton.j"
@import "CPProgressIndicator.j"
@import "CPRadio.j"
@import "CPResponder.j"
@import "CPSearchField.j"
@import "CPScrollView.j"
@import "CPScroller.j"
@import "CPSecureTextField.j"
@import "CPSegmentedControl.j"
@import "CPShadow.j"
@import "CPSlider.j"
@import "CPSplitView.j"
@import "CPTabView.j"
@import "CPTableColumn.j"
@import "CPTableView.j"
@import "CPTextField.j"
@import "CPToolbar.j"
@import "CPToolbarItem.j"
@import "CPTreeNode.j"
@import "CPView.j"
@import "CPViewAnimation.j"
@import "CPViewController.j"
@import "CPWebView.j"
@import "CPWindow.j"
@import "CPWindowController.j"
-58
View File
@@ -1,58 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>name</key>
<string>AppKit</string>
<key>Targets</key>
<array>
<dict>
<key>Name</key>
<string>AppKit</string>
<key>Excluded</key>
<array>
<string>CPOutlineView.j</string>
<string>CPTableColumn.j</string>
<string>CPTableView.j</string>
</array>
<key>Flags</key>
<string>-DPLATFORM_DOM</string>
</dict>
<dict>
<key>Name</key>
<string>AppKit-Rhino</string>
<key>Excluded</key>
<array>
<string>CPOutlineView.j</string>
<string>CPTableColumn.j</string>
<string>CPTableView.j</string>
</array>
</dict>
</array>
<key>Configurations</key>
<array>
<dict>
<key>Name</key>
<string>Debug</string>
<key>Flags</key>
<string>-DDEBUG</string>
<key>Settings</key>
<dict>
<key>PREPROCESS</key>
<true/>
</dict>
</dict>
<dict>
<key>Name</key>
<string>Release</string>
<key>Settings</key>
<dict>
<key>PREPROCESS</key>
<true/>
<key>PREINTERPRET</key>
<true/>
</dict>
</dict>
</array>
</dict>
</plist>
+381
View File
@@ -0,0 +1,381 @@
/*
* CPAccordionView.j
* AppKit
*
* Created by Francisco Tolmasky.
* Copyright 2009, 280 North, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
@import <Foundation/CPArray.j>
@import <Foundation/CPObject.j>
@import <Foundation/CPKeyValueObserving.j>
@import <Foundation/CPIndexSet.j>
@import <Foundation/CPString.j>
@import <AppKit/CPView.j>
#import "CoreGraphics/CGGeometry.h"
@implementation CPAccordionViewItem : CPObject
{
CPString _identifier @accessors(property=identifier);
CPView _view @accessors(property=view);
CPString _label @accessors(property=label);
}
- (id)init
{
return [self initWithIdentifier:@""];
}
- (id)initWithIdentifier:(CPString)anIdentifier
{
self = [super init];
if (self)
[self setIdentifier:anIdentifier];
return self;
}
@end
@implementation CPAccordionView : CPView
{
CPInteger _dirtyItemIndex;
CPView _itemHeaderPrototype;
CPMutableArray _items;
CPMutableArray _itemViews;
CPIndexSet _expandedItemIndexes;
}
- (id)initWithFrame:(CGRect)aFrame
{
self = [super initWithFrame:aFrame];
if (self)
{
_items = [];
_itemViews = [];
_expandedItemIndexes = [CPIndexSet indexSet];
[self setItemHeaderPrototype:[[CPButton alloc] initWithFrame:_CGRectMake(0.0, 0.0, 100.0, 24.0)]];
}
return self;
}
- (void)setItemHeaderPrototype:(CPView)aView
{
_itemHeaderPrototype = aView;
}
- (CPView)itemHeaderPrototype
{
return _itemHeaderPrototype;
}
- (CPArray)items
{
return _items;
}
- (void)addItem:(CPAccordionItem)anItem
{
[self insertItem:anItem atIndex:_items.length];
}
- (void)insertItem:(CPAccordionItem)anItem atIndex:(CPInteger)anIndex
{
// FIXME: SHIFT ITEMS RIGHT
[_expandedItemIndexes addIndex:anIndex];
var itemView = [[_CPAccordionItemView alloc] initWithAccordionView:self];
[itemView setIndex:anIndex];
[itemView setLabel:[anItem label]];
[itemView setContentView:[anItem view]];
[self addSubview:itemView];
[_items insertObject:anItem atIndex:anIndex];
[_itemViews insertObject:itemView atIndex:anIndex];
[self _invalidateItemsStartingAtIndex:anIndex];
[self setNeedsLayout];
}
- (void)removeItem:(CPAccordionItem)anItem
{
[self removeItemAtIndex:[_items indexOfObjectIdenticalTo:anItem]];
}
- (void)removeItemAtIndex:(CPInteger)anIndex
{
// SHIFT ITEMS LEFT
[_expandedItemIndexes removeIndex:anIndex];
[_itemViews[anIndex] removeFromSuperview];
[_items removeObjectAtIndex:anIndex];
[_itemViews removeObjectAtIndex:anIndex];
[self _invalidateItemsStartingAtIndex:anIndex];
[self setNeedsLayout];
}
- (void)removeAllItems
{
var count = _items.length;
while (count--)
[self removeItemAtIndex:count];
}
- (void)expandItemAtIndex:(CPInteger)anIndex
{
if (![_itemViews[anIndex] isCollapsed])
return;
[_expandedItemIndexes addIndex:anIndex];
[_itemViews[anIndex] setCollapsed:NO];
[self _invalidateItemsStartingAtIndex:anIndex];
}
- (void)collapseItemAtIndex:(CPInteger)anIndex
{
if ([_itemViews[anIndex] isCollapsed])
return;
[_expandedItemIndexes removeIndex:anIndex];
[_itemViews[anIndex] setCollapsed:YES];
[self _invalidateItemsStartingAtIndex:anIndex];
}
- (void)toggleItemAtIndex:(CPInteger)anIndex
{
var itemView = _itemViews[anIndex];
if ([itemView isCollapsed])
[self expandItemAtIndex:anIndex];
else
[self collapseItemAtIndex:anIndex];
}
- (CPIndexSet)expandedItemIndexes
{
return _expandedItemIndexes;
}
- (CPIndexSet)collapsedItemIndexes
{
var indexSet = [CPIndexSet indexSetWithIndexesInRange:CPMakeRange(0, _items.length)];
[indexSet removeIndexes:_expandedIndexes];
return indexSet;
}
- (void)setEnabled:(BOOL)isEnabled forItemAtIndex:(CPInteger)anIndex
{
var itemView = _itemViews[anIndex];
if (!itemView)
return;
if (!isEnabled)
[self collapseItemAtIndex:anIndex];
else
[self expandItemAtIndex:anIndex];
[itemView setEnabled:isEnabled];
}
- (void)_invalidateItemsStartingAtIndex:(CPInteger)anIndex
{
if (_dirtyItemIndex === CPNotFound)
_dirtyItemIndex = anIndex;
_dirtyItemIndex = MIN(_dirtyItemIndex, anIndex);
[self setNeedsLayout];
}
- (void)setFrameSize:(CGSize)aSize
{
var width = _CGRectGetWidth([self frame]);
[super setFrameSize:aSize];
if (width !== _CGRectGetWidth([self frame]))
[self _invalidateItemsStartingAtIndex:0];
}
- (void)layoutSubviews
{
if (_items.length <= 0)
return [self setFrameSize:_CGSizeMake(_CGRectGetWidth([self frame]), 0.0)];
if (_dirtyItemIndex === CPNotFound)
return;
_dirtyItemIndex = MIN(_dirtyItemIndex, _items.length - 1);
var index = _dirtyItemIndex,
count = _itemViews.length,
width = _CGRectGetWidth([self bounds]),
y = index > 0 ? CGRectGetMaxY([_itemViews[index - 1] frame]) : 0.0;
// Do this now (instead of after looping), so that if we are made dirty again in the middle we don't blow this value away.
_dirtyItemIndex = CPNotFound;
for (; index < count; ++index)
{
var itemView = _itemViews[index];
[itemView setFrameY:y width:width];
y = CGRectGetMaxY([itemView frame]);
}
[self setFrameSize:_CGSizeMake(_CGRectGetWidth([self frame]), y)];
}
@end
@implementation _CPAccordionItemView : CPView
{
CPAccordionView _accordionView;
BOOL _isCollapsed @accessors(getter=isCollapsed, setter=setCollapsed:);
CPInteger _index @accessors(property=index);
CPView _headerView;
CPView _contentView;
}
- (id)initWithAccordionView:(CPAccordionView)anAccordionView
{
self = [super initWithFrame:_CGRectMakeZero()];
if (self)
{
_accordionView = anAccordionView;
_isCollapsed = NO;
var bounds = [self bounds];
_headerView = [CPKeyedUnarchiver unarchiveObjectWithData:[CPKeyedArchiver archivedDataWithRootObject:[_accordionView itemHeaderPrototype]]];
if ([_headerView respondsToSelector:@selector(setTarget:)] && [_headerView respondsToSelector:@selector(setAction:)])
{
[_headerView setTarget:self];
[_headerView setAction:@selector(toggle:)];
}
[self addSubview:_headerView];
}
return self;
}
- (void)toggle:(id)aSender
{
[_accordionView toggleItemAtIndex:[self index]];
}
- (void)setLabel:(CPString)aLabel
{
if ([_headerView respondsToSelector:@selector(setTitle:)])
[_headerView setTitle:aLabel];
else if ([_headerView respondsToSelector:@selector(setLabel:)])
[_headerView setLabel:aLabel];
else if ([_headerView respondsToSelector:@selector(setStringValue:)])
[_headerView setStringValue:aLabel];
}
- (void)setEnabled:(BOOL)isEnabled
{
if ([_headerView respondsToSelector:@selector(setEnabled:)])
[_headerView setEnabled:isEnabled];
}
- (void)setContentView:(CPView)aView
{
if (_contentView === aView)
return;
[_contentView removeObserver:self forKeyPath:@"frame"];
[_contentView removeFromSuperview];
_contentView = aView;
[_contentView addObserver:self forKeyPath:@"frame" options:CPKeyValueObservingOptionOld | CPKeyValueObservingOptionNew context:NULL];
[self addSubview:_contentView];
[_accordionView _invalidateItemsStartingAtIndex:[self index]];
}
- (void)setFrameY:(float)aY width:(float)aWidth
{
var headerHeight = _CGRectGetHeight([_headerView frame]);
// Size to fit or something?
[_headerView setFrameSize:_CGSizeMake(aWidth, headerHeight)];
[_contentView setFrameOrigin:_CGPointMake(0.0, headerHeight)];
if ([self isCollapsed])
[self setFrame:_CGRectMake(0.0, aY, aWidth, headerHeight)];
else
{
var contentHeight = _CGRectGetHeight([_contentView frame]);
[_contentView setFrameSize:_CGSizeMake(aWidth, contentHeight)];
[self setFrame:_CGRectMake(0.0, aY, aWidth, contentHeight + headerHeight)];
}
}
- (void)resizeSubviewsWithOldSize:(CGSize)aSize
{
}
- (void)observeValueForKeyPath:(CPString)aKeyPath
ofObject:(id)anObject
change:(CPDictionary)aChange
context:(id)aContext
{
if (aKeyPath === "frame" && !CGRectEqualToRect([aChange objectForKey:CPKeyValueChangeOldKey], [aChange objectForKey:CPKeyValueChangeNewKey]))
[_accordionView _invalidateItemsStartingAtIndex:[self index]];
/*
else if (aKeyPath === "itemHeaderPrototype")
{
}
*/
}
@end
+316
View File
@@ -0,0 +1,316 @@
/*
* CPAlert.j
* AppKit
*
* Created by Jake MacMullin.
* Copyright 2008, Jake MacMullin.
*
* 11/10/2008 Ross Boucher
* - Make it conform to style guidelines, general cleanup and ehancements
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
@import <Foundation/CPObject.j>
@import <Foundation/CPString.j>
@import <AppKit/CPApplication.j>
@import <AppKit/CPButton.j>
@import <AppKit/CPColor.j>
@import <AppKit/CPFont.j>
@import <AppKit/CPImage.j>
@import <AppKit/CPImageView.j>
@import <AppKit/CPPanel.j>
@import <AppKit/CPTextField.j>
/*
@global
@group CPAlertStyle
*/
CPWarningAlertStyle = 0;
/*
@global
@group CPAlertStyle
*/
CPInformationalAlertStyle = 1;
/*
@global
@group CPAlertStyle
*/
CPCriticalAlertStyle = 2;
var CPAlertWarningImage,
CPAlertInformationImage,
CPAlertErrorImage;
/*!
@ingroup appkit
CPAlert is an alert panel that can be displayed modally to present the
user with a message and one or more options.
It can be used to display an information message \c CPInformationalAlertStyle,
a warning message \c CPWarningAlertStyle (the default), or a critical
alert \c CPCriticalAlertStyle. In each case the user can be presented with one
or more options by adding buttons using the \c -addButtonWithTitle: method.
The panel is displayed modally by calling \c -runModal and once the user has
dismissed the panel, a message will be sent to the panel's delegate (if set), informing
it which button was clicked (see delegate methods).
@delegate -(void)alertDidEnd:(CPAlert)theAlert returnCode:(int)returnCode;
Called when the user dismisses the alert by clicking one of the buttons.
@param theAlert the alert panel that the user dismissed
@param returnCode the index of the button that the user clicked (starting from 0,
representing the first button added to the alert which appears on the
right, 1 representing the next button to the left and so on)
*/
@implementation CPAlert : CPObject
{
CPPanel _alertPanel;
CPTextField _messageLabel;
CPImageView _alertImageView;
CPAlertStyle _alertStyle;
CPString _windowTitle;
int _windowStyle;
int _buttonCount;
CPArray _buttons;
id _delegate;
}
+ (void)initialize
{
if (self != CPAlert)
return;
var bundle = [CPBundle bundleForClass:[self class]];
CPAlertWarningImage = [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPAlert/dialog-warning.png"]
size:CGSizeMake(32.0, 32.0)];
CPAlertInformationImage = [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPAlert/dialog-information.png"]
size:CGSizeMake(32.0, 32.0)];
CPAlertErrorImage = [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPAlert/dialog-error.png"]
size:CGSizeMake(32.0, 32.0)];
}
/*!
Initializes a \c CPAlert panel with the default alert style \c CPWarningAlertStyle.
*/
- (id)init
{
if (self = [super init])
{
_buttonCount = 0;
_buttons = [CPArray array];
_alertStyle = CPWarningAlertStyle;
[self setWindowStyle:nil];
}
return self;
}
/*!
Sets the window appearance.
@param styleMask - Either CPHUDBackgroundWindowMask or nil for standard.
*/
- (void)setWindowStyle:(int)styleMask
{
_windowStyle = styleMask;
_alertPanel = [[CPPanel alloc] initWithContentRect:CGRectMake(0.0, 0.0, 400.0, 110.0) styleMask:styleMask ? styleMask | CPTitledWindowMask : CPTitledWindowMask];
[_alertPanel setFloatingPanel:YES];
[_alertPanel center];
[_messageLabel setTextColor:(styleMask & CPHUDBackgroundWindowMask) ? [CPColor whiteColor] : [CPColor blackColor]];
var count = [_buttons count];
for(var i=0; i < count; i++)
{
var button = _buttons[i];
[button setFrameSize:CGSizeMake([button frame].size.width, (styleMask == CPHUDBackgroundWindowMask) ? 20.0 : 24.0)];
[button setTheme:(_windowStyle === CPHUDBackgroundWindowMask) ? [CPTheme themeNamed:"Aristo-HUD"] : [CPTheme defaultTheme]];
[[_alertPanel contentView] addSubview:button];
}
if (!_messageLabel)
{
var bounds = [[_alertPanel contentView] bounds];
_messageLabel = [[CPTextField alloc] initWithFrame:CGRectMake(57.0, 10.0, CGRectGetWidth(bounds) - 73.0, 62.0)];
[_messageLabel setFont:[CPFont boldSystemFontOfSize:13.0]];
[_messageLabel setLineBreakMode:CPLineBreakByWordWrapping];
[_messageLabel setAlignment:CPJustifiedTextAlignment];
[_messageLabel setAutoresizingMask:CPViewWidthSizable|CPViewHeightSizable];
_alertImageView = [[CPImageView alloc] initWithFrame:CGRectMake(15.0, 12.0, 32.0, 32.0)];
}
[[_alertPanel contentView] addSubview:_messageLabel];
[[_alertPanel contentView] addSubview:_alertImageView];
}
/*!
Sets the window's title. If this is not defined, a default title based on your warning level will be used.
@param aTitle the title to use in place of the default. Set to nil to use default.
*/
- (void)setTitle:(CPString)aTitle
{
_windowTitle = aTitle;
}
/*!
Gets the window's title.
*/
- (CPString)title
{
return _windowTitle;
}
/*!
Gets the window's style.
*/
- (int)windowStyle
{
return _windowStyle;
}
/*!
Sets the receivers delegate.
@param delegate - Delegate for the alert. nil removes the delegate.
*/
- (void)setDelegate:(id)delegate
{
_delegate = delegate;
}
/*!
Gets the receiver's delegate.
*/
- (void)delegate
{
return _delegate;
}
/*!
Sets the alert style of the receiver.
@param style - Alert style for the alert.
*/
- (void)setAlertStyle:(CPAlertStyle)style
{
_alertStyle = style;
}
/*!
Gets the alert style.
*/
- (CPAlertStyle)alertStyle
{
return _alertStyle;
}
/*!
Sets the receivers message text, or title, to a given text.
@param messageText - Message text for the alert.
*/
- (void)setMessageText:(CPString)messageText
{
[_messageLabel setStringValue:messageText];
}
/*!
Return's the receiver's message text body.
*/
- (CPString)messageText
{
return [_messageLabel stringValue];
}
/*!
Adds a button with a given title to the receiver.
Buttons will be added starting from the right hand side of the \c CPAlert panel.
The first button will have the index 0, the second button 1 and so on.
You really shouldn't need more than 3 buttons.
*/
- (void)addButtonWithTitle:(CPString)title
{
var bounds = [[_alertPanel contentView] bounds],
button = [[CPButton alloc] initWithFrame:CGRectMake(CGRectGetWidth(bounds) - ((_buttonCount + 1) * 90.0), CGRectGetHeight(bounds) - 34.0, 80.0, (_windowStyle == CPHUDBackgroundWindowMask) ? 20.0 : 24.0)];
[button setTitle:title];
[button setTarget:self];
[button setTag:_buttonCount];
[button setAction:@selector(_notifyDelegate:)];
[button setTheme:(_windowStyle === CPHUDBackgroundWindowMask) ? [CPTheme themeNamed:"Aristo-HUD"] : [CPTheme defaultTheme]];
[button setAutoresizingMask:CPViewMinXMargin | CPViewMinYMargin];
[[_alertPanel contentView] addSubview:button];
if (_buttonCount == 0)
[_alertPanel setDefaultButton:button];
_buttonCount++;
[_buttons addObject:button];
}
/*!
Displays the \c CPAlert panel as a modal dialog. The user will not be
able to interact with any other controls until s/he has dismissed the alert
by clicking on one of the buttons.
*/
- (void)runModal
{
var theTitle;
switch (_alertStyle)
{
case CPWarningAlertStyle: [_alertImageView setImage:CPAlertWarningImage];
theTitle = @"Warning";
break;
case CPInformationalAlertStyle: [_alertImageView setImage:CPAlertInformationImage];
theTitle = @"Information";
break;
case CPCriticalAlertStyle: [_alertImageView setImage:CPAlertErrorImage];
theTitle = @"Error";
break;
}
[_alertPanel setTitle:_windowTitle ? _windowTitle : theTitle];
[CPApp runModalForWindow:_alertPanel];
}
/* @ignore */
- (void)_notifyDelegate:(id)button
{
[CPApp abortModal];
[_alertPanel close];
if (_delegate && [_delegate respondsToSelector:@selector(alertDidEnd:returnCode:)])
[_delegate alertDidEnd:self returnCode:[button tag]];
}
@end
+95 -53
View File
@@ -20,9 +20,10 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
import <Foundation/CPObject.j>
@import <Foundation/CPObject.j>
@import "CAMediaTimingFunction.j"
import "CAMediaTimingFunction.j"
/*
@global
@@ -47,14 +48,19 @@ CPAnimationLinear = 3;
ACTUAL_FRAME_RATE = 0;
/*
/*!
@ingroup appkit
@class CPAnimation
Manages an animation. Contains timing and progress information.
@par Delegate Methods
@delegate -(BOOL)animationShouldStart:(CPAnimation)animation;
Called at the beginning of <code>startAnimation</code>.
Called at the beginning of \c -startAnimation.
@param animation the animation that will start
@return <code>YES</code> allows the animation to start.
<code>NO</code> stops the animation.
@return \c YES allows the animation to start.
\c NO stops the animation.
@delegate -(void)animationDidEnd:(CPAnimation)animation;
Called when an animation has completed.
@@ -65,15 +71,15 @@ ACTUAL_FRAME_RATE = 0;
@param animation the animation that was stopped
@delegate - (float)animation:(CPAnimation)animation valueForProgress:(float)progress;
The value from this method will be returned when <objj>CPAnimation</objj>'s
<code>currentValue</code> method is called.
The value from this method will be returned when CPAnimation's
\c currentValue method is called.
@param animation the animation to obtain the curve value for
@param progress the current animation progress
@return the curve value
*/
@implementation CPAnimation : CPObject
{
CPTimeInterval _startTime;
CPTimeInterval _lastTime;
CPTimeInterval _duration;
CPAnimationCurve _animationCurve;
@@ -86,7 +92,7 @@ ACTUAL_FRAME_RATE = 0;
CPTimer _timer;
}
/*
/*!
Initializes the animation with a duration and animation curve.
@param aDuration the length of the animation
@param anAnimationCurve defines the animation's pace
@@ -98,26 +104,24 @@ ACTUAL_FRAME_RATE = 0;
if (self)
{
_progress = 0.0;
_duration = MAX(0.0, aDuration);
_animationCurve = anAnimationCurve;
_frameRate = 60.0;
[self setAnimationCurve:anAnimationCurve];
}
return self;
}
/*
/*!
Sets the animation's pace.
@param anAnimationCurve the animation's pace
@throws CPInvalidArgumentException if an invalid animation curve is specified
*/
- (void)setAnimationCurve:(CPAnimationCurve)anAnimationCurve
{
_animationCurve = anAnimationCurve;
var timingFunctionName = kCAMediaTimingFunctionLinear;
switch (_animationCurve)
switch (anAnimationCurve)
{
case CPAnimationEaseInOut: timingFunctionName = kCAMediaTimingFunctionEaseInEaseOut;
break;
@@ -127,16 +131,20 @@ ACTUAL_FRAME_RATE = 0;
case CPAnimationEaseOut: timingFunctionName = kCAMediaTimingFunctionEaseOut;
break;
case CPAnimationLinear: timingFunctionName = kCAMediaTimingFunctionLinear;
break;
default: [CPException raise:CPInvalidArgumentException
reason:"Invalid value provided for animation curve"];
break;
}
_animationCurve = anAnimationCurve;
_timingFunction = [CAMediaTimingFunction functionWithName:timingFunctionName];
}
/*
/*!
Returns the animation's pace
*/
- (CPAnimationCurve)animationCurve
@@ -144,10 +152,10 @@ ACTUAL_FRAME_RATE = 0;
return _animationCurve;
}
/*
/*!
Sets the animation's length.
@param aDuration the new animation length
@throws CPInvalidArgumentException if <code>aDuration</code> is negative
@throws CPInvalidArgumentException if \c aDuration is negative
*/
- (void)setDuration:(CPTimeInterval)aDuration
{
@@ -157,7 +165,7 @@ ACTUAL_FRAME_RATE = 0;
_duration = aDuration;
}
/*
/*!
Returns the length of the animation.
*/
- (CPTimeInterval)duration
@@ -165,10 +173,10 @@ ACTUAL_FRAME_RATE = 0;
return _duration;
}
/*
/*!
Sets the animation frame rate. This is not a guaranteed frame rate. 0 means to go as fast as possible.
@param frameRate the new desired frame rate
@throws CPInvalidArgumentException if <code>frameRate</code> is negative
@throws CPInvalidArgumentException if \c frameRate is negative
*/
- (void)setFrameRate:(float)frameRate
{
@@ -178,7 +186,7 @@ ACTUAL_FRAME_RATE = 0;
_frameRate = frameRate;
}
/*
/*!
Returns the desired frame rate.
*/
- (float)frameRate
@@ -186,7 +194,7 @@ ACTUAL_FRAME_RATE = 0;
return _frameRate;
}
/*
/*!
Returns the animation's delegate
*/
- (id)delegate
@@ -194,7 +202,7 @@ ACTUAL_FRAME_RATE = 0;
return _delegate;
}
/*
/*!
Sets the animation's delegate.
@param aDelegate the new delegate
*/
@@ -203,25 +211,24 @@ ACTUAL_FRAME_RATE = 0;
_delegate = aDelegate;
}
/*
Starts the animation. The method calls <code>animationShouldStart:</code>
/*!
Starts the animation. The method calls \c -animationShouldStart:
on the delegate (if it implements it) to see if the animation
should begin.
*/
- (void)startAnimation
{
// If we're already animating, or our delegate stops us, animate.
if (_timer || _delegate && [_delegate respondsToSelector:@selector(animationShouldStart)] && ![_delegate animationShouldStart:self])
if (_timer || _delegate && [_delegate respondsToSelector:@selector(animationShouldStart:)] && ![_delegate animationShouldStart:self])
return;
_progress = 0.0;
if (_progress === 1.0)
_progress = 0.0;
ACTUAL_FRAME_RATE = 0;
_startTime = new Date();
// FIXME: THIS SHOULD BE A CPTIMER!!!
_timer = window.setInterval(function() {
[self animationTimerDidFire:_timer];
[[CPRunLoop currentRunLoop] performSelectors];
}, 1); // must be 1ms not 0 for IE. //_duration * 1000 / _frameRate);
_lastTime = new Date();
_timer = [CPTimer scheduledTimerWithTimeInterval:0.0 target:self selector:@selector(animationTimerDidFire:) userInfo:nil repeats:YES];
}
/*
@@ -229,25 +236,26 @@ ACTUAL_FRAME_RATE = 0;
*/
- (void)animationTimerDidFire:(CPTimer)aTimer
{
var elapsed = new Date() - _startTime,
progress = MIN(1.0, 1.0 - (_duration - elapsed / 1000.0) / _duration);
var currentTime = new Date(),
progress = MIN(1.0, [self currentProgress] + (currentTime - _lastTime) / (_duration * 1000.0));
_lastTime = currentTime;
++ACTUAL_FRAME_RATE;
[self setCurrentProgress:progress];
if (progress == 1.0)
if (progress === 1.0)
{
window.clearTimeout(_timer);
[_timer invalidate];
_timer = nil;
if ([_delegate respondsToSelector:@selector(animationDidEnd:)])
[_delegate animationDidEnd:self];
}
}
/*
/*!
Stops the animation before it has completed.
*/
- (void)stopAnimation
@@ -255,15 +263,15 @@ ACTUAL_FRAME_RATE = 0;
if (!_timer)
return;
window.clearTimeout(_timer);
[_timer invalidate];
_timer = nil;
if ([_delegate respondsToSelector:@selector(animationDidStop:)])
[_delegate animationDidStop:self];
}
/*
Returns <code>YES</code> if the animation
/*!
Returns \c YES if the animation
is running.
*/
- (BOOL)isAnimating
@@ -271,7 +279,7 @@ ACTUAL_FRAME_RATE = 0;
return _timer;
}
/*
/*!
Sets the animation's progress.
@param aProgress the animation's progress
*/
@@ -280,7 +288,7 @@ ACTUAL_FRAME_RATE = 0;
_progress = aProgress;
}
/*
/*!
Returns the animation's progress
*/
- (float)currentProgress
@@ -288,18 +296,52 @@ ACTUAL_FRAME_RATE = 0;
return _progress;
}
/*
/*!
Returns the animation's timing progress.
*/
- (float)currentValue
{
var t = [self currentProgress];
if ([_delegate respondsToSelector:@selector(animation:valueForProgress:)])
return [_delegate animation:self valueForProgress:_progress];
return [_delegate animation:self valueForProgress:t];
if (_animationCurve == CPAnimationLinear)
return _progress;
alert("IMPLEMENT ANIMATION CURVES!!!");
var c1 = [],
c2 = [];
[_timingFunction getControlPointAtIndex:1 values:c1];
[_timingFunction getControlPointAtIndex:2 values:c2];
return CubicBezierAtTime(t,c1[0],c1[1],c2[0],c2[1],_duration);
}
@end
// currently used function to determine time
// 1:1 conversion to js from webkit source files
// UnitBezier.h, WebCore_animation_AnimationBase.cpp
var CubicBezierAtTime = function CubicBezierAtTime(t,p1x,p1y,p2x,p2y,duration)
{
var ax=0,bx=0,cx=0,ay=0,by=0,cy=0;
// `ax t^3 + bx t^2 + cx t' expanded using Horner's rule.
function sampleCurveX(t) {return ((ax*t+bx)*t+cx)*t;};
function sampleCurveY(t) {return ((ay*t+by)*t+cy)*t;};
function sampleCurveDerivativeX(t) {return (3.0*ax*t+2.0*bx)*t+cx;};
// The epsilon value to pass given that the animation is going to run over |duration| seconds. The longer the animation, the more precision is needed in the timing function result to avoid ugly discontinuities.
function solveEpsilon(duration) {return 1.0/(200.0*duration);};
function solve(x,epsilon) {return sampleCurveY(solveCurveX(x,epsilon));};
// Given an x value, find a parametric value it came from.
function solveCurveX(x,epsilon) {var t0,t1,t2,x2,d2,i;
function fabs(n) {if(n>=0) {return n;}else {return 0-n;}};
// First try a few iterations of Newton's method -- normally very fast.
for(t2=x, i=0; i<8; i++) {x2=sampleCurveX(t2)-x; if(fabs(x2)<epsilon) {return t2;} d2=sampleCurveDerivativeX(t2); if(fabs(d2)<1e-6) {break;} t2=t2-x2/d2;}
// Fall back to the bisection method for reliability.
t0=0.0; t1=1.0; t2=x; if(t2<t0) {return t0;} if(t2>t1) {return t1;}
while(t0<t1) {x2=sampleCurveX(t2); if(fabs(x2-x)<epsilon) {return t2;} if(x>x2) {t0=t2;}else {t1=t2;} t2=(t1-t0)*.5+t0;}
return t2; // Failure.
};
// Calculate the polynomial coefficients, implicit first and last control points are (0,0) and (1,1).
cx=3.0*p1x; bx=3.0*(p2x-p1x)-cx; ax=1.0-cx-bx; cy=3.0*p1y; by=3.0*(p2y-p1y)-cy; ay=1.0-cy-by;
// Convert from input time to parametric value in curve, then from that to output time.
return solve(t, solveEpsilon(duration));
};
+608 -103
View File
File diff suppressed because it is too large Load Diff
+291
View File
@@ -0,0 +1,291 @@
/*
* CPBezierPath.j
*
* Created by Ross Boucher.
* Copyright 2009, 280 North, Inc.
*
* Adapted from Kevin Wojniak, portions Copyright 2009 Kevin Wojniak.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
* Copyright 2009 280 North, Inc.
*/
@import <AppKit/CPGraphicsContext.j>
@import <Foundation/CPObject.j>
// Class defaults
var DefaultLineWidth = 1.0;
/*!
@ingroup appkit
@class CPBezierPath
A CPBezierPath allows you to create paths for drawing to the screen using a simpler API than CoreGraphics.
Paths can form any shape, including regular polgyons like squares and triangles; circles, arcs; or complex
line segments.
A path can be stroked and filled using the relevant method. The currently active fill and stroke color will
be used, which can be set by calling setFill: and setStroke: on any CPColor object (or set: for both).
*/
@implementation CPBezierPath : CPObject
{
CGPath _path;
float _lineWidth;
}
/*!
Create a new CPBezierPath object.
*/
+ (CPBezierPath)bezierPath
{
return [[self alloc] init];
}
/*!
Create a new CPBezierPath object initialized with an oval path drawn within a rectangular path.
*/
+ (CPBezierPath)bezierPathWithOvalInRect:(CGRect)rect
{
var path = [self bezierPath];
[path appendBezierPathWithOvalInRect:rect];
return path;
}
/*!
Create a new CPBezierPath object initialized with a rectangular path.
*/
+ (CPBezierPath)bezierPathWithRect:(CGRect)rect
{
var path = [self bezierPath];
[path appendBezierPathWithRect:rect];
return path;
}
/*!
Get default line width.
*/
+ (float)defaultLineWidth
{
return DefaultLineWidth;
}
/*!
Set default line width.
*/
+ (void)setDefaultLineWidth:(float)width
{
DefaultLineWidth = width;
}
/*!
Fill rectangular path with current fill color.
*/
+ (void)fillRect:(CGRect)aRect
{
[[self bezierPathWithRect:aRect] fill];
}
/*!
Using the current stroke color and default drawing attributes, strokes a counterclockwise path beginning at the rectangle's origin.
*/
+ (void)strokeRect:(CGRect)aRect
{
[[self bezierPathWithRect:aRect] stroke];
}
/*!
Using the current stroke color and default drawing attributes, strokes a line between two points.
*/
+ (void)strokeLineFromPoint:(CGPoint)point1 toPoint:(CGPoint)point2
{
var path = [self bezierPath];
[path moveToPoint:point1];
[path lineToPoint:point2];
[path stroke];
}
/*!
Create a new CPBezierPath object using the default line width.
*/
- (id)init
{
if (self = [super init])
{
_path = CGPathCreateMutable();
_lineWidth = [[self class] defaultLineWidth];
}
return self;
}
/*!
Moves the current point to another location.
*/
- (void)moveToPoint:(CGPoint)point
{
CGPathMoveToPoint(_path, nil, point.x, point.y);
}
/*!
Append a straight line to the path.
*/
- (void)lineToPoint:(CGPoint)point
{
CGPathAddLineToPoint(_path, nil, point.x, point.y);
}
/*!
Add a cubic Bezier curve to the path.
*/
- (void)curveToPoint:(CGPoint)endPoint controlPoint1:(CGPoint)controlPoint1 controlPoint2:(CGPoint)controlPoint2
{
CGPathAddCurveToPoint(_path, nil, controlPoint1.x, controlPoint1.y, controlPoint2.x, controlPoint2.y, endPoint.x, endPoint.y);
}
/*!
Create a line segment between the first and last points in the subpath, closing it.
*/
- (void)closePath
{
CGPathCloseSubpath(_path);
}
/*!
Draw a line along the path with the current stroke color and default drawing attributes.
*/
- (void)stroke
{
var ctx = [[CPGraphicsContext currentContext] graphicsPort];
CGContextBeginPath(ctx);
CGContextAddPath(ctx, _path);
CGContextSetLineWidth(ctx, [self lineWidth]);
CGContextClosePath(ctx);
CGContextStrokePath(ctx);
}
/*!
Fill the path with the current fill color.
*/
- (void)fill
{
var ctx = [[CPGraphicsContext currentContext] graphicsPort];
CGContextBeginPath(ctx);
CGContextAddPath(ctx, _path);
CGContextSetLineWidth(ctx, [self lineWidth]);
CGContextClosePath(ctx);
CGContextFillPath(ctx);
}
/*!
Get the line width.
*/
- (float)lineWidth
{
return _lineWidth;
}
/*!
Set the line width.
*/
- (void)setLineWidth:(float)lineWidth
{
_lineWidth = lineWidth;
}
/*!
Get the total number of elements.
*/
- (unsigned)elementCount
{
return _path.count;
}
/*!
Check if receiver is empty, returns appropriate Boolean value.
*/
- (BOOL)isEmpty
{
return CGPathIsEmpty(_path);
}
/*!
Get the current point.
*/
- (CGPoint)currentPoint
{
return CGPathGetCurrentPoint(_path);
}
/*!
Append a series of line segments.
*/
- (void)appendBezierPathWithPoints:(CPArray)points count:(unsigned)count
{
CGPathAddLines(_path, nil, points, count);
}
/*!
Append a rectangular path.
*/
- (void)appendBezierPathWithRect:(CGRect)rect
{
CGPathAddRect(_path, nil, rect);
}
/*!
Append an oval path; oval is drawn within the rectangular path.
*/
- (void)appendBezierPathWithOvalInRect:(CGRect)rect
{
CGPathAddPath(_path, nil, CGPathWithEllipseInRect(rect));
}
/*!
Append a rounded rectangular path.
*/
- (void)appendBezierPathWithRoundedRect:(CGRect)rect xRadius:(float)xRadius yRadius:(float)yRadius
{
CGPathAddPath(_path, nil, CGPathWithRoundedRectangleInRect(rect, xRadius, yRadius, YES, YES, YES, YES));
}
/*!
Append the contents of a CPBezierPath object.
*/
- (void)appendBezierPath:(NSBezierPath *)other
{
CGPathAddPath(_path, nil, other._path);
}
/*!
Remove all path elements; clears path.
*/
- (void)removeAllPoints
{
_path = CGPathCreateMutable();
}
@end
+244
View File
@@ -0,0 +1,244 @@
/*
* CPBox.j
* AppKit
*
* Created by Ross Boucher.
* Copyright 2009, 280 North, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
@import "CPView.j"
// CPBorderType
CPNoBorder = 0;
CPLineBorder = 1;
CPBezelBorder = 2;
CPGrooveBorder = 3;
@implementation CPBox : CPView
{
CPBorderType _borderType;
CPColor _borderColor;
CPColor _fillColor;
float _cornerRadius;
float _borderWidth;
CPSize _contentMargin;
CPView _contentView;
}
+ (id)boxEnclosingView:(CPView)aView
{
var box = [[self alloc] initWithFrame:CGRectMakeZero()],
enclosingView = [aView superview];
[box setFrameFromContentFrame:[aView frame]];
[enclosingView replaceSubview:aView with:box];
[box setContentView:aView];
return box;
}
- (id)initWithFrame:(CPRect)frameRect
{
self = [super initWithFrame:frameRect];
if (self)
{
_fillColor = [CPColor clearColor];
_borderColor = [CPColor blackColor];
_borderWidth = 1.0;
_contentMargin = CGSizeMake(0.0, 0.0);
_contentView = [[CPView alloc] initWithFrame:[self bounds]];
[self addSubview:_contentView];
}
return self;
}
// Configuring Boxes
- (CPRect)borderRect
{
return [self bounds];
}
- (CPBorderType)borderType
{
return _borderType;
}
- (void)setBorderType:(CPBorderType)value
{
_borderType = value;
[self setNeedsDisplay:YES];
}
- (CPColor)borderColor
{
return _borderColor;
}
- (void)setBorderColor:(CPColor)color
{
if ([color isEqual:_borderColor])
return;
_borderColor = color;
[self setNeedsDisplay:YES];
}
- (float)borderWidth
{
return _borderWidth;
}
- (void)setBorderWidth:(float)width
{
if (width === _borderWidth)
return;
_borderWidth = width;
[self setNeedsDisplay:YES];
}
- (float)cornerRadius
{
return _cornerRadius;
}
- (void)setCornerRadius:(float)radius
{
if (radius === _cornerRadius)
return;
_cornerRadius = radius;
[self setNeedsDisplay:YES];
}
- (CPColor)fillColor
{
return _fillColor;
}
- (void)setFillColor:(CPColor)color
{
if ([color isEqual:_fillColor])
return;
_fillColor = color;
[self setNeedsDisplay:YES];
}
- (CPView)contentView
{
return _contentView;
}
- (void)setContentView:(CPView)aView
{
if (aView === _contentView)
return;
[aView setFrame:CGRectInset([self bounds], _contentMargin.width + _borderWidth, _contentMargin.height + _borderWidth)];
[self replaceSubview:_contentView with:aView];
_contentView = aView;
}
- (CPSize)contentViewMargins
{
return _contentMargin;
}
- (void)setContentViewMargins:(CPSize)size
{
if(size.width < 0 || size.height < 0)
[CPException raise:CPGenericException reason:@"Margins must be positive"];
_contentMargin = CGSizeMakeCopy(size);
[self setNeedsDisplay:YES];
}
- (void)setFrameFromContentFrame:(CPRect)aRect
{
[self setFrame:CGRectInset(aRect, -(_contentMargin.width + _borderWidth), -(_contentMargin.height + _borderWidth))];
[self setNeedsDisplay:YES];
}
- (void)sizeToFit
{
var contentFrame = [_contentView frame];
[self setFrameSize:CGSizeMake(contentFrame.size.width + _contentMargin.width * 2,
contentFrame.size.height + _contentMargin.height * 2)];
[_contentView setFrameOrigin:CGPointMake(_contentMargin.width, _contentMargin.height)];
}
- (void)drawRect:(CPRect)rect
{
var bounds = [self bounds],
aContext = [[CPGraphicsContext currentContext] graphicsPort],
border2 = _borderWidth/2,
strokeRect = CGRectMake(bounds.origin.x + border2,
bounds.origin.y + border2,
bounds.size.width - _borderWidth,
bounds.size.height - _borderWidth),
fillRect = CGRectMake(bounds.origin.x + border2,
bounds.origin.y + border2,
bounds.size.width - _borderWidth,
bounds.size.height - _borderWidth);
CGContextSetFillColor(aContext, [self fillColor]);
CGContextSetStrokeColor(aContext, [self borderColor]);
CGContextSetLineWidth(aContext, _borderWidth);
switch(_borderType)
{
case CPLineBorder: CGContextFillRoundedRectangleInRect(aContext, fillRect, _cornerRadius, YES, YES, YES, YES);
CGContextStrokeRoundedRectangleInRect(aContext, strokeRect, _cornerRadius, YES, YES, YES, YES);
break;
case CPBezelBorder: CGContextFillRoundedRectangleInRect(aContext, fillRect, _cornerRadius, YES, YES, YES, YES);
CGContextSetStrokeColor(aContext, [CPColor colorWithWhite:190.0/255.0 alpha:1.0]);
CGContextBeginPath(aContext);
CGContextMoveToPoint(aContext, strokeRect.origin.x, strokeRect.origin.y);
CGContextAddLineToPoint(aContext, CGRectGetMinX(strokeRect), CGRectGetMaxY(strokeRect)),
CGContextAddLineToPoint(aContext, CGRectGetMaxX(strokeRect), CGRectGetMaxY(strokeRect)),
CGContextAddLineToPoint(aContext, CGRectGetMaxX(strokeRect), CGRectGetMinY(strokeRect)),
CGContextStrokePath(aContext);
CGContextSetStrokeColor(aContext, [CPColor colorWithWhite:142.0/255.0 alpha:1.0]);
CGContextBeginPath(aContext);
CGContextMoveToPoint(aContext, bounds.origin.x, strokeRect.origin.y);
CGContextAddLineToPoint(aContext, CGRectGetMaxX(bounds), CGRectGetMinY(strokeRect));
CGContextStrokePath(aContext);
break;
default: break;
}
}
@end
+409 -668
View File
File diff suppressed because it is too large Load Diff
+71
View File
@@ -0,0 +1,71 @@
@import <AppKit/CPView.j>
#include "CoreGraphics/CGGeometry.h"
@implementation CPButtonBar : CPControl
{
}
- (id)initWithFrame:(CGRect)aFrame
{
self = [super initWithFrame:aFrame];
if (self)
[self setNeedsLayout];
return self;
}
+ (CPString)themeClass
{
return @"button-bar";
}
+ (id)themeAttributes
{
return [CPDictionary dictionaryWithObjects:[[CPNull null]]
forKeys:[@"bezel-color"]];
}
- (CGRect)rectForEphemeralSubviewNamed:(CPString)aName
{
if (aName === "bezel-view")
return [self bounds];
return [super rectForEphemeralSubviewNamed:aName];
}
- (CPView)createEphemeralSubviewNamed:(CPString)aName
{
if (aName === "bezel-view")
{
var view = [[CPView alloc] initWithFrame:_CGRectMakeZero()];
[view setHitTests:NO];
return view;
}
return [super createEphemeralSubviewNamed:aName];
}
- (void)layoutSubviews
{
var bezelView = [self layoutEphemeralSubviewNamed:@"bezel-view"
positioned:CPWindowBelow
relativeToEphemeralSubviewNamed:@""];
if (bezelView)
[bezelView setBackgroundColor:[self currentValueForThemeAttribute:@"bezel-color"]];
}
- (void)addSubview:(CPView)aSubview
{
[super addSubview:aSubview];
[aSubview setAutoresizingMask:CPViewMinXMargin];
}
@end
+64
View File
@@ -0,0 +1,64 @@
/*
* CPCheckBox.j
* AppKit
*
* Created by Francisco Tolmasky.
* Copyright 2009, 280 North, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
@import "CPButton.j"
@implementation CPCheckBox : CPButton
{
}
+ (id)checkBoxWithTitle:(CPString)aTitle theme:(CPTheme)aTheme
{
return [self buttonWithTitle:aTitle theme:aTheme];
}
+ (id)checkBoxWithTitle:(CPString)aTitle
{
return [self buttonWithTitle:aTitle];
}
+ (CPString)themeClass
{
return @"check-box";
}
- (id)initWithFrame:(CGRect)aFrame
{
self = [super initWithFrame:aFrame];
if (self)
{
[self setHighlightsBy:CPContentsCellMask];
[self setShowsStateBy:CPContentsCellMask];
// Defaults?
[self setImagePosition:CPImageLeft];
[self setAlignment:CPLeftTextAlignment];
[self setBordered:YES];
}
return self;
}
@end
+73 -20
View File
@@ -20,22 +20,26 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
import "CPView.j"
@import "CPView.j"
#include "CoreGraphics/CGGeometry.h"
/*
<objj>CPClipView</objj> allows you to define a clip rect and display only that portion of its containing view.
It is used to hold the document view in a <objj>CPScrollView</objj>.
/*!
@ingroup appkit
@class CPClipView
CPClipView allows you to define a clip rect and display only that portion of its containing view.
It is used to hold the document view in a CPScrollView.
*/
@implementation CPClipView : CPView
{
CPView _documentView;
}
/*
Sets the document view to be <code>aView</code>.
@param aView the new document view. It's frame origin will be changed to <code>(0,0)</code> after calling this method.
/*!
Sets the document view to be \c aView.
@param aView the new document view. It's frame origin will be changed to \c (0,0) after calling this method.
*/
- (void)setDocumentView:(CPView)aView
{
@@ -63,9 +67,6 @@ import "CPView.j"
if (_documentView)
{
// FIXME: remove when bounds.
[_documentView setFrameOrigin:CGPointMake(0.0, 0.0)];
[self addSubview:_documentView];
[_documentView setPostsFrameChangedNotifications:YES];
@@ -85,7 +86,7 @@ import "CPView.j"
}
}
/*
/*!
Returns the document view.
*/
- (id)documentView
@@ -93,14 +94,17 @@ import "CPView.j"
return _documentView;
}
/*
Returns a new point that may be adjusted from <code>aPoint</code>
/*!
Returns a new point that may be adjusted from \c aPoint
to make sure it lies within the document view.
@param aPoint
@return the adjusted point
*/
- (CGPoint)constrainScrollPoint:(CGPoint)aPoint
{
if (!_documentView)
return _CGPointMakeZero();
var documentFrame = [_documentView frame];
aPoint.x = MAX(0.0, MIN(aPoint.x, MAX(_CGRectGetWidth(documentFrame) - _CGRectGetWidth(_bounds), 0.0)));
@@ -122,29 +126,40 @@ import "CPView.j"
[superview reflectScrolledClipView:self];
}
/*
/*!
Scrolls the clip view to the specified point. The method
sets its bounds origin to <code>aPoint</code>.
sets its bounds origin to \c aPoint.
*/
- (void)scrollToPoint:(CGPoint)aPoint
{
[self setBoundsOrigin:[self constrainScrollPoint:aPoint]];
}
/*
Handles a <objj>CPViewBoundsDidChangeNotification</objj>.
/*!
Handles a CPViewBoundsDidChangeNotification.
@param aNotification the notification event
*/
- (void)viewBoundsChanged:(CPNotification)aNotification
{
[self viewFrameChanged:aNotification];
[self _constrainScrollPoint];
}
/*
Handles a <objj>CPViewFrameDidChangeNotification</objj>.
/*!
Handles a CPViewFrameDidChangeNotification.
@param aNotification the notification event
*/
- (void)viewFrameChanged:(CPNotification)aNotification
{
[self _constrainScrollPoint];
}
- (void)resizeSubviewsWithOldSize:(CGSize)aSize
{
[super resizeSubviewsWithOldSize:aSize];
[self _constrainScrollPoint];
}
- (void)_constrainScrollPoint
{
var oldScrollPoint = [self bounds].origin;
@@ -164,4 +179,42 @@ import "CPView.j"
[superview reflectScrolledClipView:self];
}
- (BOOL)autoscroll:(CPEvent)anEvent
{
var bounds = [self bounds],
eventLocation = [self convertPoint:[anEvent locationInWindow] fromView:nil];
if (CPRectContainsPoint(bounds, eventLocation))
return NO;
var newRect = CGRectMakeZero();
newRect.origin = eventLocation;
newRect.size = CPSizeMake(10, 10);
return [_documentView scrollRectToVisible:newRect];
}
@end
var CPClipViewDocumentViewKey = @"CPScrollViewDocumentView";
@implementation CPClipView (CPCoding)
- (id)initWithCoder:(CPCoder)aCoder
{
if (self = [super initWithCoder:aCoder])
[self setDocumentView:[aCoder decodeObjectForKey:CPClipViewDocumentViewKey]];
return self;
}
- (void)encodeWithCoder:(CPCoder)aCoder
{
[super encodeWithCoder:aCoder];
[aCoder encodeObject:_documentView forKey:CPClipViewDocumentViewKey];
}
@end
+312 -170
View File
@@ -20,16 +20,25 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
import <Foundation/CPArray.j>
import <Foundation/CPData.j>
import <Foundation/CPIndexSet.j>
import <Foundation/CPKeyedArchiver.j>
import <Foundation/CPKeyedUnarchiver.j>
@import <Foundation/CPArray.j>
@import <Foundation/CPData.j>
@import <Foundation/CPIndexSet.j>
@import <Foundation/CPKeyedArchiver.j>
@import <Foundation/CPKeyedUnarchiver.j>
import <AppKit/CPView.j>
@import "CPView.j"
@import "CPCollectionViewItem.j"
/*
This class presents an array of content as a grid of views.
/*!
@ingroup appkit
@class CPCollectionView
This class displays an array as a grid of objects, where each object is represented by a view.
The view is controlled by creating a CPCollectionViewItem and specifying its view, then
setting that item as the collection view prototype.
@par Delegate Methods
@delegate -(void)collectionViewDidChangeSelection:(CPCollectionView)collectionView;
Called when the selection in the collection view has changed.
@@ -51,8 +60,9 @@ import <AppKit/CPView.j>
Invoked to obtain the data types supported by the specified indices for placement on the pasteboard.
@param collectionView the collection view the items reside in
@param indices the indices to obtain drag types
@return an array of drag types (<objj>CPString</objj>)
@return an array of drag types (CPString)
*/
@implementation CPCollectionView : CPView
{
CPArray _content;
@@ -68,11 +78,14 @@ import <AppKit/CPView.j>
CGSize _minItemSize;
CGSize _maxItemSize;
CPArray _backgroundColors;
float _tileWidth;
BOOL _isSelectable;
BOOL _allowsMultipleSelection;
BOOL _allowsEmptySelection;
CPIndexSet _selectionIndexes;
CGSize _itemSize;
@@ -84,6 +97,8 @@ import <AppKit/CPView.j>
unsigned _numberOfColumns;
id _delegate;
CPEvent _mouseDownEvent;
}
- (id)initWithFrame:(CGRect)aFrame
@@ -100,29 +115,35 @@ import <AppKit/CPView.j>
_itemSize = CGSizeMakeZero();
_minItemSize = CGSizeMakeZero();
_maxItemSize = CGSizeMakeZero();
[self setBackgroundColors:nil];
_verticalMargin = 5.0;
_tileWidth = -1.0;
_selectionIndexes = [CPIndexSet indexSet];
_allowsEmptySelection = YES;
_isSelectable = YES;
}
return self;
}
/*
Sets the item prototype to <code>anItem</code>
/*!
Sets the item prototype to \c anItem
@param anItem the new item prototype
*/
- (void)setItemPrototype:(CPCollectionViewItem)anItem
{
_itemData = [CPKeyedArchiver archivedDataWithRootObject:anItem];
_itemForDragging = anItem//[CPKeyedUnarchiver unarchiveObjectWithData:_itemData];
_cachedItems = [];
_itemData = nil;
_itemForDragging = nil;
_itemPrototype = anItem;
[self reloadContent];
}
/*
/*!
Returns the current item prototype
*/
- (CPCollectionViewItem)itemPrototype
@@ -130,18 +151,25 @@ import <AppKit/CPView.j>
return _itemPrototype;
}
/*
Returns a collection view item for <code>anObject</code>.
/*!
Returns a collection view item for \c anObject.
@param anObject the object to be represented.
*/
- (CPCollectionViewItem)newItemForRepresentedObject:(id)anObject
{
var item = nil;
if (_cachedItems.length)
item = _cachedItems.pop();
else
{
if (!_itemData)
if (_itemPrototype)
_itemData = [CPKeyedArchiver archivedDataWithRootObject:_itemPrototype];
item = [CPKeyedUnarchiver unarchiveObjectWithData:_itemData];
}
[item setRepresentedObject:anObject];
[[item view] setFrameSize:_itemSize];
@@ -150,26 +178,26 @@ import <AppKit/CPView.j>
}
// Working with the Responder Chain
/*
Returns <code>YES</code> by default.
/*!
Returns \c YES by default.
*/
- (BOOL)acceptsFirstResponder
{
return YES;
}
/*
/*!
Returns whether the receiver is currently the first responder.
*/
- (BOOL)isFirstResponder
{
return [[self window] firstResponder] == self;
return [[self window] firstResponder] === self;
}
// Setting the Content
/*
Sets the content of the collection view to the content in <code>anArray</code>.
This array can be of any type, and each element will be passed to the <code>setRepresentedObject:</code> method.
/*!
Sets the content of the collection view to the content in \c anArray.
This array can be of any type, and each element will be passed to the \c -setRepresentedObject: method.
It's the responsibility of your custom collection view item to interpret the object.
@param anArray the content array
*/
@@ -183,7 +211,7 @@ import <AppKit/CPView.j>
[self reloadContent];
}
/*
/*!
Returns the collection view content array
*/
- (CPArray)content
@@ -191,7 +219,7 @@ import <AppKit/CPView.j>
return _content;
}
/*
/*!
Returns the collection view items.
*/
- (CPArray)items
@@ -200,9 +228,9 @@ import <AppKit/CPView.j>
}
// Setting the Selection Mode
/*
/*!
Sets whether the user is allowed to select items
@param isSelectable <code>YES</code> allows the user to select items.
@param isSelectable \c YES allows the user to select items.
*/
- (void)setSelectable:(BOOL)isSelectable
{
@@ -220,63 +248,80 @@ import <AppKit/CPView.j>
}
}
/*
Returns <code>YES</code> if the collection view is
selected, and <code>NO</code> otherwise.
/*!
Returns \c YES if the collection view is
selectable, and \c NO otherwise.
*/
- (BOOL)isSelected
- (BOOL)isSelectable
{
return _isSelected;
return _isSelectable;
}
/*
/*!
Sets whether the user may have no items selected. If YES, mouse clicks not on any item will empty the current selection. The first item will also start off as selected.
@param shouldAllowMultipleSelection \c YES allows the user to select multiple items
*/
- (void)setAllowsEmptySelection:(BOOL)shouldAllowEmptySelection
{
_allowsEmptySelection = shouldAllowEmptySelection;
}
/*!
Returns \c YES if the user can select no items, \c NO otherwise.
*/
- (BOOL)allowsEmptySelection
{
return _allowsEmptySelection;
}
/*!
Sets whether the user can select multiple items.
@param shouldAllowMultipleSelection <code>YES</code> allows the user to select multiple items
@param shouldAllowMultipleSelection \c YES allows the user to select multiple items
*/
- (void)setAllowsMultipleSelection:(BOOL)shouldAllowMultipleSelection
{
_allowsMultipleSelection = shouldAllowMultipleSelection;
}
/*
Returns <code>YES</code> if the user can select multiple items, <code>NO</code> otherwise.
/*!
Returns \c YES if the user can select multiple items, \c NO otherwise.
*/
- (BOOL)allowsMultipleSelection
{
return _allowsMultipleSelection;
}
/*
/*!
Sets the selected items based on the provided indices.
@param anIndexSet the set of items to be selected
*/
- (void)setSelectionIndexes:(CPIndexSet)anIndexSet
{
if (_selectionIndexes == anIndexSet)
if (_selectionIndexes == anIndexSet || !_isSelectable)
return;
var index = CPNotFound;
while ((index = [_selectionIndexes indexGreaterThanIndex:index]) != CPNotFound)
[_items[index] setSelected:NO];
_selectionIndexes = anIndexSet;
var index = CPNotFound;
while ((index = [_selectionIndexes indexGreaterThanIndex:index]) != CPNotFound)
[_items[index] setSelected:YES];
if ([_delegate respondsToSelector:@selector(collectionViewDidChangeSelection:)])
[_delegate collectionViewDidChangeSelection:self]
}
/*
/*!
Returns a set of the selected indices.
*/
- (CPIndexSet)selectionIndexes
{
return _selectionIndexes;
return [_selectionIndexes copy];
}
/* @ignore */
@@ -288,25 +333,31 @@ import <AppKit/CPView.j>
while (count--)
{
[[_items[count] view] removeFromSuperview];
[_items[count] setSelected:NO];
_cachedItems.push(_items[count]);
}
_items = [];
if (!_itemData || !_content)
if (!_itemPrototype || !_content)
return;
var index = 0;
count = _content.length;
for (; index < count; ++index)
{
_items.push([self newItemForRepresentedObject:_content[index]]);
[self addSubview:[_items[index] view]];
}
index = CPNotFound;
while ((index = [_selectionIndexes indexGreaterThanIndex:index]) != CPNotFound)
[_items[index] setSelected:YES];
[self tile];
}
@@ -322,7 +373,7 @@ import <AppKit/CPView.j>
// either proportioned out to the views (if their minSize != maxSize) or used as
// margin
var itemSize = CGSizeMakeCopy(_minItemSize);
_numberOfColumns = MAX(1.0, FLOOR(width / itemSize.width));
if (_maxNumberOfColumns > 0)
@@ -334,6 +385,10 @@ import <AppKit/CPView.j>
if (remaining > 0 && itemSize.width < _maxItemSize.width)
itemSize.width = MIN(_maxItemSize.width, itemSize.width + FLOOR(remaining / _numberOfColumns));
// When we ONE column and a non-integral width, the FLOORing above can cause the item width to be smaller than the total width.
if (_maxNumberOfColumns == 1 && itemSize.width < _maxItemSize.width && itemSize.width < width)
itemSize.width = MIN(_maxItemSize.width, width);
if (!CGSizeEqualToSize(_itemSize, itemSize))
{
_itemSize = itemSize;
@@ -382,7 +437,7 @@ import <AppKit/CPView.j>
}
// Laying Out the Collection View
/*
/*!
Sets the maximum number of rows.
@param aMaxNumberOfRows the new maximum number of rows
*/
@@ -396,7 +451,7 @@ import <AppKit/CPView.j>
[self tile];
}
/*
/*!
Returns the maximum number of rows.
*/
- (unsigned)maxNumberOfRows
@@ -404,7 +459,7 @@ import <AppKit/CPView.j>
return _maxNumberOfRows;
}
/*
/*!
Sets the maximum number of columns.
@param aMaxNumberOfColumns the new maximum number of columns
*/
@@ -418,7 +473,7 @@ import <AppKit/CPView.j>
[self tile];
}
/*
/*!
Returns the maximum number of columns
*/
- (unsigned)maxNumberOfColumns
@@ -426,7 +481,24 @@ import <AppKit/CPView.j>
return _maxNumberOfColumns;
}
/*
/*!
Returns the current number of rows
*/
- (unsigned)numberOfRows
{
return _numberOfRows;
}
/*!
Returns the current number of columns
*/
- (unsigned)numberOfColumns
{
return _numberOfColumns;
}
/*!
Sets the minimum size for an item
@param aSize the new minimum item size
*/
@@ -440,7 +512,7 @@ import <AppKit/CPView.j>
[self tile];
}
/*
/*!
Returns the current minimum item size
*/
- (CGSize)minItemSize
@@ -448,7 +520,7 @@ import <AppKit/CPView.j>
return _minItemSize;
}
/*
/*!
Sets the maximum item size.
@param aSize the new maximum item size
*/
@@ -462,7 +534,7 @@ import <AppKit/CPView.j>
[self tile];
}
/*
/*!
Returns the current maximum item size.
*/
- (CGSize)maxItemSize
@@ -470,6 +542,30 @@ import <AppKit/CPView.j>
return _maxItemSize;
}
- (void)setBackgroundColors:(CPArray)backgroundColors
{
if (_backgroundColors === backgroundColors)
return;
_backgroundColors = backgroundColors;
if (!_backgroundColors)
_backgroundColors = [CPColor whiteColor];
if ([_backgroundColors count] === 1)
[self setBackgroundColor:_backgroundColors[0]];
else
[self setBackgroundColor:nil];
[self setNeedsDisplay:YES];
}
- (CPArray)backgroundColors
{
return _backgroundColors;
}
- (void)mouseUp:(CPEvent)anEvent
{
if ([_selectionIndexes count] && [anEvent clickCount] == 2 && [_delegate respondsToSelector:@selector(collectionView:didDoubleClickOnItemAtIndex:)])
@@ -478,48 +574,56 @@ import <AppKit/CPView.j>
- (void)mouseDown:(CPEvent)anEvent
{
_mouseDownEvent = anEvent;
var location = [self convertPoint:[anEvent locationInWindow] fromView:nil],
row = FLOOR(location.y / (_itemSize.height + _verticalMargin)),
column = FLOOR(location.x / (_itemSize.width + _horizontalMargin)),
index = row * _numberOfColumns + column;
if (index >= 0 && index < _items.length)
[self setSelectionIndexes:[CPIndexSet indexSetWithIndex:index]];
else if (_allowsEmptySelection)
[self setSelectionIndexes:[CPIndexSet indexSet]];
}
- (void)mouseDragged:(CPEvent)anEvent
{
if (![_delegate respondsToSelector:@selector(collectionView:dragTypesForItemsAtIndexes:)])
return;
// If we don't have any selected items, we've clicked away, and thus the drag is meaningless.
if (![_selectionIndexes count])
return;
// Set up the pasteboard
var dragTypes = [_delegate collectionView:self dragTypesForItemsAtIndexes:_selectionIndexes];
[[CPPasteboard pasteboardWithName:CPDragPboard] declareTypes:dragTypes owner:self];
var point = [self convertPoint:[anEvent locationInWindow] fromView:nil];
[_itemForDragging setRepresentedObject:_content[[_selectionIndexes firstIndex]]];
if (!_itemForDragging)
_itemForDragging = [self newItemForRepresentedObject:_content[[_selectionIndexes firstIndex]]];
else
[_itemForDragging setRepresentedObject:_content[[_selectionIndexes firstIndex]]];
var view = [_itemForDragging view];
var view = [_itemForDragging view],
frame = [view frame];
[view setFrameSize:_itemSize];
[view setAlphaValue:0.7];
[self dragView:view
at:[[_items[[_selectionIndexes firstIndex]] view] frame].origin
offset:CGPointMakeZero()
event:anEvent
offset:CGSizeMakeZero()
event:_mouseDownEvent
pasteboard:nil
source:self
slideBack:YES];
}
/*
/*!
Places the selected items on the specified pasteboard. The items are requested from the collection's delegate.
@param aPasteboard the pasteboard to put the items on
@param aType the format the pasteboard data
@@ -531,6 +635,11 @@ import <AppKit/CPView.j>
// Cappuccino Additions
/*!
Sets the collection view's vertical spacing between elements.
@param aVerticalMargin the number of pixels to place between elements
*/
- (void)setVerticalMargin:(float)aVerticalMargin
{
if (_verticalMargin == aVerticalMargin)
@@ -541,7 +650,16 @@ import <AppKit/CPView.j>
[self tile];
}
/*
/*!
Gets the collection view's current vertical spacing between elements.
*/
- (float)verticalMargin
{
return _verticalMargin;
}
/*!
Sets the collection view's delegate
@param aDelegate the new delegate
*/
@@ -550,7 +668,7 @@ import <AppKit/CPView.j>
_delegate = aDelegate;
}
/*
/*!
Returns the collection view's delegate
*/
- (id)delegate
@@ -560,135 +678,159 @@ import <AppKit/CPView.j>
@end
/*
Represents an object inside a <objj>CPCollectionView</objj>.
*/
@implementation CPCollectionViewItem : CPObject
@implementation CPCollectionView (KeyboardInteraction)
- (CGRect)rectForItemAtIndex:(int)index
{
id _representedObject;
CPView _view;
BOOL _isSelected;
// Don't re-compute anything just grab the current frame
// This allows subclasses to override tile without messing this up.
return [[_items[index] view] frame];
}
// Setting the Represented Object
/*
Sets the object to be represented by this item.
@param anObject the object to be represented
*/
- (void)setRepresentedObject:(id)anObject
- (CGRect)rectForItemsAtIndexes:(CPIndexSet)indexSet
{
if (_representedObject == anObject)
return;
_representedObject = anObject;
// FIXME: This should be set up by bindings
[_view setRepresentedObject:anObject];
var indexArray = [],
rect = nil;
[indexSet getIndexes:indexArray maxCount:-1 inIndexRange:nil];
for (var i = 0, count = indexArray.length; i < count; ++i)
{
var index = indexArray[i];
if (rect == nil)
rect = [self rectForItemAtIndex:index];
else
rect = CGRectUnion(rect, [self rectForItemAtIndex:index]);
}
return rect;
}
/*
Returns the object represented by this view item
*/
- (id)representedObject
- (void)_scrollToSelection
{
return _representedObject;
var rect = [self rectForItemsAtIndexes:[self selectionIndexes]];
if (rect)
[self scrollRectToVisible:rect];
}
// Modifying the View
/*
Sets the view that is used represent this object.
@param aView the view used to represent this object
*/
- (void)setView:(CPView)aView
- (void)moveLeft:(id)sender
{
_view = aView;
var index = [[self selectionIndexes] firstIndex];
if (index === CPNotFound)
index = [[self items] count];
index = MAX(index - 1, 0);
[self setSelectionIndexes:[CPIndexSet indexSetWithIndex:index]];
[self _scrollToSelection];
}
/*
Returns the view that represents this object.
*/
- (CPView)view
- (void)moveRight:(id)sender
{
return _view;
var index = MIN([[self selectionIndexes] firstIndex] + 1, [[self items] count]-1);
[self setSelectionIndexes:[CPIndexSet indexSetWithIndex:index]];
[self _scrollToSelection];
}
// Modifying the Selection
/*
Sets whether this view item should be selected.
@param shouldBeSelected <code>YES</code> makes the item selected. <code>NO</code> deselects it.
*/
- (void)setSelected:(BOOL)shouldBeSelected
- (void)moveDown:(id)sender
{
if (_isSelected == shouldBeSelected)
return;
_isSelected = shouldBeSelected;
// FIXME: This should be set up by bindings
[_view setSelected:_isSelected];
var index = MIN([[self selectionIndexes] firstIndex] + [self numberOfColumns], [[self items] count]-1);
[self setSelectionIndexes:[CPIndexSet indexSetWithIndex:index]];
[self _scrollToSelection];
}
/*
Returns <code>YES</code> if the item is currently selected. <code>NO</code> if the item is not selected.
*/
- (BOOL)isSelected
- (void)moveUp:(id)sender
{
return _isSelected;
var index = [[self selectionIndexes] firstIndex];
if (index == CPNotFound)
index = [[self items] count];
index = MAX(0, index - [self numberOfColumns]);
[self setSelectionIndexes:[CPIndexSet indexSetWithIndex:index]];
[self _scrollToSelection];
}
// Parent Collection View
/*
Returns the collection view of which this item is a part.
*/
- (CPCollectionView)collectionView
- (void)deleteBackwards:(id)sender
{
return [_view superview];
if ([[self delegate] respondsToSelector:@selector(collectionView:shouldDeleteItemsAtIndexes:)])
{
[[self delegate] collectionView:self shouldDeleteItemsAtIndexes:[self selectionIndexes]];
var index = [[self selectionIndexes] firstIndex];
if (index > [[self content] count]-1)
[self setSelectionIndexes:[CPIndexSet indexSetWithIndex:[[self content] count]-1]];
[self _scrollToSelection];
[self setNeedsDisplay:YES];
}
}
- (void)keyDown:(CPEvent)anEvent
{
[self interpretKeyEvents:[anEvent]];
}
@end
var CPCollectionViewItemViewKey = @"CPCollectionViewItemViewKey";
var CPCollectionViewMinItemSizeKey = @"CPCollectionViewMinItemSizeKey",
CPCollectionViewMaxItemSizeKey = @"CPCollectionViewMaxItemSizeKey",
CPCollectionViewVerticalMarginKey = @"CPCollectionViewVerticalMarginKey",
CPCollectionViewSelectableKey = @"CPCollectionViewSelectableKey",
CPCollectionViewBackgroundColorsKey = @"CPCollectionViewBackgroundColorsKey";
@implementation CPCollectionViewItem (CPCoding)
/*
FIXME Not yet implemented
*/
- (id)copy
{
}
@implementation CPCollectionView (CPCoding)
@end
var CPCollectionViewItemViewKey = @"CPCollectionViewItemViewKey";
@implementation CPCollectionViewItem (CPCoding)
/*
Initializes the view item by unarchiving data from a coder.
@param aCoder the coder from which the data will be unarchived
@return the initialized collection view item
*/
- (id)initWithCoder:(CPCoder)aCoder
{
self = [super init];
self = [super initWithCoder:aCoder];
if (self)
_view = [aCoder decodeObjectForKey:CPCollectionViewItemViewKey];
{
_items = [];
_content = [];
_cachedItems = [];
_itemSize = CGSizeMakeZero();
_minItemSize = [aCoder decodeSizeForKey:CPCollectionViewMinItemSizeKey] || CGSizeMakeZero();
_maxItemSize = [aCoder decodeSizeForKey:CPCollectionViewMaxItemSizeKey] || CGSizeMakeZero();
_verticalMargin = [aCoder decodeFloatForKey:CPCollectionViewVerticalMarginKey];
_isSelectable = [aCoder decodeBoolForKey:CPCollectionViewSelectableKey];
[self setBackgroundColors:[aCoder decodeObjectForKey:CPCollectionViewBackgroundColorsKey]];
_tileWidth = -1.0;
_selectionIndexes = [CPIndexSet indexSet];
_allowsEmptySelection = YES;
}
return self;
}
/*
Archives the colletion view item to the provided coder.
@param aCoder the coder to which the view item should be archived
*/
- (void)encodeWithCoder:(CPCoder)aCoder
{
[aCoder encodeObject:_view forKey:CPCollectionViewItemViewKey];
[super encodeWithCoder:aCoder];
if (!CGSizeEqualToSize(_minItemSize, CGSizeMakeZero()))
[aCoder encodeSize:_minItemSize forKey:CPCollectionViewMinItemSizeKey];
if (!CGSizeEqualToSize(_maxItemSize, CGSizeMakeZero()))
[aCoder encodeSize:_maxItemSize forKey:CPCollectionViewMaxItemSizeKey];
[aCoder encodeBool:_isSelectable forKey:CPCollectionViewSelectableKey];
[aCoder encodeFloat:_verticalMargin forKey:CPCollectionViewVerticalMarginKey];
[aCoder encodeObject:_backgroundColors forKey:CPCollectionViewBackgroundColorsKey];
}
@end
@end
+85
View File
@@ -0,0 +1,85 @@
/*
* CPCollectionViewItem.j
* AppKit
*
* Created by Francisco Tolmasky.
* Copyright 2009, 280 North, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
@import "CPViewController.j"
/*!
Represents an object inside a CPCollectionView.
*/
@implementation CPCollectionViewItem : CPViewController
{
BOOL _isSelected;
}
// Setting the Represented Object
/*!
Sets the object to be represented by this item.
@param anObject the object to be represented
*/
- (void)setRepresentedObject:(id)anObject
{
[super setRepresentedObject:anObject];
var view = [self view];
if ([view respondsToSelector:@selector(setRepresentedObject:)])
[view setRepresentedObject:[self representedObject]];
}
// Modifying the Selection
/*!
Sets whether this view item should be selected.
@param shouldBeSelected \c YES makes the item selected. \c NO deselects it.
*/
- (void)setSelected:(BOOL)shouldBeSelected
{
shouldBeSelected = !!shouldBeSelected;
if (_isSelected === shouldBeSelected)
return;
_isSelected = shouldBeSelected;
var view = [self view];
if ([view respondsToSelector:@selector(setSelected:)])
[view setSelected:[self isSelected]];
}
/*!
Returns \c YES if the item is currently selected. \c NO if the item is not selected.
*/
- (BOOL)isSelected
{
return _isSelected;
}
// Parent Collection View
/*!
Returns the collection view of which this item is a part.
*/
- (CPCollectionView)collectionView
{
return [_view superview];
}
@end
+294 -62
View File
@@ -20,12 +20,13 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
import <Foundation/CPObject.j>
@import <Foundation/CPObject.j>
import "CGColor.j"
@import "CGColor.j"
@import "CPCompatibility.j"
@import "CPImage.j"
import "CPCompatibility.j"
import "CPImage.j"
var _redComponent = 0,
_greenComponent = 1,
@@ -36,17 +37,37 @@ var _hueComponent = 0,
_saturationComponent = 1,
_brightnessComponent = 2;
/*
<code>CPColor</code> can be used to represent color
var cachedBlackColor,
cachedRedColor,
cachedGreenColor,
cachedBlueColor,
cachedYellowColor,
cachedGrayColor,
cachedLightGrayColor,
cachedDarkGrayColor,
cachedWhiteColor,
cachedBrownColor,
cachedCyanColor,
cachedMagentaColor,
cachedOrangeColor,
cachedPurpleColor,
cachedShadowColor,
cachedClearColor;
/*!
@ingroup appkit
@code CPColor
\c CPColor can be used to represent color
in an RGB or HSB model with an optional transparency value.</p>
<p>It also provides some class helper methods that
returns instances of commonly used colors.</p>
<p>The class does not have a <code>set:</code> method
<p>The class does not have a \c -set: method
like NextStep based frameworks to change the color of
the current context. To change the color of the current
context, use <objj>CGContextSetFillColor()</objj>.
context, use CGContextSetFillColor().
*/
@implementation CPColor : CPObject
{
@@ -56,7 +77,27 @@ var _hueComponent = 0,
CPString _cssString;
}
/*
/*!
Creates a color in the RGB color space, with an alpha value.
Each component should be between the range of 0.0 to 1.0. For
the alpha component, a value of 1.0 is opaque, and 0.0 means
completely transparent.
@param red the red component of the color
@param green the green component of the color
@param blue the blue component of the color
@param alpha the alpha component
@return a color initialized to the values specified
*/
+ (CPColor)colorWithRed:(float)red green:(float)green blue:(float)blue alpha:(float)alpha
{
return [[CPColor alloc] _initWithRGBA:[red, green, blue, alpha]];
}
/*!
@deprecated in favor of colorWithRed:green:blue:alpha:
Creates a color in the RGB color space, with an alpha value.
Each component should be between the range of 0.0 to 1.0. For
the alpha component, a value of 1.0 is opaque, and 0.0 means
@@ -71,11 +112,28 @@ var _hueComponent = 0,
*/
+ (CPColor)colorWithCalibratedRed:(float)red green:(float)green blue:(float)blue alpha:(float)alpha
{
return [[CPColor alloc] _initWithRGBA:[red, green, blue, alpha]];
return [self colorWithRed:red green:green blue:blue alpha:alpha];
}
/*
Creates a new color object with <code>white</code> for the RGB components.
/*!
Creates a new color object with \c white for the RGB components.
For the alpha component, a value of 1.0 is opaque, and 0.0 means completely transparent.
@param white a float between 0.0 and 1.0
@param alpha the alpha component between 0.0 and 1.0
@return a color initialized to the values specified
*/
+ (CPColor)colorWithWhite:(float)white alpha:(float)alpha
{
return [[CPColor alloc] _initWithRGBA:[white, white, white, alpha]];
}
/*!
@deprecated in favor of colorWithWhite:apha:
Creates a new color object with \c white for the RGB components.
For the alpha component, a value of 1.0 is opaque, and 0.0 means completely transparent.
@param white a float between 0.0 and 1.0
@@ -85,10 +143,10 @@ var _hueComponent = 0,
*/
+ (CPColor)colorWithCalibratedWhite:(float)white alpha:(float)alpha
{
return [[CPColor alloc] _initWithRGBA:[white, white, white, alpha]];
return [self colorWithWhite:white alpha:alpha];
}
/*
/*!
Creates a new color in HSB space.
@param hue the hue value
@@ -99,8 +157,13 @@ var _hueComponent = 0,
*/
+ (CPColor)colorWithHue:(float)hue saturation:(float)saturation brightness:(float)brightness
{
if(saturation == 0.0)
return [CPColor colorWithCalibratedWhite: brightness/100.0 alpha: 1.0];
return [self colorWithHue:hue saturation:saturation brightness:brightness alpha:1.0];
}
+ (CPColor)colorWithHue:(float)hue saturation:(float)saturation brightness:(float)brightness alpha:(float)alpha
{
if(saturation === 0.0)
return [CPColor colorWithCalibratedWhite:brightness / 100.0 alpha:alpha];
var f = hue % 60,
p = (brightness * (100 - saturation)) / 10000,
@@ -110,16 +173,16 @@ var _hueComponent = 0,
switch(FLOOR(hue / 60))
{
case 0: return [CPColor colorWithCalibratedRed: b green: t blue: p alpha: 1.0];
case 1: return [CPColor colorWithCalibratedRed: q green: b blue: p alpha: 1.0];
case 2: return [CPColor colorWithCalibratedRed: p green: b blue: t alpha: 1.0];
case 3: return [CPColor colorWithCalibratedRed: p green: q blue: b alpha: 1.0];
case 4: return [CPColor colorWithCalibratedRed: t green: p blue: b alpha: 1.0];
case 5: return [CPColor colorWithCalibratedRed: b green: p blue: q alpha: 1.0];
case 0: return [CPColor colorWithCalibratedRed: b green: t blue: p alpha: alpha];
case 1: return [CPColor colorWithCalibratedRed: q green: b blue: p alpha: alpha];
case 2: return [CPColor colorWithCalibratedRed: p green: b blue: t alpha: alpha];
case 3: return [CPColor colorWithCalibratedRed: p green: q blue: b alpha: alpha];
case 4: return [CPColor colorWithCalibratedRed: t green: p blue: b alpha: alpha];
case 5: return [CPColor colorWithCalibratedRed: b green: p blue: q alpha: alpha];
}
}
/*
/*!
Creates an RGB color from a hexadecimal string. For example,
the a string of "FFFFFF" would return a white CPColor.
"FF0000" would return a pure red, "00FF00" would return a
@@ -134,88 +197,196 @@ var _hueComponent = 0,
return [[CPColor alloc] _initWithRGBA: hexToRGB(hex)];
}
/*
/*!
Returns a black color object. (RGBA=[0.0, 0.0, 0.0, 1.0])
*/
+ (CPColor)blackColor
{
return [[CPColor alloc] _initWithRGBA:[0.0, 0.0, 0.0, 1.0]];
if (!cachedBlackColor)
cachedBlackColor = [[CPColor alloc] _initWithRGBA:[0.0, 0.0, 0.0, 1.0]];
return cachedBlackColor;
}
/*
/*!
Returns a blue color object. (RGBA=[0.0, 0.0, 1.0, 1.0])
*/
+ (CPColor)blueColor
{
return [[CPColor alloc] _initWithRGBA:[0.0, 0.0, 1.0, 1.0]];
if (!cachedBlueColor)
cachedBlueColor = [[CPColor alloc] _initWithRGBA:[0.0, 0.0, 1.0, 1.0]];
return cachedBlueColor;
}
/*
/*!
Returns a dark gray color object. (RGBA=[0.33 ,0.33, 0.33, 1.0])
*/
+ (CPColor)darkGrayColor
{
return [CPColor colorWithCalibratedWhite:1.0 / 3.0 alpha:1.0];
if (!cachedDarkGrayColor)
cachedDarkGrayColor = [CPColor colorWithCalibratedWhite:1.0 / 3.0 alpha:1.0];
return cachedDarkGrayColor;
}
/*
/*!
Returns a gray color object. (RGBA=[0.5, 0.5, 0.5, 1.0])
*/
+ (CPColor)grayColor
{
return [CPColor colorWithCalibratedWhite:0.5 alpha: 1.0];
if (!cachedGrayColor)
cachedGrayColor = [CPColor colorWithCalibratedWhite:0.5 alpha: 1.0];
return cachedGrayColor;
}
/*
/*!
Returns a green color object. (RGBA=[0.0, 1.0, 0.0, 1.0])
*/
+ (CPColor)greenColor
{
return [[CPColor alloc] _initWithRGBA:[0.0, 1.0, 0.0, 1.0]];
if (!cachedGreenColor)
cachedGreenColor = [[CPColor alloc] _initWithRGBA:[0.0, 1.0, 0.0, 1.0]];
return cachedGreenColor;
}
/*
/*!
Returns a light gray color object (RGBA=[0.66, 0.66, 0.66, 1.0])
*/
+ (CPColor)lightGrayColor
{
return [CPColor colorWithCalibratedWhite:2.0 / 3.0 alpha:1.0];
if (!cachedLightGrayColor)
cachedLightGrayColor = [CPColor colorWithCalibratedWhite:2.0 / 3.0 alpha:1.0];
return cachedLightGrayColor;
}
/*
/*!
Returns a red color object (RGBA=[1.0, 0.0, 0.0, 1.0])
*/
+ (CPColor)redColor
{
return [[CPColor alloc] _initWithRGBA:[1.0, 0.0, 0.0, 1.0]];
if (!cachedRedColor)
cachedRedColor = [[CPColor alloc] _initWithRGBA:[1.0, 0.0, 0.0, 1.0]];
return cachedRedColor;
}
/*
/*!
Returns a white color object (RGBA=[1.0, 1.0, 1.0, 1.0])
*/
+ (CPColor)whiteColor
{
return [[CPColor alloc] _initWithRGBA:[1.0, 1.0, 1.0, 1.0]];
if (!cachedWhiteColor)
cachedWhiteColor = [[CPColor alloc] _initWithRGBA:[1.0, 1.0, 1.0, 1.0]];
return cachedWhiteColor;
}
/*
/*!
Returns a yellow color object (RGBA=[1.0, 1.0, 0.0, 1.0])
*/
+ (CPColor)yellowColor
{
return [[CPColor alloc] _initWithRGBA:[1.0, 1.0, 0.0, 1.0]];
if (!cachedYellowColor)
cachedYellowColor = [[CPColor alloc] _initWithRGBA:[1.0, 1.0, 0.0, 1.0]];
return cachedYellowColor;
}
/*
/*!
Returns a brown color object (RGBA=[0.6, 0.4, 0.2, 1.0])
*/
+ (CPColor)brownColor
{
if (!cachedBrownColor)
cachedBrownColor = [[CPColor alloc] _initWithRGBA:[0.6, 0.4, 0.2, 1.0]];
return cachedBrownColor;
}
/*!
Returns a cyan color object (RGBA=[0.0, 1.0, 1.0, 1.0])
*/
+ (CPColor)cyanColor
{
if (!cachedCyanColor)
cachedCyanColor = [[CPColor alloc] _initWithRGBA:[0.0, 1.0, 1.0, 1.0]];
return cachedCyanColor;
}
/*!
Returns a magenta color object (RGBA=[1.0, 0.0, 1.0, 1.0])
*/
+ (CPColor)magentaColor
{
if (!cachedMagentaColor)
cachedMagentaColor = [[CPColor alloc] _initWithRGBA:[1.0, 0.0, 1.0, 1.0]];
return cachedMagentaColor;
}
/*!
Returns a orange color object (RGBA=[1.0, 0.5, 0.0, 1.0])
*/
+ (CPColor)orangeColor
{
if (!cachedOrangeColor)
cachedOrangeColor = [[CPColor alloc] _initWithRGBA:[1.0, 0.5, 0.0, 1.0]];
return cachedOrangeColor;
}
/*!
Returns a purple color object (RGBA=[0.5, 0.0, 0.5, 1.0])
*/
+ (CPColor)purpleColor
{
if (!cachedPurpleColor)
cachedPurpleColor = [[CPColor alloc] _initWithRGBA:[0.5, 0.0, 0.5, 1.0]];
return cachedPurpleColor;
}
/*!
Returns a shadow looking color (RGBA=[0.0, 0.0, 0.0, 0.33])
*/
+ (CPColor)shadowColor
{
return [[CPColor alloc] _initWithRGBA:[0.0, 0.0, 0.0, 1.0 / 3.0]];
if (!cachedShadowColor)
cachedShadowColor = [[CPColor alloc] _initWithRGBA:[0.0, 0.0, 0.0, 1.0 / 3.0]];
return cachedShadowColor;
}
/*
Creates a color using a tile pattern with <code>anImage</code>
/*!
Returns a clear color (RGBA=[0.0, 0.0, 0.0, 0.0])
*/
+ (CPColor)clearColor
{
if (!cachedClearColor)
cachedClearColor = [self colorWithCalibratedWhite:0.0 alpha:0.0];
return cachedClearColor;
}
+ (CPColor)alternateSelectedControlColor
{
return [[CPColor alloc] _initWithRGBA:[0.22, 0.46, 0.84, 1.0]];
}
+ (CPColor)secondarySelectedControlColor
{
return [[CPColor alloc] _initWithRGBA:[0.83, 0.83, 0.83, 1.0]];
}
/*!
Creates a color using a tile pattern with \c anImage
@param the image to tile
@return a tiled image color object
*/
@@ -224,8 +395,8 @@ var _hueComponent = 0,
return [[CPColor alloc] _initWithPatternImage:anImage];
}
/*
Creates a <objj>CPColor</objj> from a valid CSS RGB string. Example, "rgb(32,64,129)".
/*!
Creates a CPColor from a valid CSS RGB string. Example, "rgb(32,64,129)".
@param aString a CSS color string
@return a color initialized to the value in the css string
@@ -322,13 +493,13 @@ var _hueComponent = 0,
if (self)
{
_patternImage = anImage;
_cssString = "url(\"" + _patternImage._filename + "\")";
_cssString = "url(\"" + [_patternImage filename] + "\")";
}
return self;
}
/*
/*!
Returns the image being used as the pattern for the tile in this color.
*/
- (CPImage)patternImage
@@ -336,7 +507,7 @@ var _hueComponent = 0,
return _patternImage;
}
/*
/*!
Returns the alpha component of this color.
*/
- (float)alphaComponent
@@ -344,7 +515,7 @@ var _hueComponent = 0,
return _components[3];
}
/*
/*!
Returns the blue component of this color.
*/
- (float)blueComponent
@@ -352,7 +523,7 @@ var _hueComponent = 0,
return _components[2];
}
/*
/*!
Returns the green component of this color.
*/
- (float)greenComponent
@@ -360,7 +531,7 @@ var _hueComponent = 0,
return _components[1];
}
/*
/*!
Return the red component of this color.
*/
- (float)redComponent
@@ -368,7 +539,7 @@ var _hueComponent = 0,
return _components[0];
}
/*
/*!
Returns the RGBA components of this color in an array.
The index values are ordered as:
<pre>
@@ -384,7 +555,7 @@ var _hueComponent = 0,
return _components;
}
/*
/*!
Returns a new color with the same RGB as the receiver but a new alpha component.
@param anAlphaComponent the alpha component for the new color
@@ -400,7 +571,7 @@ var _hueComponent = 0,
return [[[self class] alloc] _initWithRGBA:components];
}
/*
/*!
Returns an array with the HSB values for this color.
The index values are ordered as:
<pre>
@@ -451,7 +622,7 @@ var _hueComponent = 0,
];
}
/*
/*!
Returns the CSS representation of this color. The color will
be in one of the following forms:
<pre>
@@ -465,7 +636,7 @@ url("data:image/png;base64,BASE64ENCODEDDATA") // if there is a pattern image
return _cssString;
}
/*
/*!
Returns a 6 character long hex string of this color.
*/
- (CPString)hexString
@@ -473,6 +644,62 @@ url("data:image/png;base64,BASE64ENCODEDDATA") // if there is a pattern image
return rgbToHex([self redComponent], [self greenComponent], [self blueComponent])
}
- (BOOL)isEqual:(CPColor)aColor
{
if (!aColor)
return NO;
if (aColor === self)
return YES;
return [aColor isKindOfClass:CPColor] && [aColor cssString] === [self cssString];
}
- (CPString)description
{
return [super description]+" "+[self cssString];
}
@end
@implementation CPColor (CoreGraphicsExtensions)
/*!
Set's the receiver to be the fill and stroke color in the current graphics context
*/
- (void)set
{
[self setFill];
[self setStroke];
}
/*!
Set's the receiver to be the fill color in the current graphics context
*/
- (void)setFill
{
var ctx = [[CPGraphicsContext currentContext] graphicsPort];
CGContextSetFillColor(ctx, self);
}
/*!
Set's the receiver to be the stroke color in the current graphics context
*/
- (void)setStroke
{
var ctx = [[CPGraphicsContext currentContext] graphicsPort];
CGContextSetStrokeColor(ctx, self);
}
@end
@implementation CPColor (Debugging)
+ (CPColor)randomColor
{
return [CPColor colorWithRed:RAND() green:RAND() blue:RAND() alpha:1.0];
}
@end
var CPColorComponentsKey = @"CPColorComponentsKey",
@@ -480,7 +707,7 @@ var CPColorComponentsKey = @"CPColorComponentsKey",
@implementation CPColor (CPCoding)
/*
/*!
Initializes this color from the data archived in a coder.
@param aCoder the coder from which the color will be loaded
*/
@@ -492,7 +719,7 @@ var CPColorComponentsKey = @"CPColorComponentsKey",
return [self _initWithRGBA:[aCoder decodeObjectForKey:CPColorComponentsKey]];
}
/*
/*!
Archives this color into a coder.
@param aCoder the coder into which the color will be archived.
*/
@@ -508,14 +735,19 @@ var CPColorComponentsKey = @"CPColorComponentsKey",
var hexCharacters = "0123456789ABCDEF";
/*
Used for the <objj>CPColor</objj> <code>colorWithHexString:</code> implementation
// HACK: prevent these from becoming globals. workaround for obj-j "function foo(){}" behavior
var hexToRGB, integerToBytes, rgbToHex, byteToHex;
/*!
Used for the CPColor \c +colorWithHexString: implementation
@ignore
@class CPColor
@return an array of rgb components
*/
function hexToRGB(hex)
{
if ( hex.length == 3 )
hex = hex.charAt(0) + hex.charAt(0) + hex.charAt(1) + hex.charAt(1) + hex.charAt(2) + hex.charAt(2);
if(hex.length != 6)
return null;
+208 -229
View File
@@ -20,75 +20,76 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
import "CPButton.j"
import "CPColorPicker.j"
import "CPCookie.j"
import "CPKulerColorPicker.j"
import "CPPanel.j"
import "CPSliderColorPicker.j"
import "CPView.j"
@import "CPButton.j"
@import "CPCookie.j"
@import "CPPanel.j"
@import "CPView.j"
CPColorPanelColorDidChangeNotification = @"CPColorPanelColorDidChangeNotification";
var PREVIEW_HEIGHT = 20.0,
TOOLBAR_HEIGHT = 32.0,
SWATCH_HEIGHT = 14.0;
var SharedColorPanel = nil;
SWATCH_HEIGHT = 14.0,
ICON_WIDTH = 32.0,
ICON_PADDING = 12.0;
var SharedColorPanel = nil,
ColorPickerClasses = [];
/*
A color wheel
@global
@group CPColorPanelMode
*/
CPWheelColorPickerMode = 1;
/*
Kuler color picker
@global
@group CPColorPanelMode
*/
CPKulerColorPickerMode = 2;
/*
Slider based picker
@global
@group CPColorPanelMode
*/
CPSliderColorPickerMode = 3;
CPSliderColorPickerMode = 2;
CPColorPickerViewWidth = 265,
CPColorPickerViewHeight = 370;
/*
<objj>CPColorPanel</objj> provides a reusable panel that can be used
/*!
@ingroup appkit
@class CPColorPanel
CPColorPanel provides a reusable panel that can be used
displayed on screen to prompt the user for a color selection. To
obtain the panel, call the <code>sharedColorPanel</code> method.
obtain the panel, call the \c +sharedColorPanel method.
*/
@implementation CPColorPanel : CPPanel
{
_CPColorPanelToolbar _toolbar;
_CPColorPanelSwatches _swatchView;
_CPColorPanelPreview _previewView;
CPTextField _previewLabel;
CPTextField _swatchLabel;
CPView _activeView;
CPColorPicker _activePicker;
CPColorPicker _wheelPicker;
CPColorPicker _kulerPicker;
CPColorPicker _sliderPicker;
CPSlider _opacitySlider;
CPArray _colorPickers;
CPView _currentView;
id _activePicker;
CPColor _color;
id _target;
SEL _action;
int _mode;
SEL _action;
int _mode;
}
/*
/*!
A list of color pickers is collected here, and any color panel created will contain
any picker in this list up to this point. In other words, call before creating a color panel.
*/
+ (void)provideColorPickerClass:(Class)aColorPickerSubclass
{
ColorPickerClasses.push(aColorPickerSubclass);
}
/*!
Returns (and if necessary, creates) the shared color panel.
*/
+ (CPColorPanel)sharedColorPanel
@@ -99,7 +100,7 @@ CPColorPickerViewHeight = 370;
return SharedColorPanel;
}
/*
/*!
Sets the mode for the shared color panel.
@param mode the mode to which the color panel will be set
*/
@@ -110,31 +111,33 @@ CPColorPickerViewHeight = 370;
}
/*
To obtain the color panel, use <code>sharedColorPanel</code>.
To obtain the color panel, use \c +sharedColorPanel.
@ignore
*/
- (id)init
{
self = [super initWithContentRect:CGRectMake(500.0, 50.0, 218.0, 360.0)
styleMask:(CPHUDBackgroundWindowMask | CPTitledWindowMask | CPClosableWindowMask | CPResizableWindowMask)];
self = [super initWithContentRect:CGRectMake(500.0, 50.0, 219.0, 370.0)
styleMask:(CPTitledWindowMask | CPClosableWindowMask | CPResizableWindowMask)];
if (self)
{
[[self contentView] setBackgroundColor:[CPColor colorWithWhite:0.95 alpha:1.0]];
[self setTitle:@"Color Panel"];
[self setLevel:CPFloatingWindowLevel];
[self setFloatingPanel:YES];
[self setBecomesKeyOnlyIfNeeded:YES];
[self setMinSize:CGSizeMake(218.0, 360.0)];
[self setMaxSize:CGSizeMake(327.0, 540.0)];
[self setMinSize:CGSizeMake(219.0, 342.0)];
[self setMaxSize:CGSizeMake(323.0, 537.0)];
}
return self;
}
/*
Sets the color of the panel, and updates the picker. Also posts a <code>CPColorPanelDidChangeNotification</code>.
/*!
Sets the color of the panel, and updates the picker. Also posts a \c CPColorPanelDidChangeNotification.
*/
- (void)setColor:(CPColor)aColor
{
@@ -144,28 +147,30 @@ CPColorPickerViewHeight = 370;
[CPApp sendAction:@selector(changeColor:) to:nil from:self];
if (_target && _action)
objj_msgSend(_target, _action, self);
[CPApp sendAction:_action to:_target from:self];
[[CPNotificationCenter defaultCenter]
postNotificationName:CPColorPanelColorDidChangeNotification
object:self];
[_activePicker setColor:_color];
[_opacitySlider setFloatValue:[_color alphaComponent]];
}
/*
/*!
Sets the selected color of the panel and optionally updates the picker.
@param bool whether or not to update the picker
@ignore
*/
-(void)setColor:(CPColor)aColor updatePicker:(BOOL)bool
{
[self setColor: aColor];
- (void)setColor:(CPColor)aColor updatePicker:(BOOL)bool
{
[self setColor:aColor];
if (bool)
[_activePicker setColor:_color];
}
if(bool)
[_activePicker setColor: _color];
}
/*
/*!
Returns the panel's currently selected color.
*/
- (CPColor)color
@@ -173,7 +178,12 @@ CPColorPickerViewHeight = 370;
return _color;
}
/*
- (float)opacity
{
return [_opacitySlider floatValue];
}
/*!
Sets the target for the color panel. Messages are sent
to the target when colors are selected in the panel.
*/
@@ -182,7 +192,7 @@ CPColorPickerViewHeight = 370;
_target = aTarget;
}
/*
/*!
Returns the current target. The target receives messages
when colors are selected in the panel.
*/
@@ -191,7 +201,7 @@ CPColorPickerViewHeight = 370;
return _target;
}
/*
/*!
Sets the action that gets sent to the target.
This action is sent whenever a color is selected in the panel.
@param anAction the action that will be sent
@@ -201,7 +211,7 @@ CPColorPickerViewHeight = 370;
_action = anAction;
}
/*
/*!
Returns the current target action.
*/
- (selector)action
@@ -209,36 +219,47 @@ CPColorPickerViewHeight = 370;
return _action;
}
/*
/*!
Sets the mode (look) of the color panel.
@param mode the mode in which to display the color panel
*/
- (void)setMode:(CPColorPanelMode)mode
{
if(mode == _mode)
return;
var frame = CPRectCreateCopy([_currentView frame]);
[_currentView removeFromSuperview];
switch(mode)
{
case CPWheelColorPickerMode: _activePicker = _wheelPicker; break;
case CPKulerColorPickerMode: _activePicker = _kulerPicker; break;
case CPSliderColorPickerMode: _activePicker = _sliderPicker; break;
}
_currentView = [_activePicker provideNewView: NO];
[_activePicker setColor: _color];
_mode = mode;
[_currentView setFrame: frame];
[_currentView setAutoresizingMask: (CPViewWidthSizable | CPViewHeightSizable)];
[[self contentView] addSubview: _currentView];
}
/*
- (void)_setPicker:(id)sender
{
var picker = _colorPickers[[sender tag]],
view = [picker provideNewView:NO];
if (!view)
view = [picker provideNewView:YES];
if (view == _currentView)
return;
if (_currentView)
[view setFrame:[_currentView frame]];
else
{
var height = (TOOLBAR_HEIGHT+10+PREVIEW_HEIGHT+5+SWATCH_HEIGHT+32),
bounds = [[self contentView] bounds];
[view setFrameSize: CPSizeMake(bounds.size.width - 10, bounds.size.height - height)];
[view setFrameOrigin: CPPointMake(5, height)];
}
[_currentView removeFromSuperview];
[[self contentView] addSubview:view];
_currentView = view;
_activePicker = picker;
[picker setColor:[self color]];
}
/*!
Returns the color panel's current display mode.
*/
- (CPColorPanelMode)mode
@@ -249,7 +270,6 @@ CPColorPickerViewHeight = 370;
- (void)orderFront:(id)aSender
{
[self _loadContentsIfNecessary];
[super orderFront:aSender];
}
@@ -258,178 +278,130 @@ CPColorPickerViewHeight = 370;
{
if (_toolbar)
return;
if (!_color)
_color = [CPColor whiteColor];
_colorPickers = [];
var count = [ColorPickerClasses count];
for (var i=0; i<count; i++)
{
var currentPickerClass = ColorPickerClasses[i],
currentPicker = [[currentPickerClass alloc] initWithPickerMask:0 colorPanel:self];
_colorPickers.push(currentPicker);
}
var contentView = [self contentView],
bounds = [contentView bounds];
_toolbar = [[_CPColorPanelToolbar alloc] initWithFrame: CPRectMake(0, 0, CGRectGetWidth(bounds), TOOLBAR_HEIGHT)];
_toolbar = [[CPView alloc] initWithFrame:CGRectMake(0, 6, CGRectGetWidth(bounds), TOOLBAR_HEIGHT)];
[_toolbar setAutoresizingMask: CPViewWidthSizable];
var totalToolbarWidth = count * ICON_WIDTH + (count - 1) * ICON_PADDING,
leftOffset = (CGRectGetWidth(bounds) - totalToolbarWidth) / 2.0,
buttonForLater = nil;
for (var i=0; i<count; i++)
{
var image = [_colorPickers[i] provideNewButtonImage],
highlightImage = [_colorPickers[i] provideNewAlternateButtonImage],
button = [[CPButton alloc] initWithFrame:CGRectMake(leftOffset + i*(ICON_WIDTH+ICON_PADDING), 0, ICON_WIDTH, ICON_WIDTH)];
[button setTag:i];
[button setTarget:self];
[button setAction:@selector(_setPicker:)];
[button setBordered:NO];
[button setAutoresizingMask:CPViewMinXMargin|CPViewMaxXMargin];
[button setImage:image];
[button setAlternateImage:highlightImage];
[_toolbar addSubview:button];
if (!buttonForLater)
buttonForLater = button;
}
// FIXME: http://280north.lighthouseapp.com/projects/13294-cappuccino/tickets/25-implement-cpbox
var previewBox = [[CPView alloc] initWithFrame:CGRectMake(76, TOOLBAR_HEIGHT + 10, CGRectGetWidth(bounds) - 86, PREVIEW_HEIGHT)];
_previewView = [[_CPColorPanelPreview alloc] initWithFrame:CGRectInset([previewBox bounds], 2.0, 2.0)];
[_previewView setColorPanel:self];
[_previewView setAutoresizingMask:CPViewWidthSizable];
[previewBox setBackgroundColor:[CPColor grayColor]];
[previewBox setBackgroundColor:[CPColor colorWithWhite:0.8 alpha:1.0]];
[previewBox setAutoresizingMask:CPViewWidthSizable];
[previewBox addSubview:_previewView];
_previewLabel = [[CPTextField alloc] initWithFrame: CPRectMake(10, TOOLBAR_HEIGHT + 14, 60, 15)];
var _previewLabel = [[CPTextField alloc] initWithFrame: CPRectMake(10, TOOLBAR_HEIGHT + 10, 60, 15)];
[_previewLabel setStringValue: "Preview:"];
[_previewLabel setTextColor:[CPColor whiteColor]];
[_previewLabel setTextColor:[CPColor blackColor]];
[_previewLabel setAlignment:CPRightTextAlignment];
// FIXME: http://280north.lighthouseapp.com/projects/13294-cappuccino/tickets/25-implement-cpbox
var swatchBox = [[CPView alloc] initWithFrame:CGRectMake(76, TOOLBAR_HEIGHT + 10 + PREVIEW_HEIGHT + 5, CGRectGetWidth(bounds) - 86, SWATCH_HEIGHT + 2.0)];
[swatchBox setBackgroundColor:[CPColor grayColor]];
[swatchBox setBackgroundColor:[CPColor colorWithWhite:0.8 alpha:1.0]];
[swatchBox setAutoresizingMask:CPViewWidthSizable];
_swatchView = [[_CPColorPanelSwatches alloc] initWithFrame:CGRectInset([swatchBox bounds], 1.0, 1.0)];
[_swatchView setColorPanel: self];
[_swatchView setAutoresizingMask: CPViewWidthSizable];
[swatchBox addSubview:_swatchView];
_swatchLabel = [[CPTextField alloc] initWithFrame: CPRectMake(10, TOOLBAR_HEIGHT + 8 + PREVIEW_HEIGHT + 5, 60, 15)];
var _swatchLabel = [[CPTextField alloc] initWithFrame: CPRectMake(10, TOOLBAR_HEIGHT + 8 + PREVIEW_HEIGHT + 6, 60, 15)];
[_swatchLabel setStringValue: "Swatches:"];
[_swatchLabel setTextColor:[CPColor whiteColor]];
[_swatchLabel setTextColor:[CPColor blackColor]];
[_swatchLabel setAlignment:CPRightTextAlignment];
_wheelPicker = [[CPColorWheelColorPicker alloc] initWithPickerMask: 1|2|3 colorPanel: self];
_currentView = [_wheelPicker provideNewView: YES];
var height = (TOOLBAR_HEIGHT+10+PREVIEW_HEIGHT+5+SWATCH_HEIGHT+10);
[_currentView setFrameSize: CPSizeMake(bounds.size.width - 10, bounds.size.height - height)];
[_currentView setFrameOrigin: CPPointMake(5, TOOLBAR_HEIGHT+10+PREVIEW_HEIGHT+5+SWATCH_HEIGHT+10)];
[_currentView setAutoresizingMask: (CPViewWidthSizable | CPViewHeightSizable)];
var opacityLabel = [[CPTextField alloc] initWithFrame: CPRectMake(10, TOOLBAR_HEIGHT + PREVIEW_HEIGHT + 35, 60, 20)];
[opacityLabel setStringValue: "Opacity:"];
[opacityLabel setTextColor:[CPColor blackColor]];
[opacityLabel setAlignment:CPRightTextAlignment];
_kulerPicker = [[CPKulerColorPicker alloc] initWithPickerMask: 1|2|3 colorPanel: self];
[_kulerPicker provideNewView: YES];
_sliderPicker = [[CPSliderColorPicker alloc] initWithPickerMask: 1|2|3 colorPanel: self];
[_sliderPicker provideNewView: YES];
[contentView addSubview: _toolbar];
[contentView addSubview: previewBox];
[contentView addSubview: _previewLabel];
[contentView addSubview: swatchBox];
[contentView addSubview: _swatchLabel];
[contentView addSubview: _currentView];
_opacitySlider = [[CPSlider alloc] initWithFrame:CGRectMake(76, TOOLBAR_HEIGHT + PREVIEW_HEIGHT + 34, CGRectGetWidth(bounds) - 86, 20.0)];
[_opacitySlider setMinValue:0.0];
[_opacitySlider setMaxValue:1.0];
[_opacitySlider setTarget:self];
[_opacitySlider setAction:@selector(setOpacity:)];
[contentView addSubview:_toolbar];
[contentView addSubview:previewBox];
[contentView addSubview:_previewLabel];
[contentView addSubview:swatchBox];
[contentView addSubview:_swatchLabel];
[contentView addSubview:opacityLabel];
[contentView addSubview:_opacitySlider];
_target = nil;
_action = nil;
_activePicker = _wheelPicker;
[self setColor:[CPColor whiteColor]];
[_activePicker setColor:[CPColor whiteColor]];
_activePicker = nil;
[_previewView setBackgroundColor: _color];
if (buttonForLater)
[self _setPicker:buttonForLater];
}
- (void)setOpacity:(id)sender
{
var components = [[self color] components],
alpha = [sender floatValue];
[self setColor:[_color colorWithAlphaComponent:alpha] updatePicker:YES];
}
@end
var iconSize = 32,
totalIcons = 3;
/* @ignore */
@implementation _CPColorPanelToolbar : CPView
{
CPImage _wheelImage;
CPImage _wheelAlternateImage;
CPButton _wheelButton;
CPImage _sliderImage;
CPImage _sliderAlternateImage;
CPButton _sliderButton;
CPImage _kulerImage;
CPImage _kulerAlternateImage;
CPButton _kulerButton;
}
- (id)initWithFrame:(CPRect)aFrame
{
self = [super initWithFrame:aFrame];
var width = aFrame.size.width;
var center = width / 2.0;
var start = center - ((totalIcons * iconSize) + (totalIcons - 1) * 8.0) / 2.0;
_wheelButton = [[CPButton alloc] initWithFrame:CPRectMake(start, 0, iconSize, iconSize)];
start += iconSize + 8;
var path = [[CPBundle bundleForClass: _CPColorPanelToolbar] pathForResource:@"wheel_button.png"];
_wheelImage = [[CPImage alloc] initWithContentsOfFile:path size: CPSizeMake(iconSize, iconSize)];
path = [[CPBundle bundleForClass: _CPColorPanelToolbar] pathForResource:@"wheel_button_h.png"];
_wheelAlternateImage = [[CPImage alloc] initWithContentsOfFile:path size: CPSizeMake(iconSize, iconSize)];
[_wheelButton setBordered:NO];
[_wheelButton setImage: _wheelImage];
[_wheelButton setAlternateImage: _wheelAlternateImage];
[_wheelButton setTarget: self];
[_wheelButton setAction: @selector(setMode:)];
[_wheelButton setAutoresizingMask:CPViewMinXMargin | CPViewMaxXMargin];
[self addSubview: _wheelButton];
_sliderButton = [[CPButton alloc] initWithFrame:CPRectMake(start, 0, iconSize, iconSize)];
start += iconSize + 8;
path = [[CPBundle bundleForClass: _CPColorPanelToolbar] pathForResource:@"slider_button.png"];
_sliderImage = [[CPImage alloc] initWithContentsOfFile:path size: CPSizeMake(iconSize, iconSize)];
path = [[CPBundle bundleForClass: _CPColorPanelToolbar] pathForResource:@"slider_button_h.png"];
_sliderAlternateImage = [[CPImage alloc] initWithContentsOfFile:path size: CPSizeMake(iconSize, iconSize)];
[_sliderButton setBordered:NO];
[_sliderButton setImage: _sliderImage];
[_sliderButton setAlternateImage: _sliderAlternateImage];
[_sliderButton setTarget: self];
[_sliderButton setAction: @selector(setMode:)];
[_sliderButton setAutoresizingMask:CPViewMinXMargin | CPViewMaxXMargin];
[self addSubview: _sliderButton];
_kulerButton = [[CPButton alloc] initWithFrame:CPRectMake(start, 0, iconSize, iconSize)];
start += iconSize + 8;
path = [[CPBundle bundleForClass: _CPColorPanelToolbar] pathForResource:@"kuler_button.png"];
_kulerImage = [[CPImage alloc] initWithContentsOfFile:path size: CPSizeMake(iconSize, iconSize)];
path = [[CPBundle bundleForClass: _CPColorPanelToolbar] pathForResource:@"kuler_button_h.png"];
_kulerAlternateImage = [[CPImage alloc] initWithContentsOfFile:path size: CPSizeMake(iconSize, iconSize)];
[_kulerButton setBordered:NO];
[_kulerButton setImage: _kulerImage];
[_kulerButton setAlternateImage: _kulerAlternateImage];
[_kulerButton setTarget: self];
[_kulerButton setAction: @selector(setMode:)];
[_kulerButton setAutoresizingMask:CPViewMinXMargin | CPViewMaxXMargin];
[self addSubview: _kulerButton];
return self;
}
- (void)setMode:(id)sender
{
if(sender == _kulerButton)
[[CPColorPanel sharedColorPanel] setMode: CPKulerColorPickerMode];
else if(sender == _wheelButton)
[[CPColorPanel sharedColorPanel] setMode: CPWheelColorPickerMode];
else
[[CPColorPanel sharedColorPanel] setMode: CPSliderColorPickerMode];
}
@end
CPColorDragType = "CPColorDragType";
var CPColorPanelSwatchesCookie = "CPColorPanelSwatchesCookie";
@@ -519,7 +491,7 @@ var CPColorPanelSwatchesCookie = "CPColorPanelSwatchesCookie";
var future = new Date();
future.setYear(2019);
[_swatchCookie setValue: CPJSObjectCreateJSON(result) expires:future domain: nil];
[_swatchCookie setValue: JSON.stringify(result) expires:future domain: nil];
}
- (void)setColorPanel:(CPColorPanel)panel
@@ -546,9 +518,10 @@ var CPColorPanelSwatchesCookie = "CPColorPanelSwatchesCookie";
- (void)mouseUp:(CPEvent)anEvent
{
var point = [self convertPoint:[anEvent locationInWindow] fromView:nil];
var point = [self convertPoint:[anEvent locationInWindow] fromView:nil],
bounds = [self bounds];
if(point.x > [self bounds].size.width - 1 || point.x < 1)
if(!CGRectContainsPoint(bounds, point) || point.x > [self bounds].size.width - 1 || point.x < 1)
return NO;
[_colorPanel setColor: [self colorAtIndex:FLOOR(point.x / 13)] updatePicker: YES];
@@ -591,7 +564,7 @@ var CPColorPanelSwatchesCookie = "CPColorPanelSwatchesCookie";
- (void)pasteboard:(CPPasteboard)aPasteboard provideDataForType:(CPString)aType
{
if(aType == CPColorDragType)
[aPasteboard setData:_dragColor forType:aType];
[aPasteboard setData:[CPKeyedArchiver archivedDataWithRootObject:_dragColor] forType:aType];
}
- (void)performDragOperation:(id <CPDraggingInfo>)aSender
@@ -603,7 +576,7 @@ var CPColorPanelSwatchesCookie = "CPColorPanelSwatchesCookie";
if(![pasteboard availableTypeFromArray:[CPColorDragType]] || location.x > [self bounds].size.width - 1 || location.x < 1)
return NO;
[self setColor:[pasteboard dataForType:CPColorDragType] atIndex: FLOOR(location.x / 13)];
[self setColor:[CPKeyedUnarchiver unarchiveObjectWithData:[pasteboard dataForType:CPColorDragType]] atIndex: FLOOR(location.x / 13)];
}
@end
@@ -640,8 +613,8 @@ var CPColorPanelSwatchesCookie = "CPColorPanelSwatchesCookie";
if(![pasteboard availableTypeFromArray:[CPColorDragType]])
return NO;
var color = [pasteboard dataForType:CPColorDragType];
[_colorPanel setColor: color updatePicker: YES];
var color = [CPKeyedUnarchiver unarchiveObjectWithData:[pasteboard dataForType:CPColorDragType]];
[_colorPanel setColor:color updatePicker:YES];
}
- (BOOL)isOpaque
@@ -653,7 +626,7 @@ var CPColorPanelSwatchesCookie = "CPColorPanelSwatchesCookie";
{
var point = [self convertPoint:[anEvent locationInWindow] fromView:nil];
[[CPPasteboard pasteboardWithName:CPDragPboard] declareTypes:[CPArray arrayWithObject:CPColorDragType] owner:self];
[[CPPasteboard pasteboardWithName:CPDragPboard] declareTypes:[CPColorDragType] owner:self];
var bounds = CPRectMake(0, 0, 15, 15);
@@ -678,7 +651,13 @@ var CPColorPanelSwatchesCookie = "CPColorPanelSwatchesCookie";
- (void)pasteboard:(CPPasteboard)aPasteboard provideDataForType:(CPString)aType
{
if(aType == CPColorDragType)
[aPasteboard setData:[self backgroundColor] forType:aType];
[aPasteboard setData:[CPKeyedArchiver archivedDataWithRootObject:[self backgroundColor]] forType:aType];
}
@end
@import "CPColorPicker.j"
@import "CPSliderColorPicker.j"
[CPColorPanel provideColorPickerClass:CPColorWheelColorPicker];
[CPColorPanel provideColorPickerClass:CPSliderColorPicker];
+114 -99
View File
@@ -20,13 +20,16 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
import <Foundation/Foundation.j>
import <AppKit/CPView.j>
import <AppKit/CPImage.j>
import <AppKit/CPImageView.j>
@import <Foundation/CPObject.j>
@import "CPColorPanel.j"
/*
<objj>CPColorPicker</objj> is an abstract superclass for all color picker subclasses. If you want a particular color picker, use <objj>CPColorPanel</objj>'s <code>setPickerMode:</code> method. The simplest way to implement your own color picker is to create a subclass of CPColorPicker.
#include "Platform/Platform.h"
/*!
@ingroup appkit
@class CPColorPicker
CPColorPicker is an abstract superclass for all color picker subclasses. If you want a particular color picker, use CPColorPanel's \c +setPickerMode: method. The simplest way to implement your own color picker is to create a subclass of CPColorPicker.
*/
@implementation CPColorPicker : CPObject
{
@@ -34,7 +37,7 @@ import <AppKit/CPImageView.j>
int _mask;
}
/*
/*!
Initializes the color picker.
@param aMask a unique unsigned int identifying your color picker
@param aPanel the color panel that owns this picker
@@ -42,14 +45,14 @@ import <AppKit/CPImageView.j>
- (id)initWithPickerMask:(int)aMask colorPanel:(CPColorPanel)aPanel
{
self = [super init];
_panel = aPanel;
_mask = aMask;
return self;
}
/*
/*!
Returns the color panel that owns this picker
*/
- (CPColorPanel)colorPanel
@@ -59,7 +62,7 @@ import <AppKit/CPImageView.j>
/*
FIXME Not implemented.
@return <code>nil</code>
@return \c nil
@ignore
*/
- (CPImage)provideNewButtonImage
@@ -67,7 +70,7 @@ import <AppKit/CPImageView.j>
return nil;
}
/*
/*!
Sets the color picker's mode.
@param mode the color panel mode
*/
@@ -76,7 +79,7 @@ import <AppKit/CPImageView.j>
return;
}
/*
/*!
Sets the picker's color.
@param aColor the new color for the picker
*/
@@ -93,52 +96,44 @@ import <AppKit/CPImageView.j>
*/
@implementation CPColorWheelColorPicker : CPColorPicker
{
CPView _pickerView;
CPView _pickerView;
CPView _brightnessSlider;
DOMElement _brightnessBarImage;
__CPColorWheel _hueSaturationView;
CPColor _cachedColor;
}
- (id)initWithPickerMask:(int)mask colorPanel:(CPColorPanel)owningColorPanel
{
return [super initWithPickerMask:mask colorPanel: owningColorPanel];
}
-(id)initView
{
aFrame = CPRectMake(0, 0, CPColorPickerViewWidth, CPColorPickerViewHeight);
_pickerView = [[CPView alloc] initWithFrame:aFrame];
var path = [[CPBundle bundleForClass: CPColorPicker] pathForResource:@"brightness_bar.png"];
_brightnessBarImage = new Image();
_brightnessBarImage.src = path;
_brightnessBarImage.style.width = "100%";
_brightnessBarImage.style.height = "100%";
_brightnessBarImage.style.position = "absolute";
_brightnessBarImage.style.top = "0px";
_brightnessBarImage.style.left = "0px";
[_pickerView setAutoresizingMask:CPViewWidthSizable|CPViewHeightSizable];
var brightnessBarView = [[CPView alloc] initWithFrame: CPRectMake(0, (aFrame.size.height - 34), aFrame.size.width, 15)];
[brightnessBarView setAutoresizingMask: (CPViewWidthSizable | CPViewMinYMargin)];
brightnessBarView._DOMElement.appendChild(_brightnessBarImage);
_brightnessSlider = [[CPSlider alloc] initWithFrame: CPRectMake(0, aFrame.size.height - 22, aFrame.size.width, 12)];
[_brightnessSlider setMaxValue: 100.0];
[_brightnessSlider setMinValue: 0.0];
[_brightnessSlider setValue: 100.0];
_brightnessSlider = [[CPSlider alloc] initWithFrame:CGRectMake(0, (aFrame.size.height - 34), aFrame.size.width, 15)];
[_brightnessSlider setTarget: self];
[_brightnessSlider setAction: @selector(brightnessSliderDidChange:)];
[_brightnessSlider setAutoresizingMask: (CPViewWidthSizable | CPViewMinYMargin)];
[_brightnessSlider setValue:15.0 forThemeAttribute:@"track-width"];
[_brightnessSlider setValue:[CPColor colorWithPatternImage:[[CPImage alloc] initWithContentsOfFile:[[CPBundle bundleForClass:[CPColorPicker class]] pathForResource:@"brightness_bar.png"]]] forThemeAttribute:@"track-color"];
[_brightnessSlider setMinValue:0.0];
[_brightnessSlider setMaxValue:100.0];
[_brightnessSlider setFloatValue:100.0];
[_brightnessSlider setTarget:self];
[_brightnessSlider setAction:@selector(brightnessSliderDidChange:)];
[_brightnessSlider setAutoresizingMask:CPViewWidthSizable | CPViewMinYMargin];
_hueSaturationView = [[__CPColorWheel alloc] initWithFrame: CPRectMake(0, 0, aFrame.size.width, aFrame.size.height - 38)];
[_hueSaturationView setDelegate: self];
[_hueSaturationView setAutoresizingMask: (CPViewWidthSizable | CPViewHeightSizable)];
[_pickerView addSubview: brightnessBarView];
[_pickerView addSubview: _hueSaturationView];
[_pickerView addSubview: _brightnessSlider];
[_pickerView addSubview:_hueSaturationView];
[_pickerView addSubview:_brightnessSlider];
}
-(void)brightnessSliderDidChange:(id)sender
@@ -155,41 +150,59 @@ import <AppKit/CPImageView.j>
{
var hue = [_hueSaturationView angle],
saturation = [_hueSaturationView distance],
brightness = [_brightnessSlider value];
brightness = [_brightnessSlider floatValue];
[_hueSaturationView setWheelBrightness: brightness / 100.0];
_brightnessBarImage.style.backgroundColor = "#"+[[CPColor colorWithHue: hue saturation: saturation brightness: 100] hexString];
[_hueSaturationView setWheelBrightness:brightness / 100.0];
[_brightnessSlider setBackgroundColor:[CPColor colorWithHue:hue saturation:saturation brightness:100]];
[[self colorPanel] setColor:[CPColor colorWithHue: hue saturation: saturation brightness: brightness]];
var colorPanel = [self colorPanel],
opacity = [colorPanel opacity];
_cachedColor = [CPColor colorWithHue:hue saturation:saturation brightness:brightness alpha:opacity];
[[self colorPanel] setColor:_cachedColor];
}
- (BOOL)supportsMode:(int)mode
- (BOOL)supportsMode:(int)mode
{
return (mode == CPWheelColorPickerMode) ? YES : NO;
}
- (int)currentMode
- (int)currentMode
{
return CPWheelColorPickerMode;
}
- (CPView)provideNewView:(BOOL)initialRequest
- (CPView)provideNewView:(BOOL)initialRequest
{
if (initialRequest)
if (initialRequest)
[self initView];
return _pickerView;
}
- (void)setColor:(CPColor)newColor
{
var hsb = [newColor hsbComponents];
[_hueSaturationView setPositionToColor: newColor];
[_brightnessSlider setValue: hsb[2]];
[_hueSaturationView setWheelBrightness: hsb[2] / 100.0];
_brightnessBarImage.style.backgroundColor = "#"+[[CPColor colorWithHue: hsb[0] saturation: hsb[1] brightness: 100] hexString];
- (void)setColor:(CPColor)newColor
{
if ([newColor isEqual:_cachedColor])
return;
var hsb = [newColor hsbComponents];
[_hueSaturationView setPositionToColor:newColor];
[_brightnessSlider setFloatValue:hsb[2]];
[_hueSaturationView setWheelBrightness:hsb[2] / 100.0];
[_brightnessSlider setBackgroundColor:[CPColor colorWithHue:hsb[0] saturation:hsb[1] brightness:100]];
}
- (CPImage)provideNewButtonImage
{
return [[CPImage alloc] initWithContentsOfFile:[[CPBundle bundleForClass:CPColorPicker] pathForResource:"wheel_button.png"] size:CGSizeMake(32, 32)];
}
- (CPImage)provideNewAlternateButtonImage
{
return [[CPImage alloc] initWithContentsOfFile:[[CPBundle bundleForClass:CPColorPicker] pathForResource:"wheel_button_h.png"] size:CGSizeMake(32, 32)];
}
@end
@@ -199,28 +212,28 @@ import <AppKit/CPImageView.j>
{
DOMElement _wheelImage;
DOMElement _blackWheelImage;
CPView _crosshair;
id _delegate;
float _angle;
float _distance;
float _radius;
}
-(id)initWithFrame:(CPRect)aFrame
{
self = [super initWithFrame: aFrame];
var path = [[CPBundle bundleForClass: CPColorPicker] pathForResource:@"wheel.png"];
{
self = [super initWithFrame:aFrame];
var path = [[CPBundle bundleForClass:CPColorPicker] pathForResource:@"wheel.png"];
_wheelImage = new Image();
_wheelImage.src = path;
_wheelImage.style.position = "absolute";
path = [[CPBundle bundleForClass: CPColorPicker] pathForResource:@"wheel_black.png"];
path = [[CPBundle bundleForClass:CPColorPicker] pathForResource:@"wheel_black.png"];
_blackWheelImage = new Image();
_blackWheelImage.src = path;
@@ -228,21 +241,23 @@ import <AppKit/CPImageView.j>
_blackWheelImage.style.filter = "alpha(opacity=0)"
_blackWheelImage.style.position = "absolute";
#if PLATFORM(DOM)
_DOMElement.appendChild(_wheelImage);
_DOMElement.appendChild(_blackWheelImage);
[self setWheelSize: aFrame.size];
#endif
[self setWheelSize:aFrame.size];
_crosshair = [[CPView alloc] initWithFrame:CPRectMake(_radius - 2, _radius - 2, 4, 4)];
[_crosshair setBackgroundColor:[CPColor blackColor]];
var view = [[CPView alloc] initWithFrame:CGRectInset([_crosshair bounds], 1.0, 1.0)];
[view setBackgroundColor:[CPColor whiteColor]];
[_crosshair addSubview:view];
[self addSubview: _crosshair];
[self addSubview:_crosshair];
return self;
}
@@ -254,8 +269,8 @@ import <AppKit/CPImageView.j>
-(void)setFrameSize:(CPSize)aSize
{
[super setFrameSize: aSize];
[self setWheelSize: aSize];
[super setFrameSize:aSize];
[self setWheelSize:aSize];
}
-(void)setWheelSize:(CPSize)aSize
@@ -277,8 +292,8 @@ import <AppKit/CPImageView.j>
_wheelImage.style.left = (aSize.width - min) / 2.0 + "px";
_radius = min / 2.0;
[self setAngle: [self degreesToRadians: _angle] distance: (_distance / 100.0) * _radius];
[self setAngle:[self degreesToRadians:_angle] distance:(_distance / 100.0) * _radius];
}
-(void)setDelegate:(id)aDelegate
@@ -303,29 +318,28 @@ import <AppKit/CPImageView.j>
-(void)mouseDown:(CPEvent)anEvent
{
[self reposition: anEvent];
[self reposition:anEvent];
}
-(void)mouseDragged:(CPEvent)anEvent
{
[self reposition: anEvent];
[self reposition:anEvent];
}
-(void)reposition:(CPEvent)anEvent
{
var bounds = [self bounds],
location = [self convertPoint: [anEvent locationInWindow] fromView: nil];
location = [self convertPoint:[anEvent locationInWindow] fromView:nil];
var midX = CGRectGetMidX(bounds);
var midY = CGRectGetMidY(bounds);
var distance = MIN(SQRT((location.x - midX)*(location.x - midX) + (location.y - midY)*(location.y - midY)), _radius);
var angle = ATAN2(location.y - midY, location.x - midX);
[self setAngle: angle distance: distance];
if(_delegate)
[_delegate colorWheelDidChange: self];
[self setAngle:angle distance:distance];
[_delegate colorWheelDidChange:self];
}
-(void)setAngle:(int)angle distance:(float)distance
@@ -333,10 +347,10 @@ import <AppKit/CPImageView.j>
var bounds = [self bounds];
var midX = CGRectGetMidX(bounds);
var midY = CGRectGetMidY(bounds);
_angle = [self radiansToDegrees: angle];
_distance = (distance / _radius) * 100.0;
_angle = [self radiansToDegrees:angle];
_distance = (distance / _radius) * 100.0;
[_crosshair setFrameOrigin:CPPointMake(COS(angle) * distance + midX - 2.0, SIN(angle) * distance + midY - 2.0)];
}
@@ -344,11 +358,11 @@ import <AppKit/CPImageView.j>
{
var hsb = [aColor hsbComponents],
bounds = [self bounds];
var angle = [self degreesToRadians: hsb[0]],
var angle = [self degreesToRadians:hsb[0]],
distance = (hsb[1] / 100.0) * _radius;
[self setAngle: angle distance: distance];
[self setAngle:angle distance:distance];
}
-(int)radiansToDegrees:(float)radians
@@ -361,4 +375,5 @@ import <AppKit/CPImageView.j>
return -(((degrees - 360) / 180) * PI);
}
@end
@end
+113 -32
View File
@@ -20,23 +20,27 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
import <Foundation/CPString.j>
@import <Foundation/CPString.j>
import "CPView.j"
import "CPColor.j"
import "CPColorPanel.j"
@import "CPView.j"
@import "CPColor.j"
@import "CPColorPanel.j"
var _CPColorWellDidBecomeExclusiveNotification = @"_CPColorWellDidBecomeExclusiveNotification";
/*
<objj>CPColorWell</objj> is a <objj>CPControl</objj> for selecting and displaying a single color value. An example of a <objj>CPColorWell</objj> object (or simply color well) is found in <objj>CPColorPanel</objj>, which uses a color well to display the current color selection.</p>
/*!
@ingroup appkit
@class CPColorWell
<p>An application can have one or more active <objj>CPColorWell</objj>s. You can activate multiple <objj>CPColorWell</objj>s by invoking the <code>activate:</code> method with <code>NO</code> as its argument. When a mouse-down event occurs on an <objj>CPColorWell</objj>'s border, it becomes the only active color well. When a color well becomes active, it brings up the color panel also.
CPColorWell is a CPControl for selecting and displaying a single color value. An example of a CPColorWell object (or simply color well) is found in CPColorPanel, which uses a color well to display the current color selection.</p>
<p>An application can have one or more active CPColorWells. You can activate multiple CPColorWells by invoking the \c -activate: method with \c NO as its argument. When a mouse-down event occurs on an CPColorWell's border, it becomes the only active color well. When a color well becomes active, it brings up the color panel also.
*/
@implementation CPColorWell : CPControl
{
BOOL _active;
BOOL _bordered;
CPColor _color;
CPView _wellView;
@@ -49,33 +53,59 @@ var _CPColorWellDidBecomeExclusiveNotification = @"_CPColorWellDidBecomeExclusiv
if (self)
{
_active = NO;
_bordered = YES;
_color = [CPColor whiteColor];
[self drawBezelWithHighlight:NO];
[self drawWellInside:CGRectInset([self bounds], 3.0, 3.0)];
var defaultCenter = [CPNotificationCenter defaultCenter];
[defaultCenter
addObserver:self
selector:@selector(colorWellDidBecomeExclusive:)
name:_CPColorWellDidBecomeExclusiveNotification
object:nil];
[defaultCenter
addObserver:self
selector:@selector(colorPanelWillClose:)
name:CPWindowWillCloseNotification
object:[CPColorPanel sharedColorPanel]];
[self _registerForNotifications];
}
return self;
}
- (void)_registerForNotifications
{
var defaultCenter = [CPNotificationCenter defaultCenter];
[defaultCenter
addObserver:self
selector:@selector(colorWellDidBecomeExclusive:)
name:_CPColorWellDidBecomeExclusiveNotification
object:nil];
[defaultCenter
addObserver:self
selector:@selector(colorPanelWillClose:)
name:CPWindowWillCloseNotification
object:[CPColorPanel sharedColorPanel]];
}
/*!
Returns whether the color well is bordered
*/
- (BOOL)isBordered
{
return _bordered;
}
/*!
Sets the color well's current color.
*/
- (void)setBordered:(BOOL)bordered
{
if (_bordered == bordered)
return;
_bordered = bordered;
[self drawWellInside:CGRectInset([self bounds], 3.0, 3.0)];
}
// Managing Color From Color Wells
/*
/*!
Returns the color well's current color.
*/
- (CPColor)color
@@ -83,7 +113,7 @@ var _CPColorWellDidBecomeExclusiveNotification = @"_CPColorWellDidBecomeExclusiv
return _color;
}
/*
/*!
Sets the color well's current color.
*/
- (void)setColor:(CPColor)aColor
@@ -96,8 +126,8 @@ var _CPColorWellDidBecomeExclusiveNotification = @"_CPColorWellDidBecomeExclusiv
[self drawWellInside:CGRectInset([self bounds], 3.0, 3.0)];
}
/*
Changes the color of the well to that of <code>aSender</code>.
/*!
Changes the color of the well to that of \c aSender.
@param aSender the object from which to retrieve the color
*/
- (void)takeColorFrom:(id)aSender
@@ -106,9 +136,9 @@ var _CPColorWellDidBecomeExclusiveNotification = @"_CPColorWellDidBecomeExclusiv
}
// Activating and Deactivating Color Wells
/*
/*!
Activates the color well, displays the color panel, and makes the panel's current color the same as its own.
If exclusive is <code>YES</code>, deactivates any other <objj>CPColorWell</objj>s. <code>NO</code>, keeps them active.
If exclusive is \c YES, deactivates any other CPColorWells. \c NO, keeps them active.
@param shouldBeExclusive whether other color wells should be deactivated.
*/
- (void)activate:(BOOL)shouldBeExclusive
@@ -132,7 +162,7 @@ var _CPColorWellDidBecomeExclusiveNotification = @"_CPColorWellDidBecomeExclusiv
object:[CPColorPanel sharedColorPanel]];
}
/*
/*!
Deactivates the color well.
*/
- (void)deactivate
@@ -148,8 +178,8 @@ var _CPColorWellDidBecomeExclusiveNotification = @"_CPColorWellDidBecomeExclusiv
object:[CPColorPanel sharedColorPanel]];
}
/*
Returns <code>YES</code> if the color well is active.
/*!
Returns \c YES if the color well is active.
*/
- (BOOL)isActive
{
@@ -162,7 +192,7 @@ var _CPColorWellDidBecomeExclusiveNotification = @"_CPColorWellDidBecomeExclusiv
{
}
/*
/*!
Draws the colored area inside the color well without borders.
@param aRect the location at which to draw
*/
@@ -171,6 +201,7 @@ var _CPColorWellDidBecomeExclusiveNotification = @"_CPColorWellDidBecomeExclusiv
if (!_wellView)
{
_wellView = [[CPView alloc] initWithFrame:aRect];
[_wellView setAutoresizingMask:CPViewWidthSizable | CPViewHeightSizable];
[self addSubview:_wellView];
}
@@ -220,8 +251,58 @@ var _CPColorWellDidBecomeExclusiveNotification = @"_CPColorWellDidBecomeExclusiv
var colorPanel = [CPColorPanel sharedColorPanel];
[colorPanel setColor:_color];
[colorPanel orderFront:self];
}
@end
var CPColorWellColorKey = "CPColorWellColorKey",
CPColorWellBorderedKey = "CPColorWellBorderedKey";
@implementation CPColorWell (CPCoding)
/*!
Initializes the color well by unarchiving data from \c aCoder.
@param aCoder the coder containing the archived CPColorWell.
*/
- (id)initWithCoder:(CPCoder)aCoder
{
self = [super initWithCoder:aCoder];
if (self)
{
_active = NO;
_bordered = [aCoder decodeObjectForKey:CPColorWellBorderedKey];
_color = [aCoder decodeObjectForKey:CPColorWellColorKey];
[self drawBezelWithHighlight:NO];
[self drawWellInside:CGRectInset([self bounds], 3.0, 3.0)];
[self _registerForNotifications];
}
return self;
}
/*!
Archives this button into the provided coder.
@param aCoder the coder to which the color well's instance data will be written.
*/
- (void)encodeWithCoder:(CPCoder)aCoder
{
// We do this in order to avoid encoding the _wellView, which
// should just automatically be created programmatically as needed.
var actualSubviews = _subviews;
_subviews = [_subviews copy];
[_subviews removeObjectIdenticalTo:_wellView];
[super encodeWithCoder:aCoder];
_subviews = actualSubviews;
[aCoder encodeObject:_color forKey:CPColorWellColorKey];
[aCoder encodeObject:_bordered forKey:CPColorWellBorderedKey];
}
@end
+89 -25
View File
@@ -20,7 +20,8 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
import "CPEvent.j"
@import "CPEvent.j"
@import "CPPlatform.j"
// Browser Engines
CPUnknownBrowserEngine = 0;
@@ -30,30 +31,50 @@ CPKHTMLBrowserEngine = 3;
CPOperaBrowserEngine = 4;
CPWebKitBrowserEngine = 5;
// Operating Systems
CPMacOperatingSystem = 0;
CPWindowsOperatingSystem = 1;
CPOtherOperatingSystem = 2;
// Features
CPCSSRGBAFeature = 1 << 5;
CPHTMLCanvasFeature = 1 << 6;
CPHTMLContentEditableFeature = 1 << 7;
CPHTMLDragAndDropFeature = 1 << 8;
CPJavascriptInnerTextFeature = 1 << 8;
CPJavascriptTextContentFeature = 1 << 9;
CPJavascriptClipboardEventsFeature = 1 << 10;
CPJavascriptClipboardAccessFeature = 1 << 11;
CPJavaScriptCanvasDrawFeature = 1 << 12;
CPJavascriptInnerTextFeature = 1 << 9;
CPJavascriptTextContentFeature = 1 << 10;
CPJavascriptClipboardEventsFeature = 1 << 11;
CPJavascriptClipboardAccessFeature = 1 << 12;
CPJavaScriptCanvasDrawFeature = 1 << 13;
CPJavaScriptCanvasTransformFeature = 1 << 14;
CPVMLFeature = 1 << 14;
CPVMLFeature = 1 << 15;
CPJavascriptRemedialKeySupport = 1 << 15;
CPJavascriptRemedialKeySupport = 1 << 16;
CPJavaScriptShadowFeature = 1 << 20;
CPJavaScriptNegativeMouseWheelValues = 1 << 22;
CPJavaScriptMouseWheelValues_8_15 = 1 << 23
var USER_AGENT = "";
CPOpacityRequiresFilterFeature = 1 << 24;
//Internet explorer does not allow dynamically changing the type of an input element
CPInputTypeCanBeChangedFeature = 1 << 25;
CPHTML5DragAndDropSourceYOffBy1 = 1 << 26;
var USER_AGENT = "",
PLATFORM_ENGINE = CPUnknownBrowserEngine,
PLATFORM_FEATURES = 0;
// default these features to true
PLATFORM_FEATURES |= CPInputTypeCanBeChangedFeature;
if (typeof window != "undfined" && typeof window.navigator != "undefined")
USER_AGENT = window.navigator.userAgent;
@@ -74,6 +95,10 @@ else if (window.attachEvent) // Must follow Opera check.
PLATFORM_FEATURES |= CPVMLFeature;
PLATFORM_FEATURES |= CPJavascriptRemedialKeySupport;
PLATFORM_FEATURES |= CPJavaScriptShadowFeature;
PLATFORM_FEATURES |= CPOpacityRequiresFilterFeature;
PLATFORM_FEATURES &= ~CPInputTypeCanBeChangedFeature;
}
// WebKit
@@ -84,45 +109,72 @@ else if (USER_AGENT.indexOf("AppleWebKit/") != -1)
// Features we can only be sure of with WebKit (no known independent tests)
PLATFORM_FEATURES |= CPCSSRGBAFeature;
PLATFORM_FEATURES |= CPHTMLContentEditableFeature;
if (USER_AGENT.indexOf("Chrome") === -1)
PLATFORM_FEATURES |= CPHTMLDragAndDropFeature;
PLATFORM_FEATURES |= CPJavascriptClipboardEventsFeature;
PLATFORM_FEATURES |= CPJavascriptClipboardAccessFeature;
PLATFORM_FEATURES |= CPJavaScriptShadowFeature;
var versionStart = USER_AGENT.indexOf("AppleWebKit/") + "AppleWebKit/".length,
versionEnd = USER_AGENT.indexOf(" ", versionStart),
version = parseFloat(USER_AGENT.substring(versionStart, versionEnd), 10);
versionString = USER_AGENT.substring(versionStart, versionEnd),
versionDivision = versionString.indexOf('.'),
majorVersion = parseInt(versionString.substring(0, versionDivision)),
minorVersion = parseInt(versionString.substr(versionDivision + 1));
if(USER_AGENT.indexOf("Plainview") == -1 && version >= 525.14 || USER_AGENT.indexOf("Chrome") != -1)
if((USER_AGENT.indexOf("Safari") !== CPNotFound && (majorVersion > 525 || (majorVersion === 525 && minorVersion > 14))) || USER_AGENT.indexOf("Chrome") !== CPNotFound)
PLATFORM_FEATURES |= CPJavascriptRemedialKeySupport;
// FIXME this is a terrible hack to get around this bug:
// https://bugs.webkit.org/show_bug.cgi?id=21548
if (![CPPlatform isBrowser])
PLATFORM_FEATURES |= CPJavascriptRemedialKeySupport;
if (majorVersion < 532 || (majorVersion === 532 && minorVersion < 6))
PLATFORM_FEATURES |= CPHTML5DragAndDropSourceYOffBy1;
}
// KHTML
else if (USER_AGENT.indexOf('KHTML') != -1) // Must follow WebKit check.
else if (USER_AGENT.indexOf("KHTML") != -1) // Must follow WebKit check.
{
PLATFORM_ENGINE = CPKHTMLBrowserEngine;
}
// Gecko
else if (USER_AGENT.indexOf('Gecko') != -1) // Must follow KHTML check.
else if (USER_AGENT.indexOf("Gecko") !== -1) // Must follow KHTML check.
{
PLATFORM_ENGINE = CPGeckoBrowserEngine;
PLATFORM_FEATURES |= CPJavaScriptCanvasDrawFeature;
var index = USER_AGENT.indexOf("Firefox"),
version = (index == -1) ? 2.0 : parseFloat(USER_AGENT.substring(index+"Firefox".length+1));
version = (index === -1) ? 2.0 : parseFloat(USER_AGENT.substring(index + "Firefox".length + 1));
if (version >= 3.0)
PLATFORM_FEATURES |= CPCSSRGBAFeature;
if (version < 3.0)
PLATFORM_FEATURES |= CPJavaScriptMouseWheelValues_8_15;
}
// Feature Specific Checks
if (typeof document != "undefined")
{
var canvasElement = document.createElement("canvas");
// Detect Canvas Support
if (document.createElement("canvas").getContext)
if (canvasElement && canvasElement.getContext)
{
PLATFORM_FEATURES |= CPHTMLCanvasFeature;
// Detect Canvas setTransform/transform support
var context = document.createElement("canvas").getContext("2d");
if (context && context.setTransform && context.transform)
PLATFORM_FEATURES |= CPJavaScriptCanvasTransformFeature;
}
var DOMElement = document.createElement("div");
// Detect whether we have innerText or textContent (or neither)
@@ -139,26 +191,38 @@ function CPFeatureIsCompatible(aFeature)
function CPBrowserIsEngine(anEngine)
{
return PLATFORM_ENGINE == anEngine;
return PLATFORM_ENGINE === anEngine;
}
if (USER_AGENT.indexOf("Mac") != -1)
function CPBrowserIsOperatingSystem(anOperatingSystem)
{
return OPERATING_SYSTEM === anOperatingSystem;
}
OPERATING_SYSTEM = CPOtherOperatingSystem;
if (USER_AGENT.indexOf("Mac") !== -1)
{
OPERATING_SYSTEM = CPMacOperatingSystem;
CPPlatformActionKeyMask = CPCommandKeyMask;
CPUndoKeyEquivalent = @"Z";
CPUndoKeyEquivalent = @"z";
CPRedoKeyEquivalent = @"Z";
CPUndoKeyEquivalentModifierMask = CPCommandKeyMask;
CPRedoKeyEquivalentModifierMask = CPCommandKeyMask | CPShiftKeyMask;
CPRedoKeyEquivalentModifierMask = CPCommandKeyMask;
}
else
{
if (USER_AGENT.indexOf("Windows") !== -1)
OPERATING_SYSTEM = CPWindowsOperatingSystem;
CPPlatformActionKeyMask = CPControlKeyMask;
CPUndoKeyEquivalent = @"Z";
CPRedoKeyEquivalent = @"Y";
CPUndoKeyEquivalent = @"z";
CPRedoKeyEquivalent = @"y";
CPUndoKeyEquivalentModifierMask = CPControlKeyMask;
CPRedoKeyEquivalentModifierMask = CPControlKeyMask;
}
+459 -322
View File
@@ -20,84 +20,110 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
import "CPFont.j"
import "CPShadow.j"
import "CPView.j"
@import "CPFont.j"
@import "CPShadow.j"
@import "CPView.j"
#include "CoreGraphics/CGGeometry.h"
#include "Platform/Platform.h"
/*
@global
@group CPTextAlignment
*/
CPLeftTextAlignment = 0;
/*
@global
@group CPTextAlignment
*/
CPRightTextAlignment = 1;
/*
@global
@group CPTextAlignment
*/
CPCenterTextAlignment = 2;
/*
@global
@group CPTextAlignment
*/
CPJustifiedTextAlignment = 3;
/*
@global
@group CPTextAlignment
*/
CPNaturalTextAlignment = 4;
CPLeftTextAlignment = 0;
CPRightTextAlignment = 1;
CPCenterTextAlignment = 2;
CPJustifiedTextAlignment = 3;
CPNaturalTextAlignment = 4;
/*
@global
@group CPControlSize
*/
CPRegularControlSize = 0;
/*
@global
@group CPControlSize
*/
CPSmallControlSize = 1;
/*
@global
@group CPControlSize
*/
CPMiniControlSize = 2;
CPRegularControlSize = 0;
CPSmallControlSize = 1;
CPMiniControlSize = 2;
CPControlNormalBackgroundColor = @"CPControlNormalBackgroundColor";
CPControlSelectedBackgroundColor = @"CPControlSelectedBackgroundColor";
CPControlHighlightedBackgroundColor = @"CPControlHighlightedBackgroundColor";
CPControlDisabledBackgroundColor = @"CPControlDisabledBackgroundColor";
CPLineBreakByWordWrapping = 0;
CPLineBreakByCharWrapping = 1;
CPLineBreakByClipping = 2;
CPLineBreakByTruncatingHead = 3;
CPLineBreakByTruncatingTail = 4;
CPLineBreakByTruncatingMiddle = 5;
CPTopVerticalTextAlignment = 1,
CPCenterVerticalTextAlignment = 2,
CPBottomVerticalTextAlignment = 3;
CPScaleProportionally = 0;
CPScaleToFit = 1;
CPScaleNone = 2;
CPNoImage = 0;
CPImageOnly = 1;
CPImageLeft = 2;
CPImageRight = 3;
CPImageBelow = 4;
CPImageAbove = 5;
CPImageOverlaps = 6;
CPOnState = 1;
CPOffState = 0;
CPMixedState = -1;
CPControlNormalBackgroundColor = "CPControlNormalBackgroundColor";
CPControlSelectedBackgroundColor = "CPControlSelectedBackgroundColor";
CPControlHighlightedBackgroundColor = "CPControlHighlightedBackgroundColor";
CPControlDisabledBackgroundColor = "CPControlDisabledBackgroundColor";
CPControlTextDidBeginEditingNotification = "CPControlTextDidBeginEditingNotification";
CPControlTextDidChangeNotification = "CPControlTextDidChangeNotification";
CPControlTextDidEndEditingNotification = "CPControlTextDidEndEditingNotification";
var CPControlBlackColor = [CPColor blackColor];
/*
<objj>CPControl</objj> is an abstract superclass used to implement user interface elements. As a subclass of <objj>CPView</objj> and <objj>CPResponder</objj> it has the ability to handle screen drawing and handling user input.
/*!
@ingroup appkit
@class CPControl
CPControl is an abstract superclass used to implement user interface elements. As a subclass of CPView and CPResponder it has the ability to handle screen drawing and handling user input.
*/
@implementation CPControl : CPView
{
id _value;
id _value;
// Target-Action Support
id _target;
SEL _action;
int _sendActionOn;
BOOL _sendsActionOnEndEditing @accessors(property=sendsActionOnEndEditing);
BOOL _isEnabled;
int _alignment;
CPFont _font;
CPColor _textColor;
CPShadow _textShadow;
id _target;
SEL _action;
int _sendActionOn;
CPColor _backgroundColor;
CPColor _highlightedBackgroundColor;
CPDictionary _backgroundColors;
CPString _currentBackgroundColorName;
// Mouse Tracking Support
BOOL _continuousTracking;
BOOL _trackingWasWithinFrame;
unsigned _trackingMouseDownFlags;
CGPoint _previousTrackingLocation;
CPString _toolTip;
}
+ (CPDictionary)themeAttributes
{
return [CPDictionary dictionaryWithObjects:[CPLeftTextAlignment,
CPTopVerticalTextAlignment,
CPLineBreakByClipping,
[CPColor blackColor],
[CPFont systemFontOfSize:12.0],
[CPNull null],
_CGSizeMakeZero(),
CPImageLeft,
CPScaleToFit,
_CGSizeMakeZero(),
_CGSizeMake(-1.0, -1.0)]
forKeys:[@"alignment",
@"vertical-alignment",
@"line-break-mode",
@"text-color",
@"font",
@"text-shadow-color",
@"text-shadow-offset",
@"image-position",
@"image-scaling",
@"min-size",
@"max-size"]];
}
- (id)initWithFrame:(CGRect)aFrame
@@ -107,125 +133,13 @@ var CPControlBlackColor = [CPColor blackColor];
if (self)
{
_sendActionOn = CPLeftMouseUpMask;
_isEnabled = YES;
[self setFont:[CPFont systemFontOfSize:12.0]];
[self setTextColor:CPControlBlackColor];
_backgroundColors = [CPDictionary dictionary];
_trackingMouseDownFlags = 0;
}
return self;
}
/*
Sets whether the receiver responds to mouse events.
@param isEnabled whether the receiver will respond to mouse events
*/
- (void)setEnabled:(BOOL)isEnabled
{
[self setAlphaValue:(_isEnabled = isEnabled) ? 1.0 : 0.3];
}
/*
Returns <code>YES</code> if the receiver responds to mouse events.
*/
- (BOOL)isEnabled
{
return _isEnabled;
}
/*
Sets the color of the receiver's text.
*/
- (void)setTextColor:(CPColor)aColor
{
if (_textColor == aColor)
return;
_textColor = aColor;
#if PLATFORM(DOM)
_DOMElement.style.color = [aColor cssString];
#endif
}
/*
Returns the color of the receiver's text
*/
- (CPColor)textColor
{
return _textColor;
}
/*
Returns the receiver's alignment
*/
- (CPTextAlignment)alignment
{
return _alignment;
}
/*
Sets the receiver's alignment
@param anAlignment the receiver's alignment
*/
- (void)setAlignment:(CPTextAlignment)anAlignment
{
_alignment = anAlignment;
}
/*
Sets the receiver's font
@param aFont the font for the receiver
*/
- (void)setFont:(CPFont)aFont
{
if (_font == aFont)
return;
_font = aFont;
#if PLATFORM(DOM)
_DOMElement.style.font = [_font ? _font : [CPFont systemFontOfSize:12.0] cssString];
#endif
}
/*
Returns the receiver's font
*/
- (CPFont)font
{
return _font;
}
/*
Sets the shadow for the receiver's text.
@param aTextShadow the text shadow
*/
- (void)setTextShadow:(CPShadow)aTextShadow
{
_DOMElement.style.textShadow = [_textShadow = aTextShadow cssString];
}
/*
Returns the receiver's text shadow
*/
- (CPShadow)textShadow
{
return _textShadow;
}
/*
Returns the receiver's target action
*/
- (SEL)action
{
return _action;
}
/*
/*!
Sets the receiver's target action
@param anAction Sets the action message that gets sent to the target.
*/
@@ -234,15 +148,15 @@ var CPControlBlackColor = [CPColor blackColor];
_action = anAction;
}
/*
Returns the receiver's target. The target receives action messages from the receiver.
/*!
Returns the receiver's target action
*/
- (id)target
- (SEL)action
{
return _target;
return _action;
}
/*
/*!
Sets the receiver's target. The target receives action messages from the receiver.
@param aTarget the object that will receive the message specified by action
*/
@@ -251,16 +165,16 @@ var CPControlBlackColor = [CPColor blackColor];
_target = aTarget;
}
- (void)mouseUp:(CPEvent)anEvent
/*!
Returns the receiver's target. The target receives action messages from the receiver.
*/
- (id)target
{
if (_sendActionOn & CPLeftMouseUpMask && CPRectContainsPoint([self bounds], [self convertPoint:[anEvent locationInWindow] fromView:nil]))
[self sendAction:_action to:_target];
[super mouseUp:anEvent];
return _target;
}
/*
Causes <code>anAction</code> to be sent to <code>anObject</code>.
/*!
Causes \c anAction to be sent to \c anObject.
@param anAction the action to send
@param anObject the object to which the action will be sent
*/
@@ -269,23 +183,166 @@ var CPControlBlackColor = [CPColor blackColor];
[CPApp sendAction:anAction to:anObject from:self];
}
/*
Returns the receiver's float value
*/
- (float)floatValue
- (int)sendActionOn:(int)mask
{
return _value ? parseFloat(_value, 10) : 0.0;
var previousMask = _sendActionOn;
_sendActionOn = mask;
return previousMask;
}
/*
Sets the receiver's float value
/*!
Sets the tooltip for the receiver.
@param aToolTip the tooltip
*/
- (void)setFloatValue:(float)aValue
/*
-(void)setToolTip:(CPString)aToolTip
{
[self setObjectValue:aValue];
if (_toolTip == aToolTip)
return;
_toolTip = aToolTip;
#if PLATFORM(DOM)
_DOMElement.title = aToolTip;
#endif
}
*/
/*!
Returns the receiver's tooltip
*/
/*
-(CPString)toolTip
{
return _toolTip;
}
*/
/*!
Returns whether the control can continuously send its action messages.
*/
- (BOOL)isContinuous
{
// Some subclasses should redefine this with CPLeftMouseDraggedMask
return (_sendActionOn & CPPeriodicMask) !== 0;
}
/*
/*!
Sets whether the cell can continuously send its action messages.
*/
- (void)setContinuous:(BOOL)flag
{
// Some subclasses should redefine this with CPLeftMouseDraggedMask
if (flag)
_sendActionOn |= CPPeriodicMask;
else
_sendActionOn &= ~CPPeriodicMask;
}
- (BOOL)tracksMouseOutsideOfFrame
{
return NO;
}
- (void)trackMouse:(CPEvent)anEvent
{
var type = [anEvent type],
currentLocation = [self convertPoint:[anEvent locationInWindow] fromView:nil];
isWithinFrame = [self tracksMouseOutsideOfFrame] || CGRectContainsPoint([self bounds], currentLocation);
if (type === CPLeftMouseUp)
{
[self stopTracking:_previousTrackingLocation at:currentLocation mouseIsUp:YES];
_trackingMouseDownFlags = 0;
}
else
{
if (type === CPLeftMouseDown)
{
_trackingMouseDownFlags = [anEvent modifierFlags];
_continuousTracking = [self startTrackingAt:currentLocation];
}
else if (type === CPLeftMouseDragged)
{
if (isWithinFrame)
{
if (!_trackingWasWithinFrame)
_continuousTracking = [self startTrackingAt:currentLocation];
else if (_continuousTracking)
_continuousTracking = [self continueTracking:_previousTrackingLocation at:currentLocation];
}
else
[self stopTracking:_previousTrackingLocation at:currentLocation mouseIsUp:NO];
}
[CPApp setTarget:self selector:@selector(trackMouse:) forNextEventMatchingMask:CPLeftMouseDraggedMask | CPLeftMouseUpMask untilDate:nil inMode:nil dequeue:YES];
}
if ((_sendActionOn & (1 << type)) && isWithinFrame)
[self sendAction:_action to:_target];
_trackingWasWithinFrame = isWithinFrame;
_previousTrackingLocation = currentLocation;
}
- (void)setState:(int)state
{
}
- (int)nextState
{
return 0;
}
- (void)performClick:(id)sender
{
[self highlight:YES];
[self setState:[self nextState]];
[self sendAction:[self action] to:[self target]];
[CPTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(unhighlightButtonTimerDidFinish:) userInfo:nil repeats:NO];
}
- (void)unhighlightButtonTimerDidFinish:(id)sender
{
[self highlight:NO];
}
- (unsigned)mouseDownFlags
{
return _trackingMouseDownFlags;
}
- (BOOL)startTrackingAt:(CGPoint)aPoint
{
[self highlight:YES];
return (_sendActionOn & CPPeriodicMask) || (_sendActionOn & CPLeftMouseDraggedMask);
}
- (BOOL)continueTracking:(CGPoint)lastPoint at:(CGPoint)aPoint
{
return (_sendActionOn & CPPeriodicMask) || (_sendActionOn & CPLeftMouseDraggedMask);
}
- (void)stopTracking:(CGPoint)lastPoint at:(CGPoint)aPoint mouseIsUp:(BOOL)mouseIsUp
{
[self highlight:NO];
}
- (void)mouseDown:(CPEvent)anEvent
{
if (![self isEnabled])
return;
[self trackMouse:anEvent];
}
/*!
Returns the receiver's object value
*/
- (id)objectValue
@@ -293,122 +350,234 @@ var CPControlBlackColor = [CPColor blackColor];
return _value;
}
/*
/*!
Set's the receiver's object value
*/
- (void)setObjectValue:(id)anObject
{
_value = anObject;
[self setNeedsLayout];
[self setNeedsDisplay:YES];
}
/*
/*!
Returns the receiver's float value
*/
- (float)floatValue
{
var floatValue = parseFloat(_value, 10);
return isNaN(floatValue) ? 0.0 : floatValue;
}
/*!
Sets the receiver's float value
*/
- (void)setFloatValue:(float)aValue
{
[self setObjectValue:aValue];
}
/*!
Returns the receiver's double value
*/
- (id)doubleValue
- (double)doubleValue
{
return [self floatValue];
var doubleValue = parseFloat(_value, 10);
return isNaN(doubleValue) ? 0.0 : doubleValue;
}
/*
/*!
Set's the receiver's double value
*/
- (void)setDoubleValue:(id)anObject
- (void)setDoubleValue:(double)anObject
{
[self setObjectValue:anObject];
}
/*
/*!
Returns the receiver's int value
*/
- (id)intValue
- (int)intValue
{
return _value ? parseInt(_value, 10) : 0;
var intValue = parseInt(_value, 10);
return isNaN(intValue) ? 0.0 : intValue;
}
/*
/*!
Set's the receiver's int value
*/
- (void)setIntValue:(id)anObject
- (void)setIntValue:(int)anObject
{
[self setObjectValue:anObject];
}
/*
/*!
Returns the receiver's int value
*/
- (id)stringValue
- (int)integerValue
{
return _value ? ""+_value : "";
var intValue = parseInt(_value, 10);
return isNaN(intValue) ? 0.0 : intValue;
}
/*
/*!
Set's the receiver's int value
*/
- (void)setStringValue:(id)anObject
- (void)setIntegerValue:(int)anObject
{
[self setObjectValue:anObject];
}
- (void)setBackgroundColor:(CPColor)aColor
/*!
Returns the receiver's int value
*/
- (CPString)stringValue
{
_backgroundColors = [CPDictionary dictionary];
[self setBackgroundColor:aColor forName:CPControlNormalBackgroundColor];
[super setBackgroundColor:aColor];
return (_value === undefined || _value === nil) ? "" : String(_value);
}
- (void)setBackgroundColor:(CPColor)aColor forName:(CPString)aName
/*!
Set's the receiver's int value
*/
- (void)setStringValue:(CPString)anObject
{
if (!aColor)
[_backgroundColors removeObjectForKey:aName];
[self setObjectValue:anObject];
}
- (void)takeDoubleValueFrom:(id)sender
{
if ([sender respondsToSelector:@selector(doubleValue)])
[self setDoubleValue:[sender doubleValue]];
}
- (void)takeFloatValueFrom:(id)sender
{
if ([sender respondsToSelector:@selector(floatValue)])
[self setFloatValue:[sender floatValue]];
}
- (void)takeIntegerValueFrom:(id)sender
{
if ([sender respondsToSelector:@selector(integerValue)])
[self setIntegerValue:[sender integerValue]];
}
- (void)takeIntValueFrom:(id)sender
{
if ([sender respondsToSelector:@selector(intValue)])
[self setIntValue:[sender intValue]];
}
- (void)takeObjectValueFrom:(id)sender
{
if ([sender respondsToSelector:@selector(objectValue)])
[self setObjectValue:[sender objectValue]];
}
- (void)takeStringValueFrom:(id)sender
{
if ([sender respondsToSelector:@selector(stringValue)])
[self setStringValue:[sender stringValue]];
}
- (void)textDidBeginEditing:(CPNotification)note
{
//this looks to prevent false propagation of notifications for other objects
if([note object] != self)
return;
[[CPNotificationCenter defaultCenter] postNotificationName:CPControlTextDidBeginEditingNotification object:self userInfo:[CPDictionary dictionaryWithObject:[note object] forKey:"CPFieldEditor"]];
}
- (void)textDidChange:(CPNotification)note
{
//this looks to prevent false propagation of notifications for other objects
if([note object] != self)
return;
[[CPNotificationCenter defaultCenter] postNotificationName:CPControlTextDidChangeNotification object:self userInfo:[CPDictionary dictionaryWithObject:[note object] forKey:"CPFieldEditor"]];
}
- (void)textDidEndEditing:(CPNotification)note
{
//this looks to prevent false propagation of notifications for other objects
if([note object] != self)
return;
[[CPNotificationCenter defaultCenter] postNotificationName:CPControlTextDidEndEditingNotification object:self userInfo:[CPDictionary dictionaryWithObject:[note object] forKey:"CPFieldEditor"]];
}
#define BRIDGE(UPPERCASE, LOWERCASE, ATTRIBUTENAME) \
/*! Sets the value for ATTRIBUTENAME */\
- (void)set##UPPERCASE:(id)aValue\
{\
[self setValue:aValue forThemeAttribute:ATTRIBUTENAME];\
}\
/*! Returns the current value for ATTRIBUTENAME */\
- (id)LOWERCASE\
{\
return [self valueForThemeAttribute:ATTRIBUTENAME];\
}
BRIDGE(Alignment, alignment, "alignment")
BRIDGE(VerticalAlignment, verticalAlignment, "vertical-alignment")
BRIDGE(LineBreakMode, lineBreakMode, "line-break-mode")
BRIDGE(TextColor, textColor, "text-color")
BRIDGE(Font, font, "font")
BRIDGE(TextShadowColor, textShadowColor, "text-shadow-color")
BRIDGE(TextShadowOffset, textShadowOffset, "text-shadow-offset")
BRIDGE(ImagePosition, imagePosition, "image-position")
BRIDGE(ImageScaling, imageScaling, "image-scaling")
- (void)setEnabled:(BOOL)isEnabled
{
if (isEnabled)
[self unsetThemeState:CPThemeStateDisabled];
else
[_backgroundColors setObject:aColor forKey:aName];
if (_currentBackgroundColorName == aName)
[self setBackgroundColorWithName:_currentBackgroundColorName];
[self setThemeState:CPThemeStateDisabled];
}
- (CPColor)backgroundColorForName:(CPString)aName
- (BOOL)isEnabled
{
var backgroundColor = [_backgroundColors objectForKey:aName];
if (!backgroundColor && aName != CPControlNormalBackgroundColor)
return [_backgroundColors objectForKey:CPControlNormalBackgroundColor];
return backgroundColor;
return ![self hasThemeState:CPThemeStateDisabled];
}
- (void)setBackgroundColorWithName:(CPString)aName
- (void)highlight:(BOOL)shouldHighlight
{
_currentBackgroundColorName = aName;
[super setBackgroundColor:[self backgroundColorForName:aName]];
[self setHighlighted:shouldHighlight];
}
/*
Ð doubleValue
Ð setDoubleValue:
Ð intValue
Ð setIntValue:
Ð objectValue
Ð setObjectValue:
Ð stringValue
Ð setStringValue:
Ð setNeedsDisplay
Ð attributedStringValue
Ð setAttributedStringValue:
*/
- (void)setHighlighted:(BOOL)isHighlighted
{
if (isHighlighted)
[self setThemeState:CPThemeStateHighlighted];
else
[self unsetThemeState:CPThemeStateHighlighted];
}
- (BOOL)isHighlighted
{
return [self hasThemeState:CPThemeStateHighlighted];
}
@end
var CPControlIsEnabledKey = @"CPControlIsEnabledKey",
CPControlAlignmentKey = @"CPControlAlignmentKey",
CPControlFontKey = @"CPControlFontKey",
CPControlTextColorKey = @"CPControlTextColorKey",
CPControlTargetKey = @"CPControlTargetKey",
CPControlActionKey = @"CPControlActionKey",
CPControlSendActionOnKey = @"CPControlSendActionOnKey";
var CPControlValueKey = "CPControlValueKey",
CPControlControlStateKey = @"CPControlControlStateKey",
CPControlIsEnabledKey = "CPControlIsEnabledKey",
CPControlTargetKey = "CPControlTargetKey",
CPControlActionKey = "CPControlActionKey",
CPControlSendActionOnKey = "CPControlSendActionOnKey",
CPControlSendsActionOnEndEditingKey = "CPControlSendsActionOnEndEditingKey";
var __Deprecated__CPImageViewImageKey = @"CPImageViewImageKey";
@implementation CPControl (CPCoding)
@@ -420,19 +589,16 @@ var CPControlIsEnabledKey = @"CPControlIsEnabledKey",
- (id)initWithCoder:(CPCoder)aCoder
{
self = [super initWithCoder:aCoder];
if (self)
{
[self setEnabled:[aCoder decodeIntForKey:CPControlIsEnabledKey]];
[self setAlignment:[aCoder decodeIntForKey:CPControlAlignmentKey]];
[self setFont:[aCoder decodeObjectForKey:CPControlFontKey]];
[self setTextColor:[aCoder decodeObjectForKey:CPControlTextColorKey]];
[self setObjectValue:[aCoder decodeObjectForKey:CPControlValueKey]];
[self setTarget:[aCoder decodeObjectForKey:CPControlTargetKey]];
[self setAction:[aCoder decodeObjectForKey:CPControlActionKey]];
_sendActionOn = [aCoder decodeIntForKey:CPControlSendActionOnKey];
[self sendActionOn:[aCoder decodeIntForKey:CPControlSendActionOnKey]];
[self setSendsActionOnEndEditing:[aCoder decodeBoolForKey:CPControlSendsActionOnEndEditingKey]];
}
return self;
@@ -445,29 +611,31 @@ var CPControlIsEnabledKey = @"CPControlIsEnabledKey",
- (void)encodeWithCoder:(CPCoder)aCoder
{
[super encodeWithCoder:aCoder];
[aCoder encodeInt:_isEnabled forKey:CPControlIsEnabledKey];
[aCoder encodeInt:_alignment forKey:CPControlAlignmentKey];
[aCoder encodeObject:_font forKey:CPControlFontKey];
[aCoder encodeObject:_textColor forKey:CPControlTextColorKey];
[aCoder encodeConditionalObject:_target forKey:CPControlTargetKey];
[aCoder encodeObject:_action forKey:CPControlActionKey];
if (_sendsActionOnEndEditing)
[aCoder encodeBool:_sendsActionOnEndEditing forKey:CPControlSendsActionOnEndEditingKey];
if (_value !== nil)
[aCoder encodeObject:_value forKey:CPControlValueKey];
if (_target !== nil)
[aCoder encodeConditionalObject:_target forKey:CPControlTargetKey];
if (_action !== NULL)
[aCoder encodeObject:_action forKey:CPControlActionKey];
[aCoder encodeInt:_sendActionOn forKey:CPControlSendActionOnKey];
}
@end
var _CPControlSizeIdentifiers = [],
_CPControlCachedThreePartImages = {},
_CPControlCachedColorWithPatternImages = {},
_CPControlCachedThreePartImagePattern = {};
_CPControlSizeIdentifiers[CPRegularControlSize] = @"Regular";
_CPControlSizeIdentifiers[CPSmallControlSize] = @"Small";
_CPControlSizeIdentifiers[CPMiniControlSize] = @"Mini";
_CPControlSizeIdentifiers[CPRegularControlSize] = "Regular";
_CPControlSizeIdentifiers[CPSmallControlSize] = "Small";
_CPControlSizeIdentifiers[CPMiniControlSize] = "Mini";
function _CPControlIdentifierForControlSize(aControlSize)
{
@@ -478,7 +646,7 @@ function _CPControlColorWithPatternImage(sizes, aClassName)
{
var index = 1,
count = arguments.length,
identifier = @"";
identifier = "";
for (; index < count; ++index)
identifier += arguments[index];
@@ -489,7 +657,7 @@ function _CPControlColorWithPatternImage(sizes, aClassName)
{
var bundle = [CPBundle bundleForClass:[CPControl class]];
color = [CPColor colorWithPatternImage:[[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:aClassName + "/" + identifier + @".png"] size:sizes[identifier]]];
color = [CPColor colorWithPatternImage:[[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:aClassName + "/" + identifier + ".png"] size:sizes[identifier]]];
_CPControlCachedColorWithPatternImages[identifier] = color;
}
@@ -497,41 +665,11 @@ function _CPControlColorWithPatternImage(sizes, aClassName)
return color;
}
function _CPControlThreePartImages(sizes, aClassName)
{
var index = 1,
count = arguments.length,
identifier = @"";
for (; index < count; ++index)
identifier += arguments[index];
var images = _CPControlCachedThreePartImages[identifier];
if (!images)
{
var bundle = [CPBundle bundleForClass:[CPControl class]],
path = aClassName + "/" + identifier;
sizes = sizes[identifier];
images = [
[[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:path + @"0.png"] size:sizes[0]],
[[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:path + @"1.png"] size:sizes[1]],
[[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:path + @"2.png"] size:sizes[2]]
];
_CPControlCachedThreePartImages[identifier] = images;
}
return images;
}
function _CPControlThreePartImagePattern(isVertical, sizes, aClassName)
{
var index = 2,
count = arguments.length,
identifier = @"";
identifier = "";
for (; index < count; ++index)
identifier += arguments[index];
@@ -546,9 +684,9 @@ function _CPControlThreePartImagePattern(isVertical, sizes, aClassName)
sizes = sizes[identifier];
color = [CPColor colorWithPatternImage:[[CPThreePartImage alloc] initWithImageSlices:[
[[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:path + @"0.png"] size:sizes[0]],
[[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:path + @"1.png"] size:sizes[1]],
[[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:path + @"2.png"] size:sizes[2]]
[[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:path + "0.png"] size:sizes[0]],
[[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:path + "1.png"] size:sizes[1]],
[[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:path + "2.png"] size:sizes[2]]
] isVertical:isVertical]];
_CPControlCachedThreePartImagePattern[identifier] = color;
@@ -556,4 +694,3 @@ function _CPControlThreePartImagePattern(isVertical, sizes, aClassName)
return color;
}
+12 -10
View File
@@ -20,12 +20,14 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
import <Foundation/CPObject.j>
import <Foundation/CPString.j>
@import <Foundation/CPObject.j>
@import <Foundation/CPString.j>
/*
<objj>CPCookie</objj> is the Cappuccino interface to a web browser cookie. You can set the name
/*!
@ingroup appkit
@class CPCookie
CPCookie is the Cappuccino interface to a web browser cookie. You can set the name
*/
@implementation CPCookie : CPObject
{
@@ -35,8 +37,8 @@ import <Foundation/CPString.j>
CPString _expires;
}
/*
Initializes a cookie with a given name <code>aName</code>.
/*!
Initializes a cookie with a given name \c aName.
@param the name for the cookie
*/
- (id)initWithName:(CPString)aName
@@ -49,7 +51,7 @@ import <Foundation/CPString.j>
return self;
}
/*
/*!
Returns the cookie's data value
*/
- (CPString)value
@@ -57,7 +59,7 @@ import <Foundation/CPString.j>
return _cookieValue;
}
/*
/*!
Returns the cookie's name
*/
- (CPString)name
@@ -65,7 +67,7 @@ import <Foundation/CPString.j>
return _cookieName;
}
/*
/*!
Returns the cookie's expiration date
*/
- (CPString)expires
@@ -73,7 +75,7 @@ import <Foundation/CPString.j>
return _expires;
}
/*
/*!
Sets a value, expiration date, and domain for the cookie
@param value the cookie's value
@param date the cookie's expiration date
+272
View File
@@ -0,0 +1,272 @@
/*
Testing browsers:
WebKit r50235 (Safari 4.0.3+)
FireFox 3.5
Opera 10.0.0
Implemented class methods:
Webkit : All
IE : All
FireFox Win : All
FireFox Mac : All except closedHandCursor disappearingItemCursor // Firefox mac does not support url cursors
Opera : All except resizeLeftRightCursor resizeUpDownCursor operationNotAllowedCursor dragCopyCursor dragLinkCursor contextualMenuCursor openHandCursor closedHandCursor disappearingItemCursor // Opera does not support url cursors so these won't work with images
*/
#include "Platform/Platform.h"
var currentCursor = nil,
cursorStack = [],
cursors = {},
cursorURLFormat = nil;
@implementation CPCursor : CPObject
{
CPString _cssString;
BOOL _isSetOnMouseEntered @accessors(readwrite, getter=isSetOnMouseEntered, setter=setOnMouseEntered:);
BOOL _isSetOnMouseExited @accessors(readwrite, getter=isSetOnMouseExited, setter=setOnMouseExited:);
}
+ (CPCursor)currentCursor
{
return currentCursor;
}
- (id)initWithCSSString:(CPString)aString
{
if (self = [super init])
_cssString = aString;
return self;
}
+ (CPCursor)cursorWithCSSString:(CPString)cssString
{
var cursor = cursors[cssString];
if (typeof cursor == 'undefined')
{
cursor = [[CPCursor alloc] initWithCSSString:cssString];
cursors[cssString] = cursor;
}
return cursor;
}
+ (CPCursor)cursorWithImageNamed:(CPString)imageName
{
if (!cursorURLFormat)
{
cursorURLFormat = @"url(" + [[CPBundle bundleForClass:self] resourcePath] + @"/CPCursor/%@.cur)";
if (CPBrowserIsEngine(CPGeckoBrowserEngine))
cursorURLFormat += ", default";
}
var url = [CPString stringWithFormat:cursorURLFormat, imageName];
return [[CPCursor alloc] initWithCSSString:url];
}
- (CPString)_cssString
{
return _cssString;
}
+ (CPCursor)arrowCursor
{
return [CPCursor cursorWithCSSString:@"default"]; // WebKit | FF | opera | IE
}
+ (CPCursor)crosshairCursor
{
return [CPCursor cursorWithCSSString:@"crosshair"]; // WebKit | FF | opera | IE
}
+ (CPCursor)IBeamCursor
{
return [CPCursor cursorWithCSSString:@"text"]; // WebKit | FF | opera | IE
}
+ (CPCursor)pointingHandCursor
{
return [CPCursor cursorWithCSSString:@"pointer"]; // WebKit | FF | opera | IE
}
+ (CPCursor)resizeDownCursor
{
if (CPBrowserIsEngine(CPInternetExplorerBrowserEngine))
return [CPCursor cursorWithImageNamed:CPStringFromSelector(_cmd)];
return [CPCursor cursorWithCSSString:"s-resize"]; // WebKit | FF | opera
}
+ (CPCursor)resizeUpCursor
{
if (CPBrowserIsEngine(CPInternetExplorerBrowserEngine))
return [CPCursor cursorWithImageNamed:CPStringFromSelector(_cmd)];
return [CPCursor cursorWithCSSString:@"n-resize"]; // WebKit | FF | opera
}
+ (CPCursor)resizeLeftCursor
{
if (CPBrowserIsEngine(CPInternetExplorerBrowserEngine))
return [CPCursor cursorWithImageNamed:CPStringFromSelector(_cmd)];
return [CPCursor cursorWithCSSString:@"w-resize"]; // WebKit | FF | opera
}
+ (CPCursor)resizeRightCursor
{
if (CPBrowserIsEngine(CPInternetExplorerBrowserEngine))
return [CPCursor cursorWithImageNamed:CPStringFromSelector(_cmd)];
return [CPCursor cursorWithCSSString:@"e-resize"]; // WebKit | FF | opera
}
+ (CPCursor)resizeLeftRightCursor
{
return [CPCursor cursorWithCSSString:@"col-resize"]; // WebKit | FF | IE
}
+ (CPCursor)resizeUpDownCursor
{
return [CPCursor cursorWithCSSString:@"row-resize"]; // WebKit | FF | IE
}
+ (CPCursor)operationNotAllowedCursor
{
return [CPCursor cursorWithCSSString:@"not-allowed"]; // WebKit | FF | IE
}
+ (CPCursor)dragCopyCursor
{
if (CPBrowserIsEngine(CPInternetExplorerBrowserEngine))
return [CPCursor cursorWithImageNamed:CPStringFromSelector(_cmd)];
return [CPCursor cursorWithCSSString:@"copy"]; // WebKit | FF
}
+ (CPCursor)dragLinkCursor
{
if (CPBrowserIsEngine(CPInternetExplorerBrowserEngine))
return [CPCursor cursorWithImageNamed:CPStringFromSelector(_cmd)];
return [CPCursor cursorWithCSSString:@"alias"]; // WebKit | FF
}
+ (CPCursor)contextualMenuCursor
{
if (CPBrowserIsEngine(CPInternetExplorerBrowserEngine))
return [CPCursor cursorWithImageNamed:CPStringFromSelector(_cmd)];
return [CPCursor cursorWithCSSString:@"context-menu"]; // WebKit | FF Mac . Not impl FF Win.
}
+ (CPCursor)openHandCursor
{
if (CPBrowserIsEngine(CPWebKitBrowserEngine))
return [CPCursor cursorWithCSSString:@"-webkit-grab"];
else if (CPBrowserIsEngine(CPGeckoBrowserEngine) || CPBrowserIsEngine(CPOperaBrowserEngine))
return [CPCursor cursorWithCSSString:@"move"];
return [CPCursor cursorWithImageNamed:CPStringFromSelector(_cmd)]; // WebKit only. move in FFMac|Opera
}
+ (CPCursor)closedHandCursor
{
if (CPBrowserIsEngine(CPWebKitBrowserEngine))
return [CPCursor cursorWithCSSString:@"-webkit-grabbing"];
return [CPCursor cursorWithImageNamed:CPStringFromSelector(_cmd)]; // WebKit only
}
+ (CPCursor)disappearingItemCursor
{
return [CPCursor cursorWithImageNamed:CPStringFromSelector(_cmd)]; // None
}
+ (void)hide
{
[self _setCursorCSS:"none"]; // Not supported in IE
}
+ (void)unhide
{
[self _setCursorCSS:[currentCursor _cssString]]
}
+ (void)setHiddenUntilMouseMoves:(BOOL)flag
{
if (flag)
[CPCursor hide];
else
[CPCursor unhide];
}
- (id)initWithImage:(CPImage)image hotSpot:(CPPoint)hotSpot
{
return [self initWithCSSString:"url(" + [image filename] + ")"];
}
- (void)mouseEntered:(CPEvent)event
{
}
- (void)mouseExited:(CPEvent)event
{
}
- (void)set
{
currentCursor = self;
#if PLATFORM(DOM)
[[self class] _setCursorCSS:_cssString];
#endif
}
+ (void)_setCursorCSS:(CPString)aString
{
#if PLATFORM(DOM)
var platformWindows = [[CPPlatformWindow visiblePlatformWindows] allObjects];
for (var i = 0, count = [platformWindows count]; i < count; i++)
platformWindows[i]._DOMBodyElement.style.cursor = aString;
#endif
}
- (void)push
{
currentCursor = cursorStack.push(self);
}
- (void)pop
{
[CPCursor pop];
}
+ (void)pop
{
if (cursorStack.length > 1)
{
cursorStack.pop();
currentCursor = cursorStack[cursorStack.length - 1];
}
}
- (id)initWithCoder:(CPCoder)coder
{
if (self = [super init])
_cssString = [coder decodeObjectForKey:@"CPCursorNameKey"];
return self;
}
- (void)encodeWithCoder:(CPCoder)coder
{
[coder encodeObject:_cssString forKey:@"CPCursorNameKey"];
}
@end
+299 -92
View File
@@ -20,11 +20,14 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
import <Foundation/CPString.j>
import <Foundation/CPArray.j>
@import <Foundation/CPString.j>
@import <Foundation/CPArray.j>
@import "CPResponder.j"
@import "CPSavePanel.j"
@import "CPViewController.j"
@import "CPWindowController.j"
import "CPResponder.j"
import "CPWindowController.j"
/*
@global
@@ -79,29 +82,38 @@ CPDocumentDidFailToSaveNotification = @"CPDocumentDidFailToSaveNotification";
var CPDocumentUntitledCount = 0;
/*
<objj>CPDocument</objj> is used to represent a document/file in a Cappuccino application.
/*!
@ingroup appkit
@class CPDocument
CPDocument is used to represent a document/file in a Cappuccino application.
In a document-based application, generally multiple documents are open simutaneously
(multiple text documents, slide presentations, spreadsheets, etc.), and multiple
<objj>CPDocument</objj>s should be used to represent this.
CPDocuments should be used to represent this.
*/
@implementation CPDocument : CPResponder
{
CPURL _fileURL;
CPString _fileType;
CPArray _windowControllers;
unsigned _untitledDocumentIndex;
{
CPWindow _window; // For outlet purposes.
CPView _view; // For outlet purposes
CPDictionary _viewControllersForWindowControllers;
BOOL _hasUndoManager;
CPUndoManager _undoManager;
int _changeCount;
CPURLConnection _readConnection;
CPURLRequest _writeRequest;
CPURL _fileURL;
CPString _fileType;
CPArray _windowControllers;
unsigned _untitledDocumentIndex;
BOOL _hasUndoManager;
CPUndoManager _undoManager;
int _changeCount;
CPURLConnection _readConnection;
CPURLRequest _writeRequest;
CPAlert _canCloseAlert;
}
/*
/*!
Initializes an empty document.
@return the initialized document
*/
@@ -112,17 +124,18 @@ var CPDocumentUntitledCount = 0;
if (self)
{
_windowControllers = [];
_viewControllersForWindowControllers = [CPDictionary dictionary];
_hasUndoManager = YES;
_changeCount = 0;
[self setNextResponder:CPApp];
}
return self;
}
/*
/*!
Initializes the document with a specific data type.
@param aType the type of document to initialize
@param anError not used
@@ -138,7 +151,7 @@ var CPDocumentUntitledCount = 0;
return self;
}
/*
/*!
Initializes a document of a specific type located at a URL. Notifies
the provided delegate after initialization.
@param anAbsoluteURL the url of the document content
@@ -155,23 +168,23 @@ var CPDocumentUntitledCount = 0;
if (self)
{
[self readFromURL:anAbsoluteURL ofType:aType delegate:aDelegate didReadSelector:aDidReadSelector contextInfo:aContextInfo];
[self setFileURL:anAbsoluteURL];
[self setFileType:aType];
[self readFromURL:anAbsoluteURL ofType:aType delegate:aDelegate didReadSelector:aDidReadSelector contextInfo:aContextInfo];
}
return self;
}
/*
/*!
Initializes the document from a URL.
@param anAbsoluteURL the document location
@param absoluteContentsURL the location of the document's contents
@param aType the type of the contents
@param aDelegate this object will receive a callback after the document's contents are loaded
@param aDidReadSelector the message selector that will be sent to <code>aDelegate</code>
@param aContextInfo passed as the argument to the message sent to the <code>aDelegate</code>
@param aDidReadSelector the message selector that will be sent to \c aDelegate
@param aContextInfo passed as the argument to the message sent to the \c aDelegate
@return the initialized document
*/
- (id)initForURL:(CPURL)anAbsoluteURL withContentsOfURL:(CPURL)absoluteContentsURL ofType:(CPString)aType delegate:(id)aDelegate didReadSelector:(SEL)aDidReadSelector contextInfo:(id)aContextInfo
@@ -180,16 +193,16 @@ var CPDocumentUntitledCount = 0;
if (self)
{
[self readFromURL:absoluteContentsURL ofType:aType delegate:aDelegate didReadSelector:aDidReadSelector contextInfo:aContextInfo];
[self setFileURL:anAbsoluteURL];
[self setFileType:aType];
[self readFromURL:absoluteContentsURL ofType:aType delegate:aDelegate didReadSelector:aDidReadSelector contextInfo:aContextInfo];
}
return self;
}
/*
/*!
Returns the receiver's data in a specified type. The default implementation just
throws an exception.
@param aType the format of the data
@@ -203,7 +216,7 @@ var CPDocumentUntitledCount = 0;
reason:"dataOfType:error: must be overridden by the document subclass."];
}
/*
/*!
Sets the content of the document by reading the provided
data. The default implementation just throws an exception.
@param aData the document's data
@@ -218,18 +231,76 @@ var CPDocumentUntitledCount = 0;
reason:"readFromData:ofType: must be overridden by the document subclass."];
}
- (void)viewControllerWillLoadCib:(CPViewController)aViewController
{
}
- (void)viewControllerDidLoadCib:(CPViewController)aViewController
{
}
- (CPWindowController)firstEligibleExistingWindowController
{
return nil;
}
// Creating and managing window controllers
/*
/*!
Creates the window controller for this document.
*/
- (void)makeWindowControllers
{
var controller = [[CPWindowController alloc] initWithWindowCibName:nil];
[self addWindowController:controller];
[self makeViewAndWindowControllers];
}
/*
- (void)makeViewAndWindowControllers
{
var viewCibName = [self viewCibName],
viewController = nil,
windowController = nil;
// Create our view controller if we have a cib for it.
if ([viewCibName length])
viewController = [[CPViewController alloc] initWithCibName:viewCibName bundle:nil owner:self];
// If we have a view controller, check if we have a free window for it.
if (viewController)
windowController = [self firstEligibleExistingWindowController];
// If not, create one.
if (!windowController)
{
var windowCibName = [self windowCibName];
// From a cib if we have one.
if ([windowCibName length])
windowController = [[CPWindowController alloc] initWithWindowCibName:windowCibName owner:self];
// If not you get a standard window capable of displaying multiple documents and view
else if (viewController)
{
var view = [viewController view],
viewFrame = [view frame];
viewFrame.origin = CGPointMake(50, 50);
var theWindow = [[CPWindow alloc] initWithContentRect:viewFrame styleMask:CPTitledWindowMask | CPClosableWindowMask | CPMiniaturizableWindowMask | CPResizableWindowMask];
windowController = [[CPWindowController alloc] initWithWindow:theWindow];
}
}
if (windowController && viewController)
[windowController setSupportsMultipleDocuments:YES];
if (windowController)
[self addWindowController:windowController];
if (viewController)
[self addViewController:viewController forWindowController:windowController];
}
/*!
Returns the document's window controllers
*/
- (CPArray)windowControllers
@@ -237,7 +308,7 @@ var CPDocumentUntitledCount = 0;
return _windowControllers;
}
/*
/*!
Add a controller to the document's list of controllers. This should
be called after making a new window controller.
@param aWindowController the controller to add
@@ -245,24 +316,65 @@ var CPDocumentUntitledCount = 0;
- (void)addWindowController:(CPWindowController)aWindowController
{
[_windowControllers addObject:aWindowController];
if ([aWindowController document] != self)
{
[aWindowController setNextResponder:self];
if ([aWindowController document] !== self)
[aWindowController setDocument:self];
}
}
/*!
Remove a controller to the document's list of controllers. This should
be called after closing the controller's window.
@param aWindowController the controller to remove
*/
- (void)removeWindowController:(CPWindowController)aWindowController
{
if (aWindowController)
[_windowControllers removeObject:aWindowController];
if ([aWindowController document] === self)
[aWindowController setDocument:nil];
}
- (CPView)view
{
return _view;
}
- (CPArray)viewControllers
{
return [_viewControllersForWindowControllers allValues];
}
- (void)addViewController:(CPViewController)aViewController forWindowController:(CPWindowController)aWindowController
{
// FIXME: exception if we don't own the window controller?
[_viewControllersForWindowControllers setObject:aViewController forKey:[aWindowController UID]];
if ([aWindowController document] === self)
[aWindowController setViewController:aViewController];
}
- (void)removeViewController:(CPViewController)aViewController
{
[_viewControllersForWindowControllers removeObject:aViewController];
}
- (CPViewController)viewControllerForWindowController:(CPWindowController)aWindowController
{
return [_viewControllersForWindowControllers objectForKey:[aWindowController UID]];
}
// Managing Document Windows
/*
/*!
Shows all the document's windows.
*/
- (void)showWindows
{
[_windowControllers makeObjectsPerformSelector:@selector(setDocument:) withObject:self];
[_windowControllers makeObjectsPerformSelector:@selector(showWindow:) withObject:self];
}
/*
/*!
Returns the name of the document as displayed in the title bar.
*/
- (CPString)displayName
@@ -279,7 +391,12 @@ var CPDocumentUntitledCount = 0;
return @"Untitled " + _untitledDocumentIndex;
}
/*
- (CPString)viewCibName
{
return nil;
}
/*!
Returns the document's Cib name
*/
- (CPString)windowCibName
@@ -287,24 +404,24 @@ var CPDocumentUntitledCount = 0;
return nil;
}
/*
Called after <code>aWindowController<code> loads the document's Nib file.
/*!
Called after \c aWindowController loads the document's Nib file.
@param aWindowController the controller that loaded the Nib file
*/
- (void)windowControllerDidLoadNib:(CPWindowController)aWindowController
- (void)windowControllerDidLoadCib:(CPWindowController)aWindowController
{
}
/*
Called before <code>aWindowController</code> will load the document's Nib file.
/*!
Called before \c aWindowController will load the document's Nib file.
@param aWindowController the controller that will load the Nib file
*/
- (void)windowControllerWillLoadNib:(CPWindowController)aWindowController
- (void)windowControllerWillLoadCib:(CPWindowController)aWindowController
{
}
// Reading from and Writing to URLs
/*
/*!
Set the document's data from a URL. Notifies the provided delegate afterwards.
@param anAbsoluteURL the URL to the document's content
@param aType the document type
@@ -318,11 +435,11 @@ var CPDocumentUntitledCount = 0;
// FIXME: Oh man is this every looking for trouble, we need to handle login at the Cappuccino level, with HTTP Errors.
_readConnection = [CPURLConnection connectionWithRequest:[CPURLRequest requestWithURL:anAbsoluteURL] delegate:self];
_readConnection.session = _CPReadSessionMake(aType, aDelegate, aDidReadSelector, aContextInfo);
}
/*
/*!
Returns the path to the document's file.
*/
- (CPURL)fileURL
@@ -330,13 +447,13 @@ var CPDocumentUntitledCount = 0;
return _fileURL;
}
/*
/*!
Sets the path to the document's file.
@param aFileURL the path to the document's file
*/
- (void)setFileURL:(CPURL)aFileURL
{
if (_fileURL == aFileURL)
if (_fileURL === aFileURL)
return;
_fileURL = aFileURL;
@@ -344,7 +461,7 @@ var CPDocumentUntitledCount = 0;
[_windowControllers makeObjectsPerformSelector:@selector(synchronizeWindowTitleWithDocumentName)];
}
/*
/*!
Saves the document to the specified URL. Notifies the provided delegate
with the provided selector and context info afterwards.
@param anAbsoluteURL the url to write the document data to
@@ -361,17 +478,22 @@ var CPDocumentUntitledCount = 0;
_writeRequest = [CPURLRequest requestWithURL:anAbsoluteURL];
[_writeRequest setHTTPMethod:@"POST"];
[_writeRequest setHTTPBody:[data string]];
// FIXME: THIS IS WRONG! We need a way to decide
if ([CPPlatform isBrowser])
[_writeRequest setHTTPMethod:@"POST"];
else
[_writeRequest setHTTPMethod:@"PUT"];
[_writeRequest setHTTPBody:[data rawString]];
[_writeRequest setValue:@"close" forHTTPHeaderField:@"Connection"];
if (aSaveOperation == CPSaveOperation)
[_writeRequest setValue:@"true" forHTTPHeaderField:@"x-cappuccino-overwrite"];
if (aSaveOperation != CPSaveToOperation)
[self updateChangeCount:CPChangeCleared];
// FIXME: Oh man is this every looking for trouble, we need to handle login at the Cappuccino level, with HTTP Errors.
var connection = [CPURLConnection connectionWithRequest:_writeRequest delegate:self];
@@ -384,10 +506,14 @@ var CPDocumentUntitledCount = 0;
*/
- (void)connection:(CPURLConnection)aConnection didReceiveResponse:(CPURLResponse)aResponse
{
// If we got this far and it wasn't an HTTP request, then everything is fine.
if (![aResponse isKindOfClass:[CPHTTPURLResponse class]])
return;
var statusCode = [aResponse statusCode];
// Nothing to do if everything is hunky dory.
if (statusCode == 200)
if (statusCode === 200)
return;
var session = aConnection.session;
@@ -424,6 +550,7 @@ var CPDocumentUntitledCount = 0;
_writeRequest = nil;
objj_msgSend(session.delegate, session.didSaveSelector, self, NO, session.contextInfo);
[self _sendDocumentSavedNotification:NO];
}
}
}
@@ -440,7 +567,7 @@ var CPDocumentUntitledCount = 0;
// READ
if (aConnection == _readConnection)
{
[self readFromData:[CPData dataWithString:aData] ofType:session.fileType error:nil];
[self readFromData:[CPData dataWithRawString:aData] ofType:session.fileType error:nil];
objj_msgSend(session.delegate, session.didReadSelector, self, YES, session.contextInfo);
}
@@ -452,6 +579,7 @@ var CPDocumentUntitledCount = 0;
_writeRequest = nil;
objj_msgSend(session.delegate, session.didSaveSelector, self, YES, session.contextInfo);
[self _sendDocumentSavedNotification:YES];
}
}
@@ -479,6 +607,7 @@ var CPDocumentUntitledCount = 0;
alert("There was an error saving the document.");
objj_msgSend(session.delegate, session.didSaveSelector, self, NO, session.contextInfo);
[self _sendDocumentSavedNotification:NO];
}
}
@@ -493,15 +622,15 @@ var CPDocumentUntitledCount = 0;
}
// Managing Document Status
/*
Returns <code>YES</code> if there are any unsaved changes.
/*!
Returns \c YES if there are any unsaved changes.
*/
- (BOOL)isDocumentEdited
{
return _changeCount != 0;
}
/*
/*!
Updates the number of unsaved changes to the document.
@param aChangeType a new document change to apply
*/
@@ -521,7 +650,7 @@ var CPDocumentUntitledCount = 0;
}
// Managing File Types
/*
/*!
Sets the document's file type
@param aType the document's type
*/
@@ -530,7 +659,7 @@ var CPDocumentUntitledCount = 0;
_fileType = aType;
}
/*
/*!
Returns the document's file type
*/
- (CPString)fileType
@@ -539,18 +668,18 @@ var CPDocumentUntitledCount = 0;
}
// Working with Undo Manager
/*
Returns <code>YES</code> if the document has a
<objj>CPUndoManager</objj>.
/*!
Returns \c YES if the document has a
CPUndoManager.
*/
- (BOOL)hasUndoManager
{
return _hasUndoManager;
}
/*
Sets whether the document should have a <objj>CPUndoManager</objj>.
@param aFlag <code>YES</code> makes the document have an undo manager
/*!
Sets whether the document should have a CPUndoManager.
@param aFlag \c YES makes the document have an undo manager
*/
- (void)setHasUndoManager:(BOOL)aFlag
{
@@ -632,9 +761,9 @@ var CPDocumentUntitledCount = 0;
}
}
/*
/*!
Returns the document's undo manager. If the document
should have one, but the manager is <code>nil</code>, it
should have one, but the manager is \c nil, it
will be created and then returned.
@return the document's undo manager
*/
@@ -647,7 +776,7 @@ var CPDocumentUntitledCount = 0;
}
/*
Implemented as a delegate of a <objj>CPWindow</objj>
Implemented as a delegate of a CPWindow
@ignore
*/
- (CPUndoManager)windowWillReturnUndoManager:(CPWindow)aWindow
@@ -656,13 +785,18 @@ var CPDocumentUntitledCount = 0;
}
// Handling User Actions
/*
/*!
Saves the document. If the document does not
have a file path to save to (<code>fileURL</code>)
then <code>saveDocumentAs:</code> will be called.
have a file path to save to (\c fileURL)
then \c -saveDocumentAs: will be called.
@param aSender the object requesting the save
*/
- (void)saveDocument:(id)aSender
{
[self saveDocumentWithDelegate:nil didSaveSelector:nil contextInfo:nil];
}
- (void)saveDocumentWithDelegate:(id)delegate didSaveSelector:(SEL)didSaveSelector contextInfo:(Object)contextInfo
{
if (_fileURL)
{
@@ -670,34 +804,42 @@ var CPDocumentUntitledCount = 0;
postNotificationName:CPDocumentWillSaveNotification
object:self];
[self saveToURL:_fileURL ofType:[self fileType] forSaveOperation:CPSaveOperation delegate:self didSaveSelector:@selector(document:didSave:contextInfo:) contextInfo:NULL];
[self saveToURL:_fileURL ofType:[self fileType] forSaveOperation:CPSaveOperation delegate:delegate didSaveSelector:didSaveSelector contextInfo:contextInfo];
}
else
[self saveDocumentAs:self];
[self _saveDocumentAsWithDelegate:delegate didSaveSelector:didSaveSelector contextInfo:contextInfo];
}
/*
/*!
Saves the document to a user specified path.
@param aSender the object requesting the operation
*/
- (void)saveDocumentAs:(id)aSender
{
_documentName = window.prompt("Document Name:");
[self _saveDocumentAsWithDelegate:nil didSaveSelector:nil contextInfo:nil];
}
if (!_documentName)
- (void)_saveDocumentAsWithDelegate:(id)delegate didSaveSelector:(SEL)didSaveSelector contextInfo:(Object)contextInfo
{
var savePanel = [CPSavePanel savePanel],
response = [savePanel runModal];
if (!response)
return;
var saveURL = [savePanel URL];
[[CPNotificationCenter defaultCenter]
postNotificationName:CPDocumentWillSaveNotification
object:self];
[self saveToURL:[self proposedFileURL] ofType:[self fileType] forSaveOperation:CPSaveAsOperation delegate:self didSaveSelector:@selector(document:didSave:contextInfo:) contextInfo:NULL];
[self saveToURL:saveURL ofType:[self fileType] forSaveOperation:CPSaveAsOperation delegate:delegate didSaveSelector:didSaveSelector contextInfo:contextInfo];
}
/*
@ignore
*/
- (void)document:(id)aDocument didSave:(BOOL)didSave contextInfo:(id)aContextInfo
- (void)_sendDocumentSavedNotification:(BOOL)didSave
{
if (didSave)
[[CPNotificationCenter defaultCenter]
@@ -711,6 +853,71 @@ var CPDocumentUntitledCount = 0;
@end
@implementation CPDocument (ClosingDocuments)
- (void)close
{
[_windowControllers makeObjectsPerformSelector:@selector(removeDocumentAndCloseIfNecessary:) withObject:self];
[[CPDocumentController sharedDocumentController] removeDocument:self];
}
- (void)shouldCloseWindowController:(CPWindowController)controller delegate:(id)delegate shouldCloseSelector:(SEL)selector contextInfo:(Object)info
{
if ([controller shouldCloseDocument] || ([_windowControllers count] < 2 && [_windowControllers indexOfObject:controller] !== CPNotFound))
[self canCloseDocumentWithDelegate:self shouldCloseSelector:@selector(_document:shouldClose:context:) contextInfo:{delegate:delegate, selector:selector, context:info}];
else if ([delegate respondsToSelector:selector])
objj_msgSend(delegate, selector, self, YES, info);
}
- (void)_document:(CPDocument)aDocument shouldClose:(BOOL)shouldClose context:(Object)context
{
if (aDocument === self && shouldClose)
[self close];
objj_msgSend(context.delegate, context.selector, aDocument, shouldClose, context.context);
}
- (void)canCloseDocumentWithDelegate:(id)aDelegate shouldCloseSelector:(SEL)aSelector contextInfo:(Object)context
{
if (![self isDocumentEdited])
return [aDelegate respondsToSelector:aSelector] && objj_msgSend(aDelegate, aSelector, self, YES, context);
_canCloseAlert = [[CPAlert alloc] init];
[_canCloseAlert setDelegate:self];
[_canCloseAlert setAlertStyle:CPWarningAlertStyle];
[_canCloseAlert setTitle:@"Unsaved Document"];
[_canCloseAlert setMessageText:@"Do you want to save the changes you've made to the document \"" + ([self displayName] || [self fileName]) + "\"?"];
[_canCloseAlert addButtonWithTitle:@"Save"];
[_canCloseAlert addButtonWithTitle:@"Cancel"];
[_canCloseAlert addButtonWithTitle:@"Don't Save"];
_canCloseAlert._context = {delegate:aDelegate, selector:aSelector, context:context};
[_canCloseAlert runModal];
}
- (void)alertDidEnd:(CPAlert)alert returnCode:(int)returnCode
{
if (alert !== _canCloseAlert)
return;
var delegate = alert._context.delegate,
selector = alert._context.selector,
context = alert._context.context;
if (returnCode === 0)
[self saveDocumentWithDelegate:delegate didSaveSelector:selector contextInfo:context];
else
objj_msgSend(delegate, selector, self, returnCode === 2, context);
_canCloseAlert = nil;
}
@end
var _CPReadSessionMake = function(aType, aDelegate, aDidReadSelector, aContextInfo)
{
return { fileType:aType, delegate:aDelegate, didReadSelector:aDidReadSelector, contextInfo:aContextInfo };
+184 -34
View File
@@ -20,14 +20,18 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
import <Foundation/CPObject.j>
import <Foundation/CPBundle.j>
@import <Foundation/CPObject.j>
@import <Foundation/CPBundle.j>
@import "CPDocument.j"
@import "CPOpenPanel.j";
import "CPDocument.j"
var CPSharedDocumentController = nil;
/*
/*!
@ingroup appkit
@class CPDocumentController
This class is responsible for managing an application's open documents.
*/
@implementation CPDocumentController : CPObject
@@ -36,10 +40,10 @@ var CPSharedDocumentController = nil;
CPArray _documentTypes;
}
/*
/*!
Returns the singleton instance of the application's document controller. If it has not
been created yet, it will be created then returned.
@return a <objj>CPDocumentController</objj>
@return a CPDocumentController
*/
+ (id)sharedDocumentController
{
@@ -70,12 +74,12 @@ var CPSharedDocumentController = nil;
// Creating and Opening Documents
/*
/*!
Returns the document matching the specified URL. This
method searches documents already open. It does not
open the document at the URL if it is not already open.
@param aURL the url of the document
@return the document, or <code>nil</code> if such a document is not open
@return the document, or \c nil if such a document is not open
*/
- (CPDocument)documentForURL:(CPURL)aURL
{
@@ -93,7 +97,7 @@ var CPSharedDocumentController = nil;
return nil;
}
/*
/*!
Creates a new document of the specified type.
@param aType the type of the new document
@param shouldDisplay whether to display the document on screen
@@ -110,11 +114,11 @@ var CPSharedDocumentController = nil;
[theDocument makeWindowControllers];
[theDocument showWindows];
}
return theDocument;
}
/*
/*!
Creates a document of the specified type.
@param aType the document type
@param anError not used
@@ -125,7 +129,7 @@ var CPSharedDocumentController = nil;
return [[[self documentClassForType:aType] alloc] initWithType:aType error:anError];
}
/*
/*!
Opens the document at the specified URL.
@param anAbsoluteURL the path to the document's file
@param shouldDisplay whether to display the document on screen
@@ -135,33 +139,38 @@ var CPSharedDocumentController = nil;
- (CPDocument)openDocumentWithContentsOfURL:(CPURL)anAbsoluteURL display:(BOOL)shouldDisplay error:(CPError)anError
{
var result = [self documentForURL:anAbsoluteURL];
if (!result)
{
var type = [self typeForContentsOfURL:anAbsoluteURL error:anError];
result = [self makeDocumentWithContentsOfURL:anAbsoluteURL ofType:type delegate:self didReadSelector:@selector(document:didRead:contextInfo:) contextInfo:[CPDictionary dictionaryWithObject:shouldDisplay forKey:@"shouldDisplay"]];
[self addDocument:result];
if (result)
[self noteNewRecentDocument:result];
}
else if (shouldDisplay)
[result showWindows];
return result;
}
/*
/*!
Loads a document for a specified URL with it's content
retrieved from another URL.
@param anAbsoluteURL the document URL
@param absoluteContentsURL the location of the document's contents
@param anError not used
@return the loaded document or <code>nil</code> if there was an error
@return the loaded document or \c nil if there was an error
*/
- (CPDocument)reopenDocumentForURL:(CPURL)anAbsoluteURL withContentsOfURL:(CPURL)absoluteContentsURL error:(CPError)anError
{
return [self makeDocumentForURL:anAbsoluteURL withContentsOfURL:absoluteContentsURL ofType:[[_documentTypes objectAtIndex:0] objectForKey:@"CPBundleTypeName"] delegate:self didReadSelector:@selector(document:didRead:contextInfo:) contextInfo:nil];
}
/*
/*!
Creates a document from the contents at the specified URL.
Notifies the provided delegate with the provided selector afterwards.
@param anAbsoluteURL the location of the document data
@@ -175,7 +184,7 @@ var CPSharedDocumentController = nil;
return [[[self documentClassForType:aType] alloc] initWithContentsOfURL:anAbsoluteURL ofType:aType delegate:aDelegate didReadSelector:aSelector contextInfo:aContextInfo];
}
/*
/*!
Creates a document from the contents of a URL, and sets
the document's URL location as another URL.
@param anAbsoluteURL the document's location
@@ -184,7 +193,7 @@ var CPSharedDocumentController = nil;
@param aDelegate receives a callback after the load has completed
@param aSelector the selector to invoke for the callback
@param aContextInfo an object passed as an argument for the callback
@return a new document or <code>nil</code> if there was an error
@return a new document or \c nil if there was an error
*/
- (CPDocument)makeDocumentForURL:(CPURL)anAbsoluteURL withContentsOfURL:(CPURL)absoluteContentsURL ofType:(CPString)aType delegate:(id)aDelegate didReadSelector:(SEL)aSelector contextInfo:(id)aContextInfo
{
@@ -200,14 +209,13 @@ var CPSharedDocumentController = nil;
if (!didRead)
return;
[self addDocument:aDocument];
[aDocument makeWindowControllers];
if ([aContextInfo objectForKey:@"shouldDisplay"])
[aDocument showWindows];
}
/*
/*!
Opens a new document in the application.
@param aSender the requesting object
*/
@@ -216,9 +224,23 @@ var CPSharedDocumentController = nil;
[self openUntitledDocumentOfType:[[_documentTypes objectAtIndex:0] objectForKey:@"CPBundleTypeName"] display:YES];
}
-(void)openDocument:(id)aSender
{
var openPanel = [CPOpenPanel openPanel];
[openPanel runModal];
var URLs = [openPanel URLs],
index = 0,
count = [URLs count];
for (; index < count; ++index)
[self openDocumentWithContentsOfURL:[CPURL URLWithString:URLs[index]] display:YES error:nil];
}
// Managing Documents
/*
/*!
Returns the array of all documents being managed. This is
the same as all open documents in the application.
*/
@@ -227,8 +249,8 @@ var CPSharedDocumentController = nil;
return _documents;
}
/*
Adds <code>aDocument</code> under the control of the receiver.
/*!
Adds \c aDocument under the control of the receiver.
@param aDocument the document to add
*/
- (void)addDocument:(CPDocument)aDocument
@@ -236,8 +258,8 @@ var CPSharedDocumentController = nil;
[_documents addObject:aDocument];
}
/*
Removes <code>aDocument</code> from the control of the receiver.
/*!
Removes \c aDocument from the control of the receiver.
@param aDocument the document to remove
*/
- (void)removeDocument:(CPDocument)aDocument
@@ -255,7 +277,8 @@ var CPSharedDocumentController = nil;
var index = 0,
count = _documentTypes.length,
extension = [[anAbsoluteURL pathExtension] lowercaseString];
extension = [[anAbsoluteURL pathExtension] lowercaseString],
starType = nil;
for (; index < count; ++index)
{
@@ -265,12 +288,17 @@ var CPSharedDocumentController = nil;
extensionCount = extensions.length;
for (; extensionIndex < extensionCount; ++extensionIndex)
if ([extensions[extensionIndex] lowercaseString] == extension)
{
var thisExtension = [extensions[extensionIndex] lowercaseString];
if (thisExtension === extension)
return [documentType objectForKey:@"CPBundleTypeName"];
if (thisExtension === "****")
starType = [documentType objectForKey:@"CPBundleTypeName"];
}
}
// FIXME?
return [self defaultType];//nil;
return starType || [self defaultType];
}
// Managing Document Types
@@ -292,10 +320,10 @@ var CPSharedDocumentController = nil;
return nil;
}
/*
Returns the <objj>CPDocument</objj> subclass associated with <code>aType</code>.
/*!
Returns the CPDocument subclass associated with \c aType.
@param aType the type of document
@return a Cappuccino Class object, or <code>nil</code> if no match was found
@return a Cappuccino Class object, or \c nil if no match was found
*/
- (Class)documentClassForType:(CPString)aType
{
@@ -305,3 +333,125 @@ var CPSharedDocumentController = nil;
}
@end
@implementation CPDocumentController (Closing)
- (void)closeAllDocumentsWithDelegate:(id)aDelegate didCloseAllSelector:(SEL)didCloseSelector contextInfo:(Object)info
{
var context = {
delegate: aDelegate,
selector: didCloseSelector,
context: info
};
[self _closeDocumentsStartingWith:nil shouldClose:YES context:context];
}
// Recursive callback method. Start it by passing in a document of nil.
- (void)_closeDocumentsStartingWith:(CPDocument)aDocument shouldClose:(BOOL)shouldClose context:(Object)context
{
if (shouldClose)
{
[aDocument close];
if ([[self documents] count] > 0)
{
[[[self documents] lastObject] canCloseDocumentWithDelegate:self
shouldCloseSelector:@selector(_closeDocumentsStartingWith:shouldClose:context:)
contextInfo:context];
return;
}
}
if ([context.delegate respondsToSelector:context.selector])
objj_msgSend(context.delegate, context.selector, self, [[self documents] count] === 0, context.context);
}
@end
@implementation CPDocumentController (Recents)
- (CPArray)recentDocumentURLs
{
// FIXME move this to CP land
if (typeof window["cpRecentDocumentURLs"] === 'function')
return window.cpRecentDocumentURLs();
return [];
}
- (void)clearRecentDocuments:(id)sender
{
if (typeof window["cpClearRecentDocuments"] === 'function')
window.cpClearRecentDocuments();
[self _updateRecentDocumentsMenu];
}
- (void)noteNewRecentDocument:(CPDocument)aDocument
{
[self noteNewRecentDocumentURL:[[aDocument fileURL] absoluteString]];
}
- (void)noteNewRecentDocumentURL:(CPString)aURL
{
if (typeof window["cpNoteNewRecentDocumentPath"] === 'function')
window.cpNoteNewRecentDocumentPath(aURL);
[self _updateRecentDocumentsMenu];
}
- (void)_removeAllRecentDocumentsFromMenu:(CPMenu)aMenu
{
var items = [aMenu itemArray],
count = [items count];
while (count--)
{
var item = items[count];
if ([item action] === @selector(_openRecentDocument:))
[aMenu removeItemAtIndex:count];
}
}
- (void)_updateRecentDocumentsMenu
{
var menu = [[CPApp mainMenu] _menuWithName:@"_CPRecentDocumentsMenu"],
recentDocuments = [self recentDocumentURLs],
menuItems = [menu itemArray],
documentCount = [recentDocuments count],
menuItemCount = [menuItems count];
[self _removeAllRecentDocumentsFromMenu:menu];
if (menuItemCount)
{
if (!documentCount)
{
if ([menuItems[0] isSeparatorItem])
[menu removeItemAtIndex:0];
}
else
{
if (![menuItems[0] isSeparatorItem])
[menu insertItem:[CPMenuItem separatorItem] atIndex:0];
}
}
while (documentCount--)
{
var path = recentDocuments[documentCount],
item = [[CPMenuItem alloc] initWithTitle:[path lastPathComponent] action:@selector(_openRecentDocument:) keyEquivalent:nil];
[item setTag:path];
[menu insertItem:item atIndex:0];
}
}
- (void)_openRecentDocument:(id)sender
{
[self openDocumentWithContentsOfURL:[sender tag] display:YES error:nil];
}
@end
+324 -177
View File
@@ -20,143 +20,140 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
import <AppKit/CPView.j>
import <AppKit/CPEvent.j>
import <AppKit/CPPasteboard.j>
import <AppKit/CPImageView.j>
@import <AppKit/CPView.j>
@import <AppKit/CPEvent.j>
@import <AppKit/CPPasteboard.j>
@import <AppKit/CPImageView.j>
#import "CoreGraphics/CGGeometry.h"
#import "Platform/Platform.h"
CPDragOperationNone = 0,
CPDragOperationCopy = 1 << 1,
CPDragOperationLink = 1 << 1,
CPDragOperationGeneric = 1 << 2,
CPDragOperationPrivate = 1 << 3,
CPDragOperationMove = 1 << 4,
CPDragOperationDelete = 1 << 5,
CPDragOperationEvery = -1;
#define DRAGGING_WINDOW(anObject) ([anObject isKindOfClass:[CPWindow class]] ? anObject : [anObject window])
var CPDragServerPreviousEvent = nil,
CPDragServerAutoscrollInterval = nil;
/*
var CPDragServerAutoscroll = function()
{
[CPDragServerSource autoscroll:CPDragServerPreviousEvent];
}
if (CPDragServerAutoscrollInterval === nil)
{
if ([CPDragServerSource respondsToSelector:@selector(autoscroll:)])
CPDragServerAutoscrollInterval = setInterval(CPDragServerAutoscroll, 100);
}
CPDragServerPreviousEvent = anEvent;
if (CPDragServerAutoscrollInterval !== nil)
clearInterval(CPDragServerAutoscrollInterval);
CPDragServerAutoscrollInterval = nil;
*/
var CPSharedDragServer = nil;
var CPDragServerView = nil,
CPDragServerSource = nil,
CPDragServerWindow = nil,
CPDragServerOffset = nil,
CPDragServerLocation = nil,
CPDragServerPasteboard = nil,
CPDragServerDestination = nil,
CPDragServerDraggingInfo = nil;
var CPDragServerIsDraggingImage = NO,
CPDragServerShouldSendDraggedViewMovedTo = NO,
CPDragServerShouldSendDraggedImageMovedTo = NO,
CPDragServerShouldSendDraggedViewEndedAtOperation = NO,
CPDragServerShouldSendDraggedImageEndedAtOperation = NO;
var CPDragServerStartDragging = function(anEvent)
{
CPDragServerUpdateDragging(anEvent);
}
var CPDragServerUpdateDragging = function(anEvent)
{
// If this is a mouse up, then complete the drag.
if([anEvent type] == CPLeftMouseUp)
{
CPDragServerLocation = [[CPDragServerDestination window] convertBridgeToBase:[[anEvent window] convertBaseToBridge:[anEvent locationInWindow]]];
[CPDragServerView removeFromSuperview];
[CPSharedDragServer._dragWindow orderOut:nil];
if (CPDragServerDestination &&
(![CPDragServerDestination respondsToSelector:@selector(prepareForDragOperation:)] || [CPDragServerDestination prepareForDragOperation:CPDragServerDraggingInfo]) &&
(![CPDragServerDestination respondsToSelector:@selector(performDragOperation:)] || [CPDragServerDestination performDragOperation:CPDragServerDraggingInfo]) &&
[CPDragServerDestination respondsToSelector:@selector(concludeDragOperation:)])
[CPDragServerDestination concludeDragOperation:CPDragServerDraggingInfo];
if (CPDragServerShouldSendDraggedImageEndedAtOperation)
[CPDragServerSource draggedImage:[CPDragServerView image] endedAt:CPDragServerLocation operation:NO];
else if (CPDragServerShouldSendDraggedViewEndedAtOperation)
[CPDragServerSource draggedView:CPDragServerView endedAt:CPDragServerLocation operation:NO];
CPDragServerIsDraggingImage = NO;
CPDragServerDestination = nil;
return;
}
// If we're not a mouse up, then we're going to want to grab the next event.
[CPApp setCallback:CPDragServerUpdateDragging
forNextEventMatchingMask:CPMouseMovedMask | CPLeftMouseDraggedMask | CPLeftMouseUpMask
untilDate:nil inMode:0 dequeue:NO];
var location = [anEvent locationInWindow],
operation =
bridgeLocation = [[anEvent window] convertBaseToBridge:location];
// We have to convert base to bridge since the drag event comes from the source window, not the drag window.
var draggingDestination = [[CPDOMWindowBridge sharedDOMWindowBridge] _dragHitTest:bridgeLocation pasteboard:CPDragServerPasteboard];
CPDragServerLocation = [[CPDragServerDestination window] convertBridgeToBase:bridgeLocation];
if(draggingDestination != CPDragServerDestination)
{
if (CPDragServerDestination && [CPDragServerDestination respondsToSelector:@selector(draggingExited:)])
[CPDragServerDestination draggingExited:CPDragServerDraggingInfo];
CPDragServerDestination = draggingDestination;
if (CPDragServerDestination && [CPDragServerDestination respondsToSelector:@selector(draggingEntered:)])
[CPDragServerDestination draggingEntered:CPDragServerDraggingInfo];
}
else if (CPDragServerDestination && [CPDragServerDestination respondsToSelector:@selector(draggingUpdated:)])
[CPDragServerDestination draggingUpdated:CPDragServerDraggingInfo];
location.x -= CPDragServerOffset.x;
location.y -= CPDragServerOffset.y;
[CPDragServerView setFrameOrigin:location];
if (CPDragServerShouldSendDraggedImageMovedTo)
[CPDragServerSource draggedImage:[CPDragServerView image] movedTo:location];
else if (CPDragServerShouldSendDraggedViewMovedTo)
[CPDragServerSource draggedView:CPDragServerView movedTo:location];
}
var CPDragServerSource = nil;
var CPDragServerDraggingInfo = nil;
/*
<objj>CPDraggingInfo</objj> is a container of information about a specific dragging session.
CPDraggingInfo is a container of information about a specific dragging session.
@ignore
*/
@implementation CPDraggingInfo : CPObject
{
CPWindow _window;
}
/*
Initializes the receiver with the window
*/
- (id)initWithWindow:(CPWindow)aWindow
{
self = [super init];
if (self)
_window = aWindow;
return this;
}
- (id)draggingSource
{
return CPDragServerSource;
}
- (CPPoint)draggingLocation
{
return CPDragServerLocation;
}
- (CPPasteboard)draggingPasteboard
{
return CPDragServerPasteboard;
if ([CPPlatform supportsDragAndDrop])
return [_CPDOMDataTransferPasteboard DOMDataTransferPasteboard];
return [[CPDragServer sharedDragServer] draggingPasteboard];
}
- (id)draggingSource
{
return [[CPDragServer sharedDragServer] draggingSource];
}
/*
- (unsigned)draggingSourceOperationMask
*/
- (CPPoint)draggingLocation
{
return [[CPDragServer sharedDragServer] draggingLocation];
}
- (CPWindow)draggingDestinationWindow
{
return DRAGGING_WINDOW([[CPDragServer sharedDragServer] draggingDestination]);
}
- (CPImage)draggedImage
{
return [[self draggedView] image];
}
- (CGPoint)draggedImageLocation
{
return [self draggedViewLocation];
}
- (CPView)draggedView
{
return [[CPDragServer sharedDragServer] draggedView];
}
- (CGPoint)draggedViewLocation
{
var dragServer = [CPDragServer sharedDragServer];
return [DRAGGING_WINDOW([dragServer draggingDestination]) convertPlatformWindowToBase:[[dragServer draggedView] frame].origin];
}
@end
var CPDraggingSource_draggedImage_movedTo_ = 1 << 0,
CPDraggingSource_draggedImage_endAt_operation_ = 1 << 1,
CPDraggingSource_draggedView_movedTo_ = 1 << 2,
CPDraggingSource_draggedView_endedAt_operation_ = 1 << 3;
@implementation CPDragServer : CPObject
{
CPWindow _dragWindow;
CPImageView _imageView;
BOOL _isDragging @accessors(readonly, getter=isDragging);
CPWindow _draggedWindow @accessors(readonly, getter=draggedWindow);
CPView _draggedView @accessors(readonly, getter=draggedView);
CPImageView _imageView;
BOOL _isDraggingImage;
CGSize _draggingOffset @accessors(readonly, getter=draggingOffset);
CPPasteboard _draggingPasteboard @accessors(readonly, getter=draggingPasteboard);
id _draggingSource @accessors(readonly, getter=draggingSource);
unsigned _implementedDraggingSourceMethods;
CGPoint _draggingLocation;
id _draggingDestination;
CGPoint _startDragLocation;
BOOL _shouldSlideBack;
unsigned _dragOperation;
}
/*
@@ -165,9 +162,9 @@ var CPDragServerUpdateDragging = function(anEvent)
*/
+ (void)initialize
{
if (self != [CPDragServer class])
if (self !== [CPDragServer class])
return;
CPDragServerDraggingInfo = [[CPDraggingInfo alloc] init];
}
@@ -175,7 +172,7 @@ var CPDragServerUpdateDragging = function(anEvent)
{
if (!CPSharedDragServer)
CPSharedDragServer = [[CPDragServer alloc] init];
return CPSharedDragServer;
}
@@ -185,17 +182,109 @@ var CPDragServerUpdateDragging = function(anEvent)
- (id)init
{
self = [super init];
if (self)
{
_dragWindow = [[CPWindow alloc] initWithContentRect:CPRectMakeZero() styleMask:CPBorderlessWindowMask];
[_dragWindow setLevel:CPDraggingWindowLevel];
_draggedWindow = [[CPWindow alloc] initWithContentRect:_CGRectMakeZero() styleMask:CPBorderlessWindowMask];
[_draggedWindow setLevel:CPDraggingWindowLevel];
}
return self;
}
/*
- (id)draggingDestination
{
return _draggingDestination;
}
- (CGPoint)draggingLocation
{
return _draggingLocation
}
- (void)draggingStartedInPlatformWindow:(CPPlatformWindow)aPlatformWindow globalLocation:(CGPoint)aLocation
{
if (_isDraggingImage)
{
if ([_draggingSource respondsToSelector:@selector(draggedImage:beganAt:)])
[_draggingSource draggedImage:[_draggedView image] beganAt:aLocation];
}
else
{
if ([_draggingSource respondsToSelector:@selector(draggedView:beganAt:)])
[_draggingSource draggedView:_draggedView beganAt:aLocation];
}
if (![CPPlatform supportsDragAndDrop])
[_draggedWindow orderFront:self];
}
- (void)draggingSourceUpdatedWithGlobalLocation:(CGPoint)aGlobalLocation
{
if (![CPPlatform supportsDragAndDrop])
[_draggedWindow setFrameOrigin:_CGPointMake(aGlobalLocation.x - _draggingOffset.width, aGlobalLocation.y - _draggingOffset.height)];
if (_implementedDraggingSourceMethods & CPDraggingSource_draggedImage_movedTo_)
[_draggingSource draggedImage:[_draggedView image] movedTo:aGlobalLocation];
else if (_implementedDraggingSourceMethods & CPDraggingSource_draggedView_movedTo_)
[_draggingSource draggedView:_draggedView movedTo:aGlobalLocation];
}
- (CPDragOperation)draggingUpdatedInPlatformWindow:(CPPlatformWindow)aPlatformWindow location:(CGPoint)aLocation
{
var dragOperation = CPDragOperationCopy;
// We have to convert base to bridge since the drag event comes from the source window, not the drag window.
var draggingDestination = [aPlatformWindow _dragHitTest:aLocation pasteboard:[CPDragServerDraggingInfo draggingPasteboard]];
if (draggingDestination)
_draggingLocation = [DRAGGING_WINDOW(draggingDestination) convertPlatformWindowToBase:aLocation];
if(draggingDestination !== _draggingDestination)
{
if (_draggingDestination && [_draggingDestination respondsToSelector:@selector(draggingExited:)])
[_draggingDestination draggingExited:CPDragServerDraggingInfo];
_draggingDestination = draggingDestination;
if (_draggingDestination && [_draggingDestination respondsToSelector:@selector(draggingEntered:)])
dragOperation = [_draggingDestination draggingEntered:CPDragServerDraggingInfo];
}
else if (_draggingDestination && [_draggingDestination respondsToSelector:@selector(draggingUpdated:)])
dragOperation = [_draggingDestination draggingUpdated:CPDragServerDraggingInfo];
if (!_draggingDestination)
dragOperation = CPDragOperationNone;
return dragOperation;
}
- (void)draggingEndedInPlatformWindow:(CPPlatformWindow)aPlatformWindow globalLocation:(CGPoint)aLocation operation:(CPDragOperation)anOperation
{
[_draggedView removeFromSuperview];
if (![CPPlatform supportsDragAndDrop])
[_draggedWindow orderOut:self];
if (_implementedDraggingSourceMethods & CPDraggingSource_draggedImage_endAt_operation_)
[_draggingSource draggedImage:[_draggedView image] endedAt:aLocation operation:anOperation];
else if (_implementedDraggingSourceMethods & CPDraggingSource_draggedView_endedAt_operation_)
[_draggingSource draggedView:_draggedView endedAt:aLocation operation:anOperation];
_isDragging = NO;
}
- (void)performDragOperationInPlatformWindow:(CPPlatformWindow)aPlatformWindow
{
if (_draggingDestination &&
(![_draggingDestination respondsToSelector:@selector(prepareForDragOperation:)] || [_draggingDestination prepareForDragOperation:CPDragServerDraggingInfo]) &&
(![_draggingDestination respondsToSelector:@selector(performDragOperation:)] || [_draggingDestination performDragOperation:CPDragServerDraggingInfo]) &&
[_draggingDestination respondsToSelector:@selector(concludeDragOperation:)])
[_draggingDestination concludeDragOperation:CPDragServerDraggingInfo];
}
/*!
Initiates a drag session.
@param aView the view being dragged
@param aWindow the window where the drag source is
@@ -204,53 +293,75 @@ var CPDragServerUpdateDragging = function(anEvent)
@param anEvent
@param aPasteboard the pasteboard that contains the drag data
@param aSourceObject the object where the drag started
@param slideBack if <code>YES</code>, <code>aView</code> slides back to
@param slideBack if \c YES, \c aView slides back to
its origin on a failed drop
*/
- (void)dragView:(CPView)aView fromWindow:(CPWindow)aWindow at:(CGPoint)viewLocation offset:(CGSize)mouseOffset event:(CPEvent)anEvent pasteboard:(CPPasteboard)aPasteboard source:(id)aSourceObject slideBack:(BOOL)slideBack
- (void)dragView:(CPView)aView fromWindow:(CPWindow)aWindow at:(CGPoint)viewLocation offset:(CGSize)mouseOffset event:(CPEvent)mouseDownEvent pasteboard:(CPPasteboard)aPasteboard source:(id)aSourceObject slideBack:(BOOL)slideBack
{
var eventLocation = [anEvent locationInWindow];
CPDragServerView = aView;
CPDragServerSource = aSourceObject;
CPDragServerWindow = aWindow;
CPDragServerOffset = CPPointMake(eventLocation.x - viewLocation.x, eventLocation.y - viewLocation.y);
CPDragServerPasteboard = [CPPasteboard pasteboardWithName:CPDragPboard];//aPasteboard;
_isDragging = YES;
[_dragWindow setFrameSize:CGSizeMakeCopy([[CPDOMWindowBridge sharedDOMWindowBridge] frame].size)];
[_dragWindow orderFront:self];
_draggedView = aView;
_draggingPasteboard = aPasteboard || [CPPasteboard pasteboardWithName:CPDragPboard];
_draggingSource = aSourceObject;
_draggingDestination = nil;
_shouldSlideBack = slideBack;
[aView setFrameOrigin:viewLocation];
[[_dragWindow contentView] addSubview:aView];
// The offset is based on the distance from where we want the view to be initially from where the mouse is initially
// Hence the use of mouseDownEvent's location and view's location in global coordinates.
var mouseDownWindow = [mouseDownEvent window],
mouseDownEventLocation = [mouseDownEvent locationInWindow];
if (CPDragServerIsDraggingImage)
if (mouseDownEventLocation)
{
if ([CPDragServerSource respondsToSelector:@selector(draggedImage:beganAt:)])
[CPDragServerSource draggedImage:[aView image] beganAt:viewLocation];
CPDragServerShouldSendDraggedImageMovedTo = [CPDragServerSource respondsToSelector:@selector(draggedImage:movedTo:)];
CPDragServerShouldSendDraggedImageEndedAtOperation = [CPDragServerSource respondsToSelector:@selector(draggedImage:endAt:operation:)];
CPDragServerShouldSendDraggedViewMovedTo = NO;
CPDragServerShouldSendDraggedViewEndedAtOperation = NO;
if (mouseDownWindow)
mouseDownEventLocation = [mouseDownWindow convertBaseToGlobal:mouseDownEventLocation];
_draggingOffset = _CGSizeMake(mouseDownEventLocation.x - viewLocation.x, mouseDownEventLocation.y - viewLocation.y);
}
else
_draggingOffset = _CGSizeMakeZero();
if ([CPPlatform isBrowser])
[_draggedWindow setPlatformWindow:[aWindow platformWindow]];
[aView setFrameOrigin:_CGPointMakeZero()];
var mouseLocation = [CPEvent mouseLocation];
// Place it where the mouse pointer is.
_startDragLocation = _CGPointMake(mouseLocation.x - _draggingOffset.width, mouseLocation.y - _draggingOffset.height);
[_draggedWindow setFrameOrigin:_startDragLocation];
[_draggedWindow setFrameSize:[aView frame].size];
[[_draggedWindow contentView] addSubview:aView];
_implementedDraggingSourceMethods = 0;
if (_draggedView === _imageView)
{
if ([_draggingSource respondsToSelector:@selector(draggedImage:movedTo:)])
_implementedDraggingSourceMethods |= CPDraggingSource_draggedImage_movedTo_;
if ([_draggingSource respondsToSelector:@selector(draggedImage:endAt:operation:)])
_implementedDraggingSourceMethods |= CPDraggingSource_draggedImage_endAt_operation_;
}
else
{
if ([CPDragServerSource respondsToSelector:@selector(draggedView:beganAt:)])
[CPDragServerSource draggedView:aView beganAt:viewLocation];
CPDragServerShouldSendDraggedViewMovedTo = [CPDragServerSource respondsToSelector:@selector(draggedView:movedTo:)];
CPDragServerShouldSendDraggedViewEndedAtOperation = [CPDragServerSource respondsToSelector:@selector(draggedView:endedAt:operation:)];
if ([_draggingSource respondsToSelector:@selector(draggedView:movedTo:)])
_implementedDraggingSourceMethods |= CPDraggingSource_draggedView_movedTo_;
CPDragServerShouldSendDraggedImageMovedTo = NO;
CPDragServerShouldSendDraggedImageEndedAtOperation = NO;
if ([_draggingSource respondsToSelector:@selector(draggedView:endedAt:operation:)])
_implementedDraggingSourceMethods |= CPDraggingSource_draggedView_endedAt_operation_;
}
CPDragServerStartDragging(anEvent);
if (![CPPlatform supportsDragAndDrop])
{
[self draggingStartedInPlatformWindow:[aWindow platformWindow] globalLocation:mouseLocation];
[self trackDragging:mouseDownEvent];
}
}
/*
/*!
Initiates a drag session.
@param anImage the image to be dragged
@param aWindow the source window of the drag session
@@ -259,43 +370,79 @@ var CPDragServerUpdateDragging = function(anEvent)
@param anEvent
@param aPasteboard the pasteboard where the drag data is located
@param aSourceObject the object where the drag started
@param slideBack if <code>YES</code>, <code>aView</code> slides back to
@param slideBack if \c YES, \c aView slides back to
its origin on a failed drop
*/
- (void)dragImage:(CPImage)anImage fromWindow:(CPWindow)aWindow at:(CGPoint)imageLocation offset:(CGSize)mouseOffset event:(CPEvent)anEvent pasteboard:(CPPasteboard)aPasteboard source:(id)aSourceObject slideBack:(BOOL)slideBack
{
CPDragServerIsDraggingImage = YES;
_isDraggingImage = YES;
var imageSize = [anImage size];
if (!_imageView)
_imageView = [[CPImageView alloc] initWithFrame:CPRectMakeZero()];
_imageView = [[CPImageView alloc] initWithFrame:_CGRectMake(0.0, 0.0, imageSize.width, imageSize.height)];
[_imageView setImage:anImage];
[_imageView setFrameSize:CGSizeMakeCopy([anImage size])];
[self dragView:_imageView fromWindow:aWindow at:imageLocation offset:mouseOffset event:anEvent pasteboard:aPasteboard source:aSourceObject slideBack:slideBack];
}
- (void)trackDragging:(CPEvent)anEvent
{
var type = [anEvent type],
platformWindow = [_draggedWindow platformWindow],
platformWindowLocation = [[anEvent window] convertBaseToPlatformWindow:[anEvent locationInWindow]];
if (type === CPLeftMouseUp)
{
// Make sure we do not finalize (cancel) the drag if the last drag update was disallowed
if (_dragOperation !== CPDragOperationNone)
[self performDragOperationInPlatformWindow:platformWindow];
[self draggingEndedInPlatformWindow:platformWindow globalLocation:platformWindowLocation operation:_dragOperation];
// Stop tracking events.
return;
}
[self draggingSourceUpdatedWithGlobalLocation:platformWindowLocation];
_dragOperation = [self draggingUpdatedInPlatformWindow:platformWindow location:platformWindowLocation];
// If we're not a mouse up, then we're going to want to grab the next event.
[CPApp setTarget:self selector:@selector(trackDragging:)
forNextEventMatchingMask:CPMouseMovedMask | CPLeftMouseDraggedMask | CPLeftMouseUpMask
untilDate:nil inMode:0 dequeue:NO];
}
@end
@implementation CPView (CPDraggingAdditions)
@implementation CPWindow (CPDraggingAdditions)
/* @ignore */
- (CPView)_dragHitTest:(CPPoint)aPoint pasteboard:(CPPasteboard)aPasteboard
- (id)_dragHitTest:(CGPoint)aPoint pasteboard:(CPPasteboard)aPasteboard
{
if(!CPRectContainsPoint(_frame, aPoint) || self == CPDragServerView)
// If none of our views or ourselves has registered for drag events...
if (!_inclusiveRegisteredDraggedTypes)
return nil;
var view = nil,
i = [_subviews count],
adjustedPoint = CPPointMake(aPoint.x - CPRectGetMinX(_frame), aPoint.y - CPRectGetMinY(_frame));
while (i--)
if (view = [_subviews[i] _dragHitTest:adjustedPoint pasteboard:aPasteboard])
return view;
// We don't need to do this because the only place this gets called
// -_dragHitTest: in CPPlatformWindow does this already. Perhaps to
// be safe?
// if (![self containsPoint:aPoint])
// return nil;
if ([aPasteboard availableTypeFromArray:_registeredDraggedTypes])
var adjustedPoint = [self convertPlatformWindowToBase:aPoint],
hitView = [_windowView hitTest:adjustedPoint];
while (hitView && ![aPasteboard availableTypeFromArray:[hitView registeredDraggedTypes]])
hitView = [hitView superview];
if (hitView)
return hitView;
if ([aPasteboard availableTypeFromArray:[self registeredDraggedTypes]])
return self;
return nil;
}
+113 -130
View File
@@ -20,115 +20,39 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
import <Foundation/CPObject.j>
@import <Foundation/CPObject.j>
#include "CoreGraphics/CGGeometry.h"
/*
@global
@group CPEventType
*/
CPLeftMouseDown = 1;
/*
@global
@group CPEventType
*/
CPLeftMouseUp = 2;
/*
@global
@group CPEventType
*/
CPRightMouseDown = 3;
/*
@global
@group CPEventType
*/
CPRightMouseUp = 4;
/*
@global
@group CPEventType
*/
CPMouseMoved = 5;
/*
@global
@group CPEventType
*/
CPLeftMouseDragged = 6;
/*
@global
@group CPEventType
*/
CPRightMouseDragged = 7;
/*
@global
@group CPEventType
*/
CPMouseEntered = 8;
/*
@global
@group CPEventType
*/
CPMouseExited = 9;
/*
@global
@group CPEventType
*/
CPKeyDown = 10;
/*
@global
@group CPEventType
*/
CPKeyUp = 11;
/*
@global
@group CPEventType
*/
CPFlagsChanged = 12;
/*
@global
@group CPEventType
*/
CPAppKitDefined = 13;
/*
@global
@group CPEventType
*/
CPSystemDefined = 14;
/*
@global
@group CPEventType
*/
CPApplicationDefined = 15;
/*
@global
@group CPEventType
*/
CPPeriodic = 16;
/*
@global
@group CPEventType
*/
CPCursorUpdate = 17;
/*
@global
@group CPEventType
*/
CPScrollWheel = 22;
/*
@global
@group CPEventType
*/
CPOtherMouseDown = 25;
/*
@global
@group CPEventType
*/
CPOtherMouseUp = 26;
/*
@global
@group CPEventType
*/
CPOtherMouseDragged = 27;
// iPhone Event Types
CPTouchStart = 28;
CPTouchMove = 29;
CPTouchEnd = 30;
CPTouchCancel = 31;
CPAlphaShiftKeyMask = 1 << 16;
CPShiftKeyMask = 1 << 17;
@@ -174,12 +98,18 @@ CPDOMEventKeyPress = "keypress";
CPDOMEventCopy = "copy";
CPDOMEventPaste = "paste";
CPDOMEventScrollWheel = "mousewheel";
CPDOMEventTouchStart = "touchstart";
CPDOMEventTouchMove = "touchmove";
CPDOMEventTouchEnd = "touchend";
CPDOMEventTouchCancel = "touchcancel";
var _CPEventPeriodicEventPeriod = 0,
_CPEventPeriodicEventTimer = nil;
/*
<objj>CPEvent</objj> encapsulates the details of a Cappuccino keyboard or mouse event.
/*!
@ingroup appkit
@class CPEvent
CPEvent encapsulates the details of a Cappuccino keyboard or mouse event.
*/
@implementation CPEvent : CPObject
{
@@ -192,6 +122,7 @@ var _CPEventPeriodicEventPeriod = 0,
unsigned _clickCount;
float _pressure;
CPWindow _window;
Number _windowNumber;
CPString _characters;
CPString _charactersIgnoringModifiers
BOOL _isARepeat;
@@ -203,20 +134,20 @@ var _CPEventPeriodicEventPeriod = 0,
float _deltaZ;
}
/*
/*!
Creates a new keyboard event.
@param anEventType the event type. Must be one of <objj>CPKeyDown</objj>, <objj>CPKeyUp</objj> or <objj>CPFlagsChanged</objj>
@param aPoint the location of the cursor in the window specified by <code>aWindowNumber</code>
@param modifierFlags a bitwise combination of the modifiers specified in the <objj>CPEvent</objj> globals
@param anEventType the event type. Must be one of CPKeyDown, CPKeyUp or CPFlagsChanged
@param aPoint the location of the cursor in the window specified by \c aWindowNumber
@param modifierFlags a bitwise combination of the modifiers specified in the CPEvent globals
@param aTimestamp the time the event occurred
@param aWindowNumber the number of the <objj>CPWindow</objj> where the event occurred
@param aWindowNumber the number of the CPWindow where the event occurred
@param aGraphicsContext the graphics context where the event occurred
@param characters the characters associated with the event
@param unmodCharacters the string of keys pressed without the presence of any modifiers other than Shift
@param repeatKey <code>YES</code> if this is caused by the system repeat as opposed to the user pressing the key again
@param repeatKey \c YES if this is caused by the system repeat as opposed to the user pressing the key again
@param code a number associated with the keyboard key of this event
@throws CPInternalInconsistencyException if <code>anEventType</code> is not a <objj>CPKeyDown</objj>,
<objj>CPKeyUp</objj> or <objj>CPFlagsChanged</objj>
@throws CPInternalInconsistencyException if \c anEventType is not a CPKeyDown,
CPKeyUp or CPFlagsChanged
@return the keyboard event
*/
+ (CPEvent)keyEventWithType:(CPEventType)anEventType location:(CGPoint)aPoint modifierFlags:(unsigned int)modifierFlags
@@ -228,13 +159,13 @@ var _CPEventPeriodicEventPeriod = 0,
characters:characters charactersIgnoringModifiers:unmodCharacters isARepeat:repeatKey keyCode:code];
}
/*
/*!
Creates a new mouse event
@param anEventType the event type
@param aPoint the location of the cursor in the window specified by <code>aWindowNumber</code>
@param modifierFlags a bitwise combination of the modifiers specified in the <objj>CPEvent</objj> globals
@param aPoint the location of the cursor in the window specified by \c aWindowNumber
@param modifierFlags a bitwise combination of the modifiers specified in the CPEvent globals
@param aTimestamp the time the event occurred
@param aWindowNumber the number of the <objj>CPWindow</objj> where the event occurred
@param aWindowNumber the number of the CPWindow where the event occurred
@param aGraphicsContext the graphics context where the event occurred
@param anEventNumber a number for this event
@param aClickCount the number of clicks that caused this event
@@ -250,13 +181,13 @@ var _CPEventPeriodicEventPeriod = 0,
timestamp:aTimestamp windowNumber:aWindowNumber context:aGraphicsContext eventNumber:anEventNumber clickCount:aClickCount pressure:aPressure];
}
/*
/*!
Creates a new custom event
@param anEventType the event type. Must be one of <objj>CPAppKitDefined</objj>, <objj>CPSystemDefined</objj>, <objj>CPApplicationDefined</objj> or <objj>CPPeriodic</objj>
@param aLocation the location of the cursor in the window specified by <code>aWindowNumber</code>
@param modifierFlags a bitwise combination of the modifiers specified in the <objj>CPEvent</objj> globals
@param anEventType the event type. Must be one of CPAppKitDefined, CPSystemDefined, CPApplicationDefined or CPPeriodic
@param aLocation the location of the cursor in the window specified by \c aWindowNumber
@param modifierFlags a bitwise combination of the modifiers specified in the CPEvent globals
@param aTimestamp the time the event occurred
@param aWindowNumber the number of the <objj>CPWindow</objj> where the event occurred
@param aWindowNumber the number of the CPWindow where the event occurred
@param aGraphicsContext the graphics context where the event occurred
@param aSubtype a numeric identifier to differentiate this event from other custom events
@param aData1 more data that describes the event
@@ -313,7 +244,7 @@ var _CPEventPeriodicEventPeriod = 0,
_charactersIgnoringModifiers = unmodCharacters;
_isARepeat = isARepeat;
_keyCode = code;
_window = [CPApp windowWithWindowNumber:aWindowNumber];
_windowNumber = aWindowNumber;
}
return self;
@@ -341,20 +272,31 @@ var _CPEventPeriodicEventPeriod = 0,
return self;
}
/*
/*!
Returns the location of the mouse (for mouse events).
If this is not a mouse event, it returns <code>nil</code>.
If <code>window</code> returns <code>nil</code>, then
If this is not a mouse event, it returns \c nil.
If \c window returns \c nil, then
the mouse coordinates will be based on the screen coordinates.
Otherwise, the coordinates are relative to the window's coordinates.
@return the location of the mouse, or <code>nil</code> for non-mouse events.
@return the location of the mouse, or \c nil for non-mouse events.
*/
- (CGPoint)locationInWindow
{
return _location;
return _CGPointMakeCopy(_location);
}
/*
- (CGPoint)globalLocation
{
var theWindow = [self window],
location = [self locationInWindow];
if (theWindow)
return [theWindow convertBaseToGlobal:location];
return location;
}
/*!
Returns event information as a bit mask
*/
- (unsigned)modifierFlags
@@ -362,7 +304,7 @@ var _CPEventPeriodicEventPeriod = 0,
return _modifierFlags;
}
/*
/*!
Returns the time the event occurred
*/
- (CPTimeInterval)timestamp
@@ -370,7 +312,7 @@ var _CPEventPeriodicEventPeriod = 0,
return _timestamp;
}
/*
/*!
Returns the type of event.
*/
- (CPEventType)type
@@ -378,15 +320,18 @@ var _CPEventPeriodicEventPeriod = 0,
return _type;
}
/*
/*!
Returns the event's associated window
*/
- (CPWindow)window
{
if (!_window)
_window = [CPApp windowWithWindowNumber:_windowNumber];
return _window;
}
/*
/*!
The number of the window associated with the event.
*/
- (int)windowNumber
@@ -395,7 +340,7 @@ var _CPEventPeriodicEventPeriod = 0,
}
// Mouse Event Information
/*
/*!
Returns the button number for the mouse that generated the event.
*/
- (int)buttonNumber
@@ -403,7 +348,7 @@ var _CPEventPeriodicEventPeriod = 0,
return _buttonNumber;
}
/*
/*!
Returns the number of clicks that caused this event. (mouse only)
*/
- (int)clickCount
@@ -411,7 +356,7 @@ var _CPEventPeriodicEventPeriod = 0,
return _clickCount;
}
/*
/*!
Returns the characters associated with this event (keyboard only)
@throws CPInternalInconsistencyException if this method is called on a non-key event
*/
@@ -420,7 +365,7 @@ var _CPEventPeriodicEventPeriod = 0,
return _characters;
}
/*
/*!
Returns the character ignoring any modifiers (except shift).
@throws CPInternalInconsistencyException if this method is called on a non-key event
*/
@@ -429,8 +374,8 @@ var _CPEventPeriodicEventPeriod = 0,
return _charactersIgnoringModifiers;
}
/*
Returns <code>YES</code> if the keyboard event was caused by the key being held down.
/*!
Returns \c YES if the keyboard event was caused by the key being held down.
@throws CPInternalInconsistencyException if this method is called on a non-key event
*/
- (BOOL)isARepeat
@@ -438,7 +383,7 @@ var _CPEventPeriodicEventPeriod = 0,
return _isARepeat;
}
/*
/*!
Returns the key's key code.
@throws CPInternalInconsistencyException if this method is called on a non-key event
*/
@@ -447,6 +392,18 @@ var _CPEventPeriodicEventPeriod = 0,
return _keyCode;
}
+ (CGPoint)mouseLocation
{
// FIXME: this is incorrect, we shouldn't depend on the current event.
var event = [CPApp currentEvent],
eventWindow = [event window];
if (eventWindow)
return [eventWindow convertBaseToGlobal:[event locationInWindow]];
return [event locationInWindow];
}
- (float)pressure
{
return _pressure;
@@ -461,7 +418,7 @@ var _CPEventPeriodicEventPeriod = 0,
}
// Getting Scroll Wheel Event Infomration
/*
/*!
Returns the change in the x-axis for a mouse event.
*/
- (float)deltaX
@@ -469,7 +426,7 @@ var _CPEventPeriodicEventPeriod = 0,
return _deltaX;
}
/*
/*!
Returns the change in the y-axis for a mouse event.
*/
- (float)deltaY
@@ -477,7 +434,7 @@ var _CPEventPeriodicEventPeriod = 0,
return _deltaY;
}
/*
/*!
Returns the change in the x-axis for a mouse event.
*/
- (float)deltaZ
@@ -485,8 +442,16 @@ var _CPEventPeriodicEventPeriod = 0,
return _deltaZ;
}
/*
Generates periodic events every <code>aPeriod</code> seconds.
- (BOOL)_couldBeKeyEquivalent
{
// FIXME: More cases? Space?
return _type === CPKeyDown &&
_modifierFlags & (CPCommandKeyMask | CPControlKeyMask) &&
[_characters length] > 0;
}
/*!
Generates periodic events every \c aPeriod seconds.
@param aDelay the number of seconds before the first event
@param aPeriod the length of time in seconds between successive events
*/
@@ -498,7 +463,7 @@ var _CPEventPeriodicEventPeriod = 0,
_CPEventPeriodicEventTimer = window.setTimeout(function() { _CPEventPeriodicEventTimer = window.setInterval(_CPEventFirePeriodEvent, aPeriod * 1000.0); }, aDelay * 1000.0);
}
/*
/*!
Stops the periodic events from being generated
*/
+ (void)stopPeriodicEvents
@@ -516,7 +481,25 @@ var _CPEventPeriodicEventPeriod = 0,
function _CPEventFirePeriodEvent()
{
[CPApp sendEvent:[CPEvent otherEventWithType:CPPeriodic location:_CGPointMakeZero() modifierFlags:0 timestamp:0 windowNumber:0 context:nil subtype:0 data1:0 data2:0]];
[[CPRunLoop currentRunLoop] performSelectors];
}
var CPEventClass = [CPEvent class];
function _CPEventFromNativeMouseEvent(aNativeEvent, anEventType, aPoint, modifierFlags, aTimestamp, aWindowNumber, aGraphicsContext, anEventNumber, aClickCount, aPressure)
{
aNativeEvent.isa = CPEventClass;
aNativeEvent._type = anEventType;
aNativeEvent._location = aPoint;
aNativeEvent._modifierFlags = modifierFlags;
aNativeEvent._timestamp = aTimestamp;
aNativeEvent._windowNumber = aWindowNumber;
aNativeEvent._window = nil;
aNativeEvent._context = aGraphicsContext;
aNativeEvent._eventNumber = anEventNumber;
aNativeEvent._clickCount = aClickCount;
aNativeEvent._pressure = aPressure;
return aNativeEvent;
}
+44 -6
View File
@@ -20,27 +20,65 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
import <Foundation/CPObject.j>
@import <Foundation/CPObject.j>
/*!
@ingroup appkit
@class CPFlashMovie
CPFlashMovie is used to represent a Flash movie in the Cappuccino framework.
*/
@implementation CPFlashMovie : CPObject
{
CPString _fileName;
CPString _filename;
}
+ (id)flashMovieWithFile:(CPString)aFileName
/*!
Creates a new Flash movie with the swf at \c aFileName.
@param aFilename the swf to load
@return the initialized CPFlashMovie
*/
+ (id)flashMovieWithFile:(CPString)aFilename
{
return [[self alloc] initWithFile:aFileName];
return [[self alloc] initWithFile:aFilename];
}
- (id)initWithFile:(CPString)aFileName
/*!
Initializes the Flash movie.
@param aFilename the swf to load
@return the initialized CPFlashMovie
*/
- (id)initWithFile:(CPString)aFilename
{
self = [super init];
if (self)
_fileName = aFileName;
_filename = aFilename;
return self;
}
- (CPString)filename
{
return _filename;
}
@end
var CPFlashMovieFilenameKey = "CPFlashMovieFilenameKey";
@implementation CPFlashMovie (CPCoding)
- (id)initWithCoder:(CPCoder)aCoder
{
_filename = [aCoder decodeObjectForKey:CPFlashMovieFilenameKey];
return self;
}
- (void)encodeWithCoder:(CPCoder)aCoder
{
[aCoder encodeObject:_filename forKey:CPFlashMovieFilenameKey];
}
@end
+136 -42
View File
@@ -20,18 +20,27 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
import "CPDOMWindowBridge.j"
import "CPFlashMovie.j"
import "CPView.j"
@import "CPFlashMovie.j"
@import "CPView.j"
#include "Platform/Platform.h"
var IEFlashCLSID = "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000";
/*!
@ingroup appkit
*/
@implementation CPFlashView : CPView
{
CPFlashMovie _flashMovie;
DOMElement _DOMEmbedElement;
DOMElement _DOMMParamElement;
CPDictionary _params;
CPDictionary _paramElements;
#if PLATFORM(DOM)
DOMElement _DOMParamElement;
DOMElement _DOMObjectElement;
DOMElement _DOMInnerObjectElement;
#endif
}
- (id)initWithFrame:(CGRect)aFrame
@@ -40,35 +49,32 @@ import "CPView.j"
if (self)
{
_DOMObjectElement = document.createElement("object");
_DOMObjectElement.width = "100%";
_DOMObjectElement.height = "100%";
_DOMObjectElement.style.top = "0px";
_DOMObjectElement.style.left = "0px";
_DOMParamElement = document.createElement("param");
_DOMParamElement.name = "movie";
_DOMObjectElement.appendChild(_DOMParamElement);
var param = document.createElement("param");
param.name = "wmode";
param.value = "transparent";
_DOMObjectElement.appendChild(param);
_DOMEmbedElement = document.createElement("embed");
_DOMEmbedElement.type = "application/x-shockwave-flash";
_DOMEmbedElement.wmode = "transparent";
_DOMEmbedElement.width = "100%";
_DOMEmbedElement.height = "100%";
// IE requires this thing to be in the _DOMElement and not the _DOMObjectElement.
_DOMElement.appendChild(_DOMEmbedElement);
_DOMElement.appendChild(_DOMObjectElement);
#if PLATFORM(DOM)
if (!CPBrowserIsEngine(CPInternetExplorerBrowserEngine))
{
_DOMObjectElement = document.createElement(@"object");
_DOMObjectElement.width = @"100%";
_DOMObjectElement.height = @"100%";
_DOMObjectElement.style.top = @"0px";
_DOMObjectElement.style.left = @"0px";
_DOMObjectElement.type = @"application/x-shockwave-flash";
_DOMObjectElement.setAttribute(@"classid", IEFlashCLSID);
_DOMParamElement = document.createElement(@"param");
_DOMParamElement.name = @"movie";
_DOMInnerObjectElement = document.createElement(@"object");
_DOMInnerObjectElement.width = @"100%";
_DOMInnerObjectElement.height = @"100%";
_DOMObjectElement.appendChild(_DOMParamElement);
_DOMObjectElement.appendChild(_DOMInnerObjectElement);
_DOMElement.appendChild(_DOMObjectElement);
}
else
[self _rebuildIEObjects];
#endif
}
return self;
@@ -80,11 +86,15 @@ import "CPView.j"
return;
_flashMovie = aFlashMovie;
_DOMParamElement.value = aFlashMovie._fileName;
if (_DOMEmbedElement)
_DOMEmbedElement.src = aFlashMovie._fileName;
#if PLATFORM(DOM)
if (!CPBrowserIsEngine(CPInternetExplorerBrowserEngine))
{
_DOMParamElement.value = [aFlashMovie filename];
_DOMInnerObjectElement.data = [aFlashMovie filename];
}
else
[self _rebuildIEObjects];
#endif
}
- (CPFlashMovie)flashMovie
@@ -92,19 +102,103 @@ import "CPView.j"
return _flashMovie;
}
- (void)setFlashVars:(CPDictionary)aDictionary
{
var varString = @"",
enumerator = [aDictionary keyEnumerator];
var key;
while (key = [enumerator nextObject])
varString = [varString stringByAppendingFormat:@"&%@=%@", key, [aDictionary objectForKey:key]];
if (!_params)
_params = [CPDictionary dictionary];
[_params setObject:varString forKey:@"flashvars"];
[self setParameters:_params];
}
- (CPDictionary)flashVars
{
return [_params objectForKey:@"flashvars"];
}
- (void)setParameters:(CPDictionary)aDictionary
{
#if PLATFORM(DOM)
if (_paramElements && !CPBrowserIsEngine(CPInternetExplorerBrowserEngine))
{
var elements = [_paramElements allValues],
count = [elements count];
for (var i = 0; i < count; i++)
_DOMObjectElement.removeChild([elements objectAtIndex:i]);
}
#endif
_params = aDictionary;
#if PLATFORM(DOM)
if (!CPBrowserIsEngine(CPInternetExplorerBrowserEngine))
{
_paramElements = [CPDictionary dictionary];
var enumerator = [_params keyEnumerator],
key;
while (key = [enumerator nextObject] && _DOMObjectElement)
{
var param = document.createElement(@"param");
param.name = key;
param.value = [_params objectForKey:key];
_DOMObjectElement.appendChild(param);
[_paramElements setObject:param forKey:key];
}
}
else
[self _rebuildIEObjects];
#endif
}
- (CPDictionary)parameters
{
return _params;
}
#if PLATFORM(DOM)
- (void)_rebuildIEObjects
{
_DOMElement.innerHTML = @"";
if (![_flashMovie filename])
return;
var paramString = [CPString stringWithFormat:@"<param name='movie' value='%@' />", [_flashMovie filename]],
paramEnumerator = [_params keyEnumerator],
key;
while (key = [paramEnumerator nextObject])
paramString = [paramString stringByAppendingFormat:@"<param name='%@' value='%@' />", key, [_params objectForKey:key]];
_DOMObjectElement = document.createElement(@"object");
_DOMElement.appendChild(_DOMObjectElement);
_DOMObjectElement.outerHTML = [CPString stringWithFormat:@"<object classid=%@ width=%@ height=%@>%@</object>", IEFlashCLSID, CGRectGetWidth([self bounds]), CGRectGetHeight([self bounds]), paramString];
}
#endif
- (void)mouseDragged:(CPEvent)anEvent
{
[[CPDOMWindowBridge sharedDOMWindowBridge] _propagateCurrentDOMEvent:YES];
[[[self window] platformWindow] _propagateCurrentDOMEvent:YES];
}
- (void)mouseDown:(CPEvent)anEvent
{
[[CPDOMWindowBridge sharedDOMWindowBridge] _propagateCurrentDOMEvent:YES];
[[[self window] platformWindow] _propagateCurrentDOMEvent:YES];
}
- (void)mouseUp:(CPEvent)anEvent
{
[[CPDOMWindowBridge sharedDOMWindowBridge] _propagateCurrentDOMEvent:YES];
[[[self window] platformWindow] _propagateCurrentDOMEvent:YES];
}
@end
+32 -16
View File
@@ -20,13 +20,19 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
var _CPFonts = {};
_CPFontSystemFontFace = @"Arial";
var _CPFonts = {},
_CPFontSystemFontFace = @"Arial, sans-serif",
_CPWrapRegExp = new RegExp("\\s*,\\s*", "g");
#define _CPCachedFont(aName, aSize, isBold) _CPFonts[(isBold ? @"bold " : @"") + ROUND(aSize) + @"px '" + aName + @"'"]
/*
The <objj>CPFont</objj> class allows control of the fonts used for displaying text anywhere on the screen. The primary method for getting a particular font is through one of the class methods that take a name and/or size as arguments, and return the appropriate <objj>CPFont</objj>.
#define _CPCreateCSSString(aName, aSize, isBold) (isBold ? @"bold " : @"") + ROUND(aSize) + @"px " + ((aName === _CPFontSystemFontFace) ? aName : (@"\"" + aName.replace(_CPWrapRegExp, '", "') + @"\", " + _CPFontSystemFontFace))
#define _CPCachedFont(aName, aSize, isBold) _CPFonts[_CPCreateCSSString(aName, aSize, isBold)]
/*!
@ingroup appkit
@class CPFont
The CPFont class allows control of the fonts used for displaying text anywhere on the screen. The primary method for getting a particular font is through one of the class methods that take a name and/or size as arguments, and return the appropriate CPFont.
*/
@implementation CPFont : CPObject
{
@@ -37,7 +43,7 @@ var _CPFonts = {};
CPString _cssString;
}
/*
/*!
Returns a font with the specified name and size.
@param aName the name of the font
@param aSize the size of the font (in points)
@@ -48,7 +54,7 @@ var _CPFonts = {};
return _CPCachedFont(aName, aSize, NO) || [[CPFont alloc] _initWithName:aName size:aSize bold:NO];
}
/*
/*!
Returns a bold font with the specified name and size.
@param aName the name of the font
@param aSize the size of the font (in points)
@@ -59,7 +65,7 @@ var _CPFonts = {};
return _CPCachedFont(aName, aSize, YES) || [[CPFont alloc] _initWithName:aName size:aSize bold:YES];
}
/*
/*!
Returns the system font scaled to the specified size
@param aSize the size of the font (in points)
@return the requested system font
@@ -69,7 +75,7 @@ var _CPFonts = {};
return _CPCachedFont(_CPFontSystemFontFace, aSize, NO) || [[CPFont alloc] _initWithName:_CPFontSystemFontFace size:aSize bold:NO];
}
/*
/*!
Returns the bold system font scaled to the specified size
@param aSize the size of the font (in points)
@return the requested bold system font
@@ -79,7 +85,7 @@ var _CPFonts = {};
return _CPCachedFont(_CPFontSystemFontFace, aSize, YES) || [[CPFont alloc] _initWithName:_CPFontSystemFontFace size:aSize bold:YES];
}
/** FIXME Font Descriptor
/* FIXME Font Descriptor
@ignore
*/
- (id)_initWithName:(CPString)aName size:(float)aSize bold:(BOOL)isBold
@@ -92,7 +98,7 @@ var _CPFonts = {};
_size = aSize;
_isBold = isBold;
_cssString = (_isBold ? @"bold " : @"") + ROUND(aSize) + @"px '" + aName + @"'";
_cssString = _CPCreateCSSString(_name, _size, _isBold);
_CPFonts[_cssString] = self;
}
@@ -100,7 +106,7 @@ var _CPFonts = {};
return self;
}
/*
/*!
Returns the font size (in points)
*/
- (float)size
@@ -108,7 +114,7 @@ var _CPFonts = {};
return _size;
}
/*
/*!
Returns the font as a CSS string
*/
- (CPString)cssString
@@ -116,7 +122,7 @@ var _CPFonts = {};
return _cssString;
}
/*
/*!
Returns the font's family name
*/
- (CPString)familyName
@@ -124,6 +130,16 @@ var _CPFonts = {};
return _name;
}
- (BOOL)isEqual:(id)anObject
{
return [anObject isKindOfClass:[CPFont class]] && [anObject cssString] === [self cssString];
}
- (CPString)description
{
return [CPString stringWithFormat:@"%@ %@ %f pt.", [super description], [self familyName], [self size]];
}
@end
var CPFontNameKey = @"CPFontNameKey",
@@ -132,7 +148,7 @@ var CPFontNameKey = @"CPFontNameKey",
@implementation CPFont (CPCoding)
/*
/*!
Initializes the font from a coder.
@param aCoder the coder from which to read the font data
@return the initialized font
@@ -144,7 +160,7 @@ var CPFontNameKey = @"CPFontNameKey",
bold:[aCoder decodeBoolForKey:CPFontIsBoldKey]];
}
/*
/*!
Writes the font information out to a coder.
@param aCoder the coder to which the data will be written
*/
+9 -6
View File
@@ -20,21 +20,24 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
import <Foundation/CPObject.j>
@import <Foundation/CPObject.j>
import <AppKit/CPFont.j>
@import <AppKit/CPFont.j>
var CPSharedFontManager = nil,
CPFontManagerFactory = Nil;
/*!
@ingroup appkit
*/
@implementation CPFontManager : CPObject
{
CPArray _availableFonts;
}
// Getting the Shared Font Manager
/*
/*!
Returns the application's font manager. If the font
manager does not exist yet, it will be created.
*/
@@ -47,7 +50,7 @@ var CPSharedFontManager = nil,
}
// Changing the Default Font Conversion Classes
/*
/*!
Sets the class that will be used to create the applcation's
font manager.
*/
@@ -56,7 +59,7 @@ var CPSharedFontManager = nil,
CPFontManagerFactory = aClass;
}
/*
/*!
Returns an array of the available fonts
*/
- (CPArray)availableFonts
@@ -84,7 +87,7 @@ var CPSharedFontManager = nil,
return _availableFonts;
}
/*
/*!
Returns the available fonts matching the provided name.
@param aFontName the name of the font
*/
+109 -99
View File
@@ -20,7 +20,8 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
import "CGGeometry.j"
@import "CGGeometry.j"
CPMinXEdge = 0;
CPMinYEdge = 1;
@@ -32,7 +33,12 @@ CPMakePoint = CGPointMake;
CPMakeSize = CGSizeMake;
CPMakeRect = CGRectMake;
/**
/*!
@addtogroup appkit
@{
*/
/*!
Creates a copy of a specified point and returns the copy
@group CGPoint
@param the point to be copied
@@ -43,7 +49,7 @@ function CPPointCreateCopy(aPoint)
return { x: aPoint.x, y: aPoint.y };
}
/**
/*!
Makes a CGPoint object out of two numbers provided as arguments
@group CGPoint
@param x the x-coordinate of the CGPoint
@@ -55,12 +61,12 @@ function CPPointMake(x, y)
return { x: x, y: y };
}
/*
Makes a CGRect with an origin and size equal to <code>aRect</code> less the <code>dX/dY</code> insets specified.
/*!
Makes a CGRect with an origin and size equal to \c aRect less the \c dX/dY insets specified.
@param dX the size of the inset in the x-axis
@param dY the size of the inset in the y-axis
@group CGRect
@return CGRect a rectangle like <code>aRect</code> with an inset
@return CGRect a rectangle like \c aRect with an inset
*/
function CPRectInset(aRect, dX, dY)
{
@@ -68,7 +74,7 @@ function CPRectInset(aRect, dX, dY)
aRect.size.width - 2 * dX, aRect.size.height - 2*dY);
}
/*
/*!
@group CGRect
@ignore
@return void
@@ -80,7 +86,7 @@ function CPRectIntegral(aRect)
alert("CPRectIntegral unimplemented");
}
/*
/*!
Returns the intersection of the two provided rectangles as a new rectangle
@group CGRect
@param lhsRect the first rectangle used for calculation
@@ -100,7 +106,7 @@ function CPRectIntersection(lhsRect, rhsRect)
return CPRectIsEmpty(intersection) ? CPRectMakeZero() : intersection;
}
/*
/*!
Creates a copy of the provided rectangle
@group CGRect
@param aRect the CGRect that will be copied
@@ -111,7 +117,7 @@ function CPRectCreateCopy(aRect)
return { origin: CPPointCreateCopy(aRect.origin), size: CPSizeCreateCopy(aRect.size) };
}
/*
/*!
Returns a CGRect made of the specified arguments
@group CGRect
@param x the x-coordinate of the rectangle's origin
@@ -125,8 +131,8 @@ function CPRectMake(x, y, width, height)
return { origin: CPPointMake(x, y), size: CPSizeMake(width, height) };
}
/*
Creates a new rectangle with its origin offset by <code>dX</code> and <code>dY</code>.
/*!
Creates a new rectangle with its origin offset by \c dX and \c dY.
@group CGRect
@param aRect the rectangle to copy the origin and size from
@param dX the amount added to the x-size of the new rectangle
@@ -138,7 +144,7 @@ function CPRectOffset(aRect, dX, dY)
return CPRectMake(aRect.origin.x + dX, aRect.origin.y + dY, aRect.size.width, aRect.size.height);
}
/*
/*!
@group CGRect
@param aRect a CGRect
@return CGRect
@@ -164,8 +170,8 @@ function CPRectStandardize(aRect)
return standardized;
}
/*
Returns the smallest rectangle that can contain the two argument <code>CGRect</code>s.
/*!
Returns the smallest rectangle that can contain the two argument \c CGRects.
@group CGRect
@param lhsRect the first CGRect to use for the union calculation
@param rhsRect the second CGRect to use for the union calculation
@@ -181,7 +187,7 @@ function CPRectUnion(lhsRect, rhsRect)
return CPRectMake(minX, minY, maxX - minX, maxY - minY);
}
/*
/*!
Creates and returns a copy of the provided CGSize
@group CGSize
@param aSize the CGSize to copy
@@ -192,7 +198,7 @@ function CPSizeCreateCopy(aSize)
return { width: aSize.width, height: aSize.height };
}
/*
/*!
Creates and returns a new CGSize object from the provided dimensions.
@group CGSize
@param width the width for the new CGSize
@@ -204,13 +210,13 @@ function CPSizeMake(width, height)
return { width: width, height: height };
}
/*
Returns <code>YES</code> if the <objj>CGRect</objj>, <code>aRect</code>, contains
the <objj>CGPoint</objj>, <code>aPoint</code>.
/*!
Returns \c YES if the CGRect, \c aRect, contains
the CGPoint, \c aPoint.
@param aRect the rectangle to test with
@param aPoint the point to test with
@group CGRect
@return BOOL <code>YES</code> if the rectangle contains the point, <code>NO</code> otherwise.
@return BOOL \c YES if the rectangle contains the point, \c NO otherwise.
*/
function CPRectContainsPoint(aRect, aPoint)
{
@@ -220,38 +226,38 @@ function CPRectContainsPoint(aRect, aPoint)
aPoint.y < CPRectGetMaxY(aRect);
}
/*
Returns a <code>BOOL</code> indicating whether <objj>CGRect</objj> <code>possibleOuter</code>
contains <objj>CGRect</objj> <code>possibleInner</code>.
/*!
Returns a \c BOOL indicating whether CGRect \c possibleOuter
contains CGRect \c possibleInner.
@group CGRect
@param possibleOuter the <objj>CGRect</objj> to test if <code>possibleInner</code> is inside of
@param possibleInner the <objj>CGRect</objj> to test if it fits inside <code>possibleOuter</code>.
@return BOOL <code>YES</code> if <code>possibleInner</code> fits inside <code>possibleOuter</code>.
@param possibleOuter the CGRect to test if \c possibleInner is inside of
@param possibleInner the CGRect to test if it fits inside \c possibleOuter.
@return BOOL \c YES if \c possibleInner fits inside \c possibleOuter.
*/
function CPRectContainsRect(lhsRect, rhsRect)
function CPRectContainsRect(possibleOuter, possibleInner)
{
return CPRectEqualToRect(CPUnionRect(lhsRect, rhsRect), rhsRect);
return CGRectContainsRect(possibleOuter, possibleInner);
}
/*
Tests whether the two <objj>CGPoint</objj>s are equal to each other by comparing their
<code>x</code> and <code>y</code> members.
/*!
Tests whether the two CGPoints are equal to each other by comparing their
\c x and \c y members.
@group @CGPoint
@param lhsPoint the first <objj>CGPoint</objj> to check
@param rhsPoint the second <objj>CGPoint</objj> to check
@return BOOL <code>YES</code> if the two points have the same x's, and the same y's.
@param lhsPoint the first CGPoint to check
@param rhsPoint the second CGPoint to check
@return BOOL \c YES if the two points have the same x's, and the same y's.
*/
function CPPointEqualToPoint(lhsPoint, rhsPoint)
{
return lhsPoint.x == rhsPoint.x && lhsPoint.y == rhsPoint.y;
}
/*
Test whether the two <objj>CGRect</objj>s have the same origin and size
/*!
Test whether the two CGRects have the same origin and size
@group CGRect
@param lhsRect the first <objj>CGRect</objj> to compare
@param rhsRect the second <objj>CGRect</objj> to compare
@return BOOL <code>YES</code> if the two rectangles have the same origin and size. <code>NO</code>, otherwise.
@param lhsRect the first CGRect to compare
@param rhsRect the second CGRect to compare
@return BOOL \c YES if the two rectangles have the same origin and size. \c NO, otherwise.
*/
function CPRectEqualToRect(lhsRect, rhsRect)
{
@@ -259,9 +265,9 @@ function CPRectEqualToRect(lhsRect, rhsRect)
CPSizeEqualToSize(lhsRect.size, rhsRect.size);
}
/*
/*!
@group CGRect
@param aRect a <objj>CGRect</objj>
@param aRect a CGRect
@return int
*/
function CPRectGetHeight(aRect)
@@ -269,9 +275,9 @@ function CPRectGetHeight(aRect)
return aRect.size.height;
}
/*
/*!
@group CGRect
@param aRect a <objj>CGRect</objj>
@param aRect a CGRect
@return int
*/
function CPRectGetMaxX(aRect)
@@ -279,9 +285,9 @@ function CPRectGetMaxX(aRect)
return aRect.origin.x + aRect.size.width;
}
/*
/*!
@group CGRect
@param aRect a <objj>CGRect</objj>
@param aRect a CGRect
@return int
*/
function CPRectGetMaxY(aRect)
@@ -289,9 +295,9 @@ function CPRectGetMaxY(aRect)
return aRect.origin.y + aRect.size.height;
}
/*
/*!
@group CGRect
@param aRect a <objj>CGRect</objj>
@param aRect a CGRect
@return float
*/
function CPRectGetMidX(aRect)
@@ -299,9 +305,9 @@ function CPRectGetMidX(aRect)
return aRect.origin.x + (aRect.size.width) / 2.0;
}
/*
/*!
@group CGRect
@param aRect a <objj>CGRect</objj>
@param aRect a CGRect
@return float
*/
function CPRectGetMidY(aRect)
@@ -309,9 +315,9 @@ function CPRectGetMidY(aRect)
return aRect.origin.y + (aRect.size.height) / 2.0;
}
/*
/*!
@group CGRect
@param aRect a <objj>CGRect</objj>
@param aRect a CGRect
@return int
*/
function CPRectGetMinX(aRect)
@@ -319,9 +325,9 @@ function CPRectGetMinX(aRect)
return aRect.origin.x;
}
/*
/*!
@group CGRect
@param aRect a <objj>CGRect</objj>
@param aRect a CGRect
@return int
*/
function CPRectGetMinY(aRect)
@@ -329,9 +335,9 @@ function CPRectGetMinY(aRect)
return aRect.origin.y;
}
/*
/*!
@group CGRect
@param aRect a <objj>CGRect</objj>
@param aRect a CGRect
@return int
*/
function CPRectGetWidth(aRect)
@@ -339,77 +345,77 @@ function CPRectGetWidth(aRect)
return aRect.size.width;
}
/*
Returns <code>YES</code> if the two rectangles intersect
/*!
Returns \c YES if the two rectangles intersect
@group CGRect
@param lhsRect the first <objj>CGRect</objj>
@param rhsRect the second <objj>CGRect</objj>
@return BOOL <code>YES</code> if the two rectangles have any common spaces, and <code>NO</code>, otherwise.
@param lhsRect the first CGRect
@param rhsRect the second CGRect
@return BOOL \c YES if the two rectangles have any common spaces, and \c NO, otherwise.
*/
function CPRectIntersectsRect(lhsRect, rhsRect)
{
return !CPRectIsEmpty(CPRectIntersection(lhsRect, rhsRect));
}
/*
Returns <code>YES</code> if the <objj>CGRect</objj> has no area.
/*!
Returns \c YES if the CGRect has no area.
The test is performed by checking if the width and height are both zero.
@group CGRect
@param aRect the <objj>CGRect</objj> to test
@return BOOL <code>YES</code> if the <objj>CGRect</objj> has no area, and <code>NO</code>, otherwise.
@param aRect the CGRect to test
@return BOOL \c YES if the CGRect has no area, and \c NO, otherwise.
*/
function CPRectIsEmpty(aRect)
{
return aRect.size.width <= 0.0 || aRect.size.height <= 0.0;
}
/*
Returns <code>YES</code> if the <objj>CGRect</objj> has no area.
/*!
Returns \c YES if the CGRect has no area.
The test is performed by checking if the width and height are both zero.
@group CGRect
@return BOOL <code>YES</code> if the <objj>CGRect</objj> has no area, and <code>NO</code>, otherwise.
@return BOOL \c YES if the CGRect has no area, and \c NO, otherwise.
*/
function CPRectIsNull(aRect)
{
return aRect.size.width <= 0.0 || aRect.size.height <= 0.0;
}
/*
Returns <code>YES</code> if the two <objj>CGSize</objj>s are identical.
/*!
Returns \c YES if the two CGSizes are identical.
@group CGSize
@param lhsSize the first <objj>CGSize</objj> to compare
@param rhsSize the second <objj>CGSize</objj> to compare
@return BOOL <code>YES</code> if the two sizes are identical. <code>NO</code>, otherwise.
@param lhsSize the first CGSize to compare
@param rhsSize the second CGSize to compare
@return BOOL \c YES if the two sizes are identical. \c NO, otherwise.
*/
function CPSizeEqualToSize(lhsSize, rhsSize)
{
return lhsSize.width == rhsSize.width && lhsSize.height == rhsSize.height;
}
/*
Returns a human readable string of the provided <objj>CGPoint</objj>.
/*!
Returns a human readable string of the provided CGPoint.
@group CGPoint
@param aPoint the point to represent
@return CGPoint a string representation of the <objj>CGPoint</objj>
@return CGPoint a string representation of the CGPoint
*/
function CPStringFromPoint(aPoint)
{
return "{" + aPoint.x + ", " + aPoint.y + "}";
}
/*
Returns a human readable string of the provided <objj>CGSize</objj>.
/*!
Returns a human readable string of the provided CGSize.
@group CGSize
@param aSize the size to represent
@return CGSize a string representation of the <objj>CGSize</objj>
@return CGSize a string representation of the CGSize
*/
function CPStringFromSize(aSize)
{
return "{" + aSize.width + ", " + aSize.height + "}";
}
/*
Returns a human readable string of the provided <objj>CGRect</objj>.
/*!
Returns a human readable string of the provided CGRect.
@group CGRect
@param aRect the rectangle to represent
@return CGString the string representation of the rectangle
@@ -419,8 +425,8 @@ function CPStringFromRect(aRect)
return "{" + CPStringFromPoint(aRect.origin) + ", " + CPStringFromSize(aRect.size) + "}";
}
/*
Returns a <objj>CGPoint</objj> from a string with a comma separated pair of integers.
/*!
Returns a CGPoint from a string with a comma separated pair of integers.
@group CGPoint
@param aString a string containing two comma separated integers
@return CGPoint the point object created from the string
@@ -429,11 +435,11 @@ function CPPointFromString(aString)
{
var comma = aString.indexOf(',');
return { x:parseInt(aString.substr(1, comma - 1)), y:parseInt(aString.substring(comma + 1, aString.length)) };
return { x:parseFloat(aString.substr(1, comma - 1), 10), y:parseFloat(aString.substring(comma + 1, aString.length), 10) };
}
/*
Returns a <objj>CGSize</objj> from a string containing a pair of comma separated integers.
/*!
Returns a CGSize from a string containing a pair of comma separated integers.
@group CGSize
@param aString a string containing two comma separated integers
@return CGSize the size object created from the string
@@ -442,13 +448,13 @@ function CPSizeFromString(aString)
{
var comma = aString.indexOf(',');
return { width:parseInt(aString.substr(1, comma - 1)), height:parseInt(aString.substring(comma + 1, aString.length)) };
return { width:parseFloat(aString.substr(1, comma - 1), 10), height:parseFloat(aString.substring(comma + 1, aString.length), 10) };
}
/*
Returns a <objj>CGRect</objj> created from a string.
/*!
Returns a CGRect created from a string.
@group CGRect
@param aString a string in the form generated by <code>CPStringFromRect</code>
@param aString a string in the form generated by \c CPStringFromRect
@return CGRect the rectangle created from the string
*/
function CPRectFromString(aString)
@@ -458,7 +464,7 @@ function CPRectFromString(aString)
return { origin:CPPointFromString(aString.substr(1, comma - 1)), size:CPSizeFromString(aString.substring(comma + 2, aString.length)) };
}
/*
/*!
@group CGPoint
@param anEvent
@return CGPoint
@@ -468,18 +474,18 @@ function CPPointFromEvent(anEvent)
return CPPointMake(anEvent.clientX, anEvent.clientY, 0);
}
/*
Returns a zero sized <objj>CGSize</objj>.
/*!
Returns a zero sized CGSize.
@group CGSize
@return CGSize a size object with zeros for <code>width</code> and <code>height</code>
@return CGSize a size object with zeros for \c width and \c height
*/
function CPSizeMakeZero()
{
return CPSizeMake(0, 0);
}
/*
Returns a rectangle at origin <code>(0,0)</code> and size of <code>(0,0)</code>.
/*!
Returns a rectangle at origin \c (0,0) and size of \c (0,0).
@group CGRect
@return CGRect a zeroed out CGRect
*/
@@ -488,12 +494,16 @@ function CPRectMakeZero()
return CPRectMake(0, 0, 0, 0);
}
/*
Returns a point located at <code>(0, 0)</code>.
/*!
Returns a point located at \c (0, 0).
@group CGPoint
@return CGPoint a point located at <code>(0, 0)</code>
@return CGPoint a point located at \c (0, 0)
*/
function CPPointMakeZero()
{
return CPPointMake(0, 0, 0);
}
/*!
@}
*/
+7 -6
View File
@@ -22,7 +22,8 @@
var CPGraphicsContextCurrent = nil;
/*
/*!
@ingroup appkit
Provides an interface for drawing to the screen.
*/
@implementation CPGraphicsContext : CPObject
@@ -30,7 +31,7 @@ var CPGraphicsContextCurrent = nil;
CPContext _graphicsPort;
}
/*
/*!
Returns the current graphics context.
*/
+ (CPGraphicsContext)currentContext
@@ -38,7 +39,7 @@ var CPGraphicsContextCurrent = nil;
return CPGraphicsContextCurrent;
}
/*
/*!
Sets the current graphics context
*/
+ (void)setCurrentContext:(CPGraphicsContext)aGraphicsContext
@@ -46,7 +47,7 @@ var CPGraphicsContextCurrent = nil;
CPGraphicsContextCurrent = aGraphicsContext;
}
/*
/*!
Creates a graphics context with a provided port.
@param aContext the context to initialize with
@param aFlag whether the context should be flipped
@@ -57,7 +58,7 @@ var CPGraphicsContextCurrent = nil;
return [[self alloc] initWithGraphicsPort:aContext];
}
/*
/*!
Initializes the context with a graphics port.
@param aGraphicsPort the graphics port to initialize with
@return the initialized context
@@ -72,7 +73,7 @@ var CPGraphicsContextCurrent = nil;
return self;
}
/*
/*!
Returns the graphics context's port.
*/
- (CGContext)graphicsPort
+182 -63
View File
@@ -19,14 +19,17 @@
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
import <Foundation/CPBundle.j>
import <Foundation/CPNotificationCenter.j>
import <Foundation/CPObject.j>
import <Foundation/CPRunLoop.j>
import <Foundation/CPString.j>
import "CPGeometry.j"
@import <Foundation/CPBundle.j>
@import <Foundation/CPNotificationCenter.j>
@import <Foundation/CPObject.j>
@import <Foundation/CPRunLoop.j>
@import <Foundation/CPString.j>
@import "CPGeometry.j"
#include "Platform/Platform.h"
CPImageLoadStatusInitialized = 0;
CPImageLoadStatusLoading = 1;
@@ -38,19 +41,41 @@ CPImageLoadStatusReadError = 6;
CPImageDidLoadNotification = @"CPImageDidLoadNotification";
@implementation CPBundle (CPImageAdditions)
// Image Names
CPImageNameColorPanel = @"CPImageNameColorPanel";
CPImageNameColorPanelHighlighted = @"CPImageNameColorPanelHighlighted";
- (CPString)pathForResource:(CPString)aFilename
var imagesForNames = { },
AppKitImageForNames = { };
AppKitImageForNames[CPImageNameColorPanel] = CGSizeMake(26.0, 29.0);
AppKitImageForNames[CPImageNameColorPanelHighlighted] = CGSizeMake(26.0, 29.0);
function CPImageInBundle(aFilename, aSize, aBundle)
{
return [self bundlePath] + "Resources/" + aFilename;
if (!aBundle)
aBundle = [CPBundle mainBundle];
if (aSize)
return [[CPImage alloc] initWithContentsOfFile:[aBundle pathForResource:aFilename] size:aSize];
return [[CPImage alloc] initWithContentsOfFile:[aBundle pathForResource:aFilename]];
}
@end
function CPAppKitImage(aFilename, aSize)
{
return CPImageInBundle(aFilename, aSize, [CPBundle bundleForClass:[CPView class]]);
}
/*
<objj>CPImage</objj> is used to represent images in the Cappuccino framework. It supports loading
/*!
@ingroup appkit
@class CPImage
CPImage is used to represent images in the Cappuccino framework. It supports loading
all image types supported by the browser.
@par Delegate Methods
@delegate -(void)imageDidLoad:(CPImage)image;
Called when the specified image has finished loading.
@param image the image that loaded
@@ -67,68 +92,74 @@ CPImageDidLoadNotification = @"CPImageDidLoadNotification";
{
CGSize _size;
CPString _filename;
CPString _name;
id _delegate;
unsigned _loadStatus;
Image _image;
}
/*
- (id)init
{
return [self initByReferencingFile:@"" size:CGSizeMake(-1, -1)];
}
/*!
Initializes the image, by associating it with a filename. The image
denoted in <code>aFilename</code> is not actually loaded. It will
denoted in \c aFilename is not actually loaded. It will
be loaded once needed.
@param aFilename the file containing the image
@param aSize the image's size
@return the initialized image
*/
- (CPImage)initByReferencingFile:(CPString)aFilename size:(CGSize)aSize
- (id)initByReferencingFile:(CPString)aFilename size:(CGSize)aSize
{
self = [super init];
if (self)
{
_size = CPSizeCreateCopy(aSize);
_filename = aFilename;
_loadStatus = CPImageLoadStatusInitialized;
}
return self;
}
/*
/*!
Initializes the image. Loads the specified image into memory.
@param aFilename the image to load
@param aSize the size of the image
@return the initialized image.
*/
- (CPImage)initWithContentsOfFile:(CPString)aFilename size:(CGSize)aSize
- (id)initWithContentsOfFile:(CPString)aFilename size:(CGSize)aSize
{
self = [self initByReferencingFile:aFilename size:aSize];
if (self)
[self load];
return self;
}
/*
/*!
Initializes the receiver with the contents of the specified
image file. The method loads the data into memory.
@param aFilename the file name of the image
@return the initialized image
*/
- (CPImage)initWithContentsOfFile:(CPString)aFilename
- (id)initWithContentsOfFile:(CPString)aFilename
{
self = [self initByReferencingFile:aFilename size: CGSizeMake(-1, -1)];
self = [self initByReferencingFile:aFilename size:CGSizeMake(-1, -1)];
if (self)
[self load];
return self;
}
/*
/*!
Returns the path of the file associated with this image.
*/
- (CPString)filename
@@ -136,7 +167,7 @@ CPImageDidLoadNotification = @"CPImageDidLoadNotification";
return _filename;
}
/*
/*!
Sets the size of the image.
@param the size of the image
*/
@@ -145,7 +176,7 @@ CPImageDidLoadNotification = @"CPImageDidLoadNotification";
_size = CGSizeMakeCopy(aSize);
}
/*
/*!
Returns the size of the image
*/
- (CGSize)size
@@ -153,7 +184,46 @@ CPImageDidLoadNotification = @"CPImageDidLoadNotification";
return _size;
}
/*
+ (id)imageNamed:(CPString)aName
{
var image = imagesForNames[aName];
if (image)
return image;
var imageOrSize = AppKitImageForNames[aName];
if (!imageOrSize.isa)
{
imageOrSize = CPAppKitImage("CPImage/" + aName + ".png", imageOrSize);
[imageOrSize setName:aName];
AppKitImageForNames[aName] = imageOrSize;
}
return imageOrSize;
}
- (void)setName:(CPString)aName
{
if (_name === aName)
return;
if (imagesForNames[aName] === self)
imagesForNames[aName] = nil;
_name = aName;
imagesForNames[aName] = self;
}
- (CPString)name
{
return _name;
}
/*!
Sets the receiver's delegate.
@param the delegate
*/
@@ -162,7 +232,7 @@ CPImageDidLoadNotification = @"CPImageDidLoadNotification";
_delegate = aDelegate;
}
/*
/*!
Returns the receiver's delegate
*/
- (id)delegate
@@ -170,38 +240,75 @@ CPImageDidLoadNotification = @"CPImageDidLoadNotification";
return _delegate;
}
/*
Returns <code>YES</code> if the image data has already been loaded.
/*!
Returns the load status, which will be CPImageLoadStatusCompleted if the image data has already been loaded.
*/
- (BOOL)loadStatus
- (unsigned)loadStatus
{
return _loadStatus;
}
/*
/*!
Loads the image data from the file into memory. You
should not call this method directly. Instead use
one of the initializers.
*/
- (void)load
{
if (_loadStatus == CPImageLoadStatusLoading || _loadStatus == CPImageLoadStatusCompleted)
return;
_loadStatus = CPImageLoadStatusLoading;
#if PLATFORM(DOM)
_image = new Image();
var isSynchronous = YES;
// FIXME: We need a better/performance way of doing this.
_image.onload = function () { if (isSynchronous) window.setTimeout(function() { [self _imageDidLoad] }, 0); else [self _imageDidLoad]; }
_image.onerror = function () { if (isSynchronous) window.setTimeout(function() { [self _imageDidError] }, 0); else [self _imageDidError]; }
_image.onabort = function () { if (isSynchronous) window.setTimeout(function() { [self _imageDidAbort] }, 0); else [self _imageDidAbort]; }
_image.onload = function ()
{
if (isSynchronous)
window.setTimeout(function() { [self _imageDidLoad]; }, 0);
else
{
[self _imageDidLoad];
[[CPRunLoop currentRunLoop] limitDateForMode:CPDefaultRunLoopMode];
}
[self _derefFromImage];
}
_image.onerror = function ()
{
if (isSynchronous)
window.setTimeout(function() { [self _imageDidError]; }, 0);
else
{
[self _imageDidError];
[[CPRunLoop currentRunLoop] limitDateForMode:CPDefaultRunLoopMode];
}
[self _derefFromImage];
}
_image.onabort = function ()
{
if (isSynchronous)
window.setTimeout(function() { [self _imageDidAbort]; }, 0);
else
{
[self _imageDidAbort];
[[CPRunLoop currentRunLoop] limitDateForMode:CPDefaultRunLoopMode];
}
[self _derefFromImage];
}
_image.src = _filename;
isSynchronous = NO;
// onload and friends may fire after this point but BEFORE the end of the run loop,
// crazy, I know. So don't set isSynchronous here, rather wait a bit longer.
window.setTimeout(function() { isSynchronous = NO; }, 0);
#endif
}
- (BOOL)isThreePartImage
@@ -214,6 +321,14 @@ CPImageDidLoadNotification = @"CPImageDidLoadNotification";
return NO;
}
/* @ignore */
- (void)_derefFromImage
{
_image.onload = null;
_image.onerror = null;
_image.onabort = null;
}
/* @ignore */
- (void)_imageDidLoad
{
@@ -226,40 +341,34 @@ CPImageDidLoadNotification = @"CPImageDidLoadNotification";
[[CPNotificationCenter defaultCenter]
postNotificationName:CPImageDidLoadNotification
object:self];
if ([_delegate respondsToSelector:@selector(imageDidLoad:)])
[_delegate imageDidLoad:self];
[[CPRunLoop currentRunLoop] performSelectors];
}
/* @ignore */
- (void)_imageDidError
{
_loadStatus = CPImageLoadStatusReadError;
if ([_delegate respondsToSelector:@selector(imageDidError:)])
[_delegate imageDidError:self];
[[CPRunLoop currentRunLoop] performSelectors];
}
/* @ignore */
- (void)_imageDidAbort
{
_loadStatus = CPImageLoadStatusCancelled;
if ([_delegate respondsToSelector:@selector(imageDidAbort:)])
[_delegate imageDidAbort:self];
[[CPRunLoop currentRunLoop] performSelectors];
}
@end
@implementation CPImage (CPCoding)
/*
/*!
Initializes the image with data from a coder.
@param aCoder the coder from which to read the image data
@return the initialized image
@@ -269,7 +378,7 @@ CPImageDidLoadNotification = @"CPImageDidLoadNotification";
return [self initWithContentsOfFile:[aCoder decodeObjectForKey:@"CPFilename"] size:[aCoder decodeSizeForKey:@"CPSize"]];
}
/*
/*!
Writes the image data from memory into the coder.
@param aCoder the coder to which the data will be written
*/
@@ -290,7 +399,7 @@ CPImageDidLoadNotification = @"CPImageDidLoadNotification";
- (id)initWithImageSlices:(CPArray)imageSlices isVertical:(BOOL)isVertical
{
self = [super init];
if (self)
{
_imageSlices = imageSlices;
@@ -300,6 +409,11 @@ CPImageDidLoadNotification = @"CPImageDidLoadNotification";
return self;
}
- (CPString)filename
{
return @"";
}
- (CPArray)imageSlices
{
return _imageSlices;
@@ -330,13 +444,13 @@ var CPThreePartImageImageSlicesKey = @"CPThreePartImageImageSlicesKey",
- (id)initWithCoder:(CPCoder)aCoder
{
self = [super init];
if (self)
{
_imageSlices = [aCoder decodeObjectForKey:CPThreePartImageImageSlicesKey];
_isVertical = [aCoder decodeBoolForKey:CPThreePartImageIsVerticalKey];
}
return self;
}
@@ -357,13 +471,18 @@ var CPThreePartImageImageSlicesKey = @"CPThreePartImageImageSlicesKey",
- (id)initWithImageSlices:(CPArray)imageSlices
{
self = [super init];
if (self)
_imageSlices = imageSlices;
return self;
}
- (CPString)filename
{
return @"";
}
- (CPArray)imageSlices
{
return _imageSlices;
@@ -388,10 +507,10 @@ var CPNinePartImageImageSlicesKey = @"CPNinePartImageImageSlicesKey";
- (id)initWithCoder:(CPCoder)aCoder
{
self = [super init];
if (self)
_imageSlices = [aCoder decodeObjectForKey:CPNinePartImageImageSlicesKey];
return self;
}
+163 -99
View File
@@ -20,35 +20,21 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
import <Foundation/CPNotificationCenter.j>
@import <Foundation/CPNotificationCenter.j>
import "CPControl.j"
import "CPImage.j"
import "CPShadowView.j"
@import "CPControl.j"
@import "CPImage.j"
@import "CPShadowView.j"
#include "Platform/Platform.h"
#include "Platform/DOM/CPDOMDisplayServer.h"
#include "CoreGraphics/CGGeometry.h"
/*
@global
@group CPImageScaling
*/
CPScaleProportionally = 0;
/*
@global
@group CPImageScaling
*/
CPScaleToFit = 1;
/*
@global
@group CPImageScaling
*/
CPScaleNone = 2;
var CPImageViewShadowBackgroundColor = nil;
var LEFT_SHADOW_INSET = 3.0,
@@ -58,19 +44,21 @@ var LEFT_SHADOW_INSET = 3.0,
VERTICAL_SHADOW_INSET = TOP_SHADOW_INSET + BOTTOM_SHADOW_INSET,
HORIZONTAL_SHADOW_INSET = LEFT_SHADOW_INSET + RIGHT_SHADOW_INSET;
/*
/*!
@ingroup appkit
@class CPImageView
This class is a control that displays an image.
*/
@implementation CPImageView : CPControl
{
CPImage _image;
DOMElement _DOMImageElement;
CPImageScaling _imageScaling;
BOOL _hasShadow;
CPView _shadowView;
BOOL _isEditable;
CGRect _imageRect;
}
@@ -85,7 +73,13 @@ var LEFT_SHADOW_INSET = 3.0,
_DOMImageElement.style.position = "absolute";
_DOMImageElement.style.left = "0px";
_DOMImageElement.style.top = "0px";
if ([CPPlatform supportsDragAndDrop])
{
_DOMImageElement.setAttribute("draggable", "true");
_DOMImageElement.style["-khtml-user-drag"] = "element";
}
CPDOMDisplayServerAppendChild(_DOMElement, _DOMImageElement);
_DOMImageElement.style.visibility = "hidden";
@@ -95,65 +89,79 @@ var LEFT_SHADOW_INSET = 3.0,
return self;
}
/*
/*!
Returns the view's image.
*/
- (CPImage)image
{
return _image;
return [self objectValue];
}
/*
Sets the image for the view.
@param anImage the view's image
*/
- (void)setImage:(CPImage)anImage
{
if (_image == anImage)
[self setObjectValue:anImage];
}
/*! @ignore */
- (void)setObjectValue:(CPImage)anImage
{
var oldImage = [self objectValue];
if (oldImage === anImage)
return;
[super setObjectValue:anImage];
var center = [CPNotificationCenter defaultCenter];
var defaultCenter = [CPNotificationCenter defaultCenter];
if (_image)
[center removeObserver:self name:CPImageDidLoadNotification object:_image];
if (oldImage)
[defaultCenter removeObserver:self name:CPImageDidLoadNotification object:oldImage];
_image = anImage;
_DOMImageElement.src = [anImage filename];
var size = [_image size];
var newImage = [self objectValue];
if (size && size.width == -1 && size.height == -1)
#if PLATFORM(DOM)
_DOMImageElement.src = newImage ? [newImage filename] : "";
#endif
var size = [newImage size];
if (size && size.width === -1 && size.height === -1)
{
[center addObserver:self selector:@selector(imageDidLoad:) name:CPImageDidLoadNotification object:_image];
[defaultCenter addObserver:self selector:@selector(imageDidLoad:) name:CPImageDidLoadNotification object:newImage];
#if PLATFORM(DOM)
_DOMImageElement.width = 0;
_DOMImageElement.height = 0;
#endif
[_shadowView setHidden:YES];
}
else
{
[self hideOrDisplayContents];
[self tile];
[self setNeedsLayout];
[self setNeedsDisplay:YES];
}
}
- (void)imageDidLoad:(CPNotification)aNotification
{
[self hideOrDisplayContents];
[self tile];
[self setNeedsLayout];
[self setNeedsDisplay:YES];
}
/*
Returns <code>YES</code> if the image view draws with
a drop shadow. The default is <code>NO</code>.
/*!
Returns \c YES if the image view draws with
a drop shadow. The default is \c NO.
*/
- (BOOL)hasShadow
{
return _hasShadow;
}
/*
/*!
Sets whether the image view should draw with a drop shadow.
@param shouldHaveShadow whether the image view should have a shadow
*/
@@ -170,7 +178,8 @@ var LEFT_SHADOW_INSET = 3.0,
[self addSubview:_shadowView];
[self tile];
[self setNeedsLayout];
[self setNeedsDisplay:YES];
}
else
{
@@ -182,60 +191,53 @@ var LEFT_SHADOW_INSET = 3.0,
[self hideOrDisplayContents];
}
/*
/*!
Sets the type of image scaling that should be used to
render the image.
@param anImageScaling the type of scaling to use
*/
- (void)setImageScaling:(CPImageScaling)anImageScaling
{
if (_imageScaling == anImageScaling)
return;
[super setImageScaling:anImageScaling];
_imageScaling = anImageScaling;
if (_imageScaling == CPScaleToFit)
#if PLATFORM(DOM)
if ([self currentValueForThemeAttribute:@"image-scaling"] === CPScaleToFit)
{
CPDOMDisplayServerSetStyleLeftTop(_DOMImageElement, NULL, 0.0, 0.0);
}
#endif
[self tile];
[self setNeedsLayout];
[self setNeedsDisplay:YES];
}
/*
Returns the image scaling method used to
render this image.
*/
- (CPImageScaling)imageScaling
- (unsigned)imageScaling
{
return _imageScaling;
return [self currentValueForThemeAttribute:@"image-scaling"];
}
- (void)setFrameSize:(CGSize)aSize
{
[super setFrameSize:aSize];
[self tile];
}
/*
/*!
Toggles the display of the image view.
*/
- (void)hideOrDisplayContents
{
if (!_image)
if (![self image])
{
#if PLATFORM(DOM)
_DOMImageElement.style.visibility = "hidden";
#endif
[_shadowView setHidden:YES];
}
else
{
#if PLATFORM(DOM)
_DOMImageElement.style.visibility = "visible";
#endif
[_shadowView setHidden:NO];
}
}
/*
/*!
Returns the view's image rectangle
*/
- (CGRect)imageRect
@@ -243,15 +245,17 @@ var LEFT_SHADOW_INSET = 3.0,
return _imageRect;
}
/*
/*!
Add a description
*/
- (void)tile
- (void)layoutSubviews
{
if (!_image)
if (![self image])
return;
var bounds = [self bounds],
image = [self image],
imageScaling = [self currentValueForThemeAttribute:@"image-scaling"],
x = 0.0,
y = 0.0,
insetWidth = (_hasShadow ? HORIZONTAL_SHADOW_INSET : 0.0),
@@ -260,20 +264,22 @@ var LEFT_SHADOW_INSET = 3.0,
boundsHeight = _CGRectGetHeight(bounds),
width = boundsWidth - insetWidth,
height = boundsHeight - insetHeight;
if (_imageScaling == CPScaleToFit)
if (imageScaling === CPScaleToFit)
{
#if PLATFORM(DOM)
_DOMImageElement.width = ROUND(width);
_DOMImageElement.height = ROUND(height);
#endif
}
else
{
var size = [_image size];
var size = [image size];
if (size.width == -1 && size.height == -1)
return;
if (_imageScaling == CPScaleProportionally)
if (imageScaling === CPScaleProportionally)
{
// The max size it can be is size.width x size.height, so only
// only proportion otherwise.
@@ -292,9 +298,11 @@ var LEFT_SHADOW_INSET = 3.0,
else
height = width / imageRatio;
}
#if PLATFORM(DOM)
_DOMImageElement.width = ROUND(width);
_DOMImageElement.height = ROUND(height);
#endif
}
else
{
@@ -302,16 +310,20 @@ var LEFT_SHADOW_INSET = 3.0,
height = size.height;
}
if (_imageScaling == CPScaleNone)
if (imageScaling == CPScaleNone)
{
#if PLATFORM(DOM)
_DOMImageElement.width = ROUND(size.width);
_DOMImageElement.height = ROUND(size.height);
#endif
}
var x = (boundsWidth - width) / 2.0,
y = (boundsHeight - height) / 2.0;
#if PLATFORM(DOM)
CPDOMDisplayServerSetStyleLeftTop(_DOMImageElement, NULL, x, y);
#endif
}
_imageRect = _CGRectMake(x, y, width, height);
@@ -320,45 +332,97 @@ var LEFT_SHADOW_INSET = 3.0,
[_shadowView setFrame:_CGRectMake(x - LEFT_SHADOW_INSET, y - TOP_SHADOW_INSET, width + insetWidth, height + insetHeight)];
}
- (void)mouseDown:(CPEvent)anEvent
{
// Should we do something with this event?
[[self nextResponder] mouseDown:anEvent];
}
- (void)setEditable:(BOOL)shouldBeEditable
{
if (_isEditable === shouldBeEditable)
return;
_isEditable = shouldBeEditable;
if (_isEditable)
[self registerForDraggedTypes:[CPImagesPboardType]];
else
{
var draggedTypes = [self registeredDraggedTypes];
[self unregisterDraggedTypes];
[draggedTypes removeObjectIdenticalTo:CPImagesPboardType];
[self registerForDraggedTypes:draggedTypes];
}
}
- (BOOL)isEditable
{
return _isEditable;
}
- (void)performDragOperation:(CPDraggingInfo)aSender
{
var images = [CPKeyedUnarchiver unarchiveObjectWithData:[[aSender draggingPasteboard] dataForType:CPImagesPboardType]];
if ([images count])
[self setImage:images[0]];
}
@end
var CPImageViewImageKey = @"CPImageViewImageKey",
CPImageViewImageScalingKey = @"CPImageViewImageScalingKey",
CPImageViewHasShadowKey = @"CPImageViewHasShadowKey";
CPImageViewHasShadowKey = @"CPImageViewHasShadowKey",
CPImageViewIsEditableKey = @"CPImageViewIsEditableKey";
@implementation CPImageView (CPCoding)
/*
/*!
Initializes the image view with the provided coder.
@param aCoder the coder from which data will be read.
@return the initialized image view
*/
- (id)initWithCoder:(CPCoder)aCoder
{
#if PLATFORM(DOM)
_DOMImageElement = document.createElement("img");
_DOMImageElement.style.position = "absolute";
_DOMImageElement.style.left = "0px";
_DOMImageElement.style.top = "0px";
_DOMImageElement.style.visibility = "hidden";
if ([CPPlatform supportsDragAndDrop])
{
_DOMImageElement.setAttribute("draggable", "true");
_DOMImageElement.style["-khtml-user-drag"] = "element";
}
#endif
self = [super initWithCoder:aCoder];
if (self)
{
_DOMImageElement = document.createElement("img");
_DOMImageElement.style.position = "absolute";
_DOMImageElement.style.left = "0px";
_DOMImageElement.style.top = "0px";
#if PLATFORM(DOM)
_DOMElement.appendChild(_DOMImageElement);
_DOMImageElement.style.visibility = "hidden";
[self setImage:[aCoder decodeObjectForKey:CPImageViewImageKey]];
[self setImageScaling:[aCoder decodeIntForKey:CPImageViewImageScalingKey]];
#endif
[self setHasShadow:[aCoder decodeBoolForKey:CPImageViewHasShadowKey]];
[self tile];
if ([aCoder decodeBoolForKey:CPImageViewIsEditableKey] || NO)
[self setEditable:YES];
[self setNeedsLayout];
[self setNeedsDisplay:YES];
}
return self;
}
/*
/*!
Writes the image view out to the coder.
@param aCoder the coder to which the image
view will be written
@@ -380,10 +444,10 @@ var CPImageViewImageKey = @"CPImageViewImageKey",
if (_shadowView)
_subviews = actualSubviews;
[aCoder encodeObject:_image forKey:CPImageViewImageKey];
[aCoder encodeInt:_imageScaling forKey:CPImageViewImageScalingKey];
[aCoder encodeBool:_hasShadow forKey:CPImageViewHasShadowKey];
if (_isEditable)
[aCoder encodeBool:_isEditable forKey:CPImageViewIsEditableKey];
}
@end
-372
View File
@@ -1,372 +0,0 @@
/*
* CPApplication.j
* AppKit
*
* Created by Ross Boucher.
* Copyright 2008, 280 North, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
import <Foundation/Foundation.j>
import "CPView.j"
import "CPButton.j"
import "CPImage.j"
import "CPImageView.j"
import "CPColorPicker.j"
import "CPColorPanel.j"
import "CPTabView.j"
import "CPTabViewItem.j"
/*
@ignore
*/
@implementation CPKulerColorPicker : CPColorPicker
{
CPView _contentView;
CPTabView _tabView;
CPScrollView _searchView;
CPScrollView _popularView;
CPView _searchView;
DOMElement _FIXME_searchField;
CPURLConnection _searchConnection;
CPURLConnection _popularConnection
}
- (id)initWithPickerMask:(int)mask colorPanel:(CPColorPanel)owningColorPanel
{
return [super initWithPickerMask:mask colorPanel: owningColorPanel];
}
-(id)initView
{
aFrame = CPRectMake(0, 0, CPColorPickerViewWidth, CPColorPickerViewHeight);
_contentView = [[CPView alloc] initWithFrame:aFrame];
_tabView = [[CPTabView alloc] initWithFrame:CGRectMake(0.0, 0.0, CGRectGetWidth(aFrame), CGRectGetHeight(aFrame) - 20)];
[_tabView setAutoresizingMask: CPViewWidthSizable | CPViewHeightSizable];
[_tabView setDelegate: self];
[_contentView addSubview: _tabView];
var label = [[CPButton alloc] initWithFrame:CPRectMake((CPColorPickerViewWidth-150)/2, CPColorPickerViewHeight-20, 150, 20)];
[label setAutoresizingMask: CPViewMinXMargin | CPViewMaxXMargin | CPViewMinYMargin];
[label setFont:[CPFont boldSystemFontOfSize:10.0]];
[label setTextColor: [CPColor whiteColor]];
[label setTitle: @"Powered by Adobe Kuler"];
[label setTarget: self];
[label setAction: @selector(openKulerLink:)];
[label setBordered: NO];
[_contentView addSubview: label];
var searchThemeView = [[_CPKulerThemeView alloc] initWithFrame: CPRectMake(0, 0, aFrame.size.width, 0)];
[searchThemeView setDelegate: self];
[searchThemeView setAutoresizingMask: CPViewWidthSizable];
_searchView = [[CPScrollView alloc] initWithFrame: CPRectMake(0, 0, aFrame.size.width, CPColorPickerViewHeight - 10)];
[_searchView setDocumentView: searchThemeView];
[_searchView setHasHorizontalScroller: NO];
[_searchView setAutoresizingMask: (CPViewWidthSizable | CPViewHeightSizable)];
[[_searchView verticalScroller] setControlSize:CPSmallControlSize];
[_searchView setAutohidesScrollers:YES];
var auxiliarySearchView = [[CPView alloc] initWithFrame:CGRectMake(0.0, 0.0, CPColorPickerViewWidth, 26.0)];
[auxiliarySearchView setAutoresizingMask: (CPViewMinYMargin | CPViewWidthSizable)];
_FIXME_searchField = document.createElement("input");
if(!window.addEventListener)
_FIXME_searchField.type = "text";
else
_FIXME_searchField.type = "search";
_FIXME_searchField.style.position = "absolute";
_FIXME_searchField.style.width = "96%";
_FIXME_searchField.style.left = "2%";
_FIXME_searchField.style.top = "2px";
_FIXME_searchField.onkeypress = function(aDOMEvent)
{
aDOMEvent = aDOMEvent || window.event;
if (aDOMEvent.keyCode == 13)
{
[self search];
if(aDOMEvent.preventDefault)
aDOMEvent.preventDefault();
else if(aDOMEvent.stopPropagation)
aDOMEvent.stopPropagation();
_FIXME_searchField.blur();
}
};
auxiliarySearchView._DOMElement.appendChild(_FIXME_searchField);
var popularThemeView = [[_CPKulerThemeView alloc] initWithFrame: CPRectMake(0, 0, aFrame.size.width, 0)];
[popularThemeView setDelegate: self];
[popularThemeView setAutoresizingMask: CPViewWidthSizable];
_popularView = [[CPScrollView alloc] initWithFrame: CPRectMake(0, 0, aFrame.size.width, CPColorPickerViewHeight)];
[_popularView setDocumentView: popularThemeView];
[_popularView setHasHorizontalScroller: NO];
[_popularView setAutoresizingMask: (CPViewWidthSizable | CPViewHeightSizable)];
[[_popularView verticalScroller] setControlSize:CPSmallControlSize];
[_popularView setAutohidesScrollers:YES];
var mostPopularItem = [[CPTabViewItem alloc] initWithIdentifier:@"Popular"];
var searchItem = [[CPTabViewItem alloc] initWithIdentifier:@"Search"];
[searchItem setLabel:@"Search"];
[searchItem setView:_searchView];
[searchItem setAuxiliaryView: auxiliarySearchView];
[mostPopularItem setLabel:@"Popular"];
[mostPopularItem setView: _popularView];
[_tabView addTabViewItem: mostPopularItem];
[_tabView addTabViewItem: searchItem];
[self popularThemes];
}
- (void)openKulerLink:(id)sender
{
window.open("http://kuler.adobe.com");
}
- (CPView)provideNewView:(BOOL)initialRequest
{
if (initialRequest)
[self initView];
return _contentView;
}
- (int)currentMode
{
return CPKulerColorPickerMode;
}
- (BOOL)supportsMode:(int)mode
{
return (mode == CPKulerColorPickerMode) ? YES : NO;
}
-(void)search
{
var query = escape(_FIXME_searchField.value);
if(query.replace("%20", "") == "")
return;
[_searchConnection cancel];
_searchConnection = nil;
_searchConnection = [CPURLConnection connectionWithRequest:
[CPURLRequest requestWithURL: BASE_URL + "kuler.php?mode=search&query="+query]
delegate: self];
}
-(void)popularThemes
{
[_popularConnection cancel];
_popularConnection = nil;
_popularConnection = [CPURLConnection connectionWithRequest:
[CPURLRequest requestWithURL: BASE_URL + "kuler.php?mode=popular"] delegate: self];
}
/*
-(void)topRatedThemes
{
_connection = [CPURLConnection connectionWithRequest:
[CPURLRequest requestWithURL: BASE_URL + "kuler.php?mode=rating"] delegate:self];
}
*/
- (void)connection:(CPURLConnection)aConnection didReceiveData:(CPString)data
{
var data = CPJSObjectCreateWithJSON(data);
if(!data)
var themes = [];
else
var themes = data.result;
if(aConnection == _popularConnection)
[[_popularView documentView] setThemes: themes];
if(aConnection == _searchConnection)
[[_searchView documentView] setThemes: themes];
}
- (void)connection:(CPURLConnection)aConnection didFailWithError:(CPError)anError
{
[self connectionDidFinishLoading:aConnection];
}
-(void)connectionDidFinishLoading:(CPURLConnection)aConnection
{
}
-(void)chooseColor:(CPColor)aColor
{
[[self colorPanel] setColor: aColor];
}
@end
/* @ignore */
@implementation _CPKulerThemeView : CPView
{
CPArray _themes;
id _delegate;
CPColor _alternateBGColor;
}
-(id)initWithFrame:(CPRect)aFrame
{
self = [super initWithFrame:aFrame];
_alternateBGColor = [CPColor colorWithCalibratedRed: 241.0/255.0 green: 245.0/255.0 blue: 250.0/255.0 alpha: 1.0];
return self;
}
-(id)delegate
{
return _delegate;
}
-(void)setDelegate:(id)delegate
{
_delegate = delegate;
}
-(CPArray)themes
{
return _themes;
}
-(void)setThemes:(CPArray)themes
{
_themes = themes;
[self updateDisplay];
}
-(void)updateDisplay
{
var width = [self frame].size.width;
var subviews = [self subviews];
for(var i = [subviews count]-1; i >= 0; --i)
[subviews[i] removeFromSuperview];
for(var i=0, count = [_themes count]; i<count; i++)
{
var swatches = _themes[i].swatches;
var containerView = [[CPView alloc] initWithFrame: CPRectMake(0, 1+ 20*i, width, 20)];
[containerView setAutoresizingMask: CPViewWidthSizable];
for(var j=0; j<swatches.length; j++)
{
var outerView = [[CPView alloc] initWithFrame: CGRectMake(2+20*j, 1, 18, 18)],
innerView = [[_CPColorView alloc] initWithFrame: CGRectInset([outerView bounds], 1.0, 1.0)];
[innerView setTarget: self];
[innerView setAction: @selector(selectedColor:)];
[innerView setBackgroundColor: [CPColor colorWithHexString: swatches[j].hexColor]];
[outerView setBackgroundColor: [CPColor blackColor]];
[outerView addSubview: innerView];
[containerView addSubview: outerView];
}
var label = [[CPTextField alloc] initWithFrame: CPRectMake(102, 0, width - 102, 20)];
[label setStringValue: _themes[i].title];
[label setFont: [CPFont systemFontOfSize: 11.0]];
[label setLineBreakMode: CPLineBreakByTruncatingTail];
[label setAutoresizingMask: CPViewWidthSizable];
[containerView addSubview: label];
if(i%2 == 1)
[containerView setBackgroundColor: _alternateBGColor];
[self addSubview: containerView];
}
[self setFrameSize: CPSizeMake(width, (count)*20 + 2)];
}
-(void)selectedColor:(id)sender
{
[_delegate chooseColor:[sender backgroundColor]];
}
@end
/* @ignore */
@implementation _CPColorView : CPControl
{
}
-(id)initWithFrame:(CPRect)aFrame
{
self = [super initWithFrame: aFrame];
[self registerForDraggedTypes:[CPArray arrayWithObjects:CPColorDragType]];
return self;
}
- (void)mouseDragged:(CPEvent)anEvent
{
[[CPPasteboard pasteboardWithName:CPDragPboard] declareTypes:[CPArray arrayWithObject:CPColorDragType] owner:self];
var bounds = CPRectMake(0, 0, 15, 15),
point = [self convertPoint:[anEvent locationInWindow] fromView:nil];
var outerView = [[CPView alloc] initWithFrame: bounds],
innerView = [[CPView alloc] initWithFrame: CGRectInset([outerView bounds], 1.0, 1.0)];
[innerView setBackgroundColor: [self backgroundColor]];
[outerView setBackgroundColor: [CPColor blackColor]];
[outerView addSubview: innerView];
[self dragView: outerView
at: CPPointMake(point.x - bounds.size.width / 2.0, point.y - bounds.size.height / 2.0)
offset: CPPointMake(0.0, 0.0)
event: anEvent
pasteboard: nil
source: self
slideBack: YES];
}
- (void)pasteboard:(CPPasteboard)aPasteboard provideDataForType:(CPString)aType
{
if(aType == CPColorDragType)
[aPasteboard setData:[self backgroundColor] forType:aType];
}
@end
-1728
View File
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+556
View File
@@ -0,0 +1,556 @@
#include "../CoreGraphics/CGGeometry.h"
#include "../Platform/Platform.h"
@import "_CPMenuWindow.j"
var MENUBAR_HEIGHT = 28.0,
MENUBAR_MARGIN = 10.0,
MENUBAR_LEFT_MARGIN = 10.0,
MENUBAR_RIGHT_MARGIN = 10.0;
var _CPMenuBarWindowBackgroundColor = nil,
_CPMenuBarWindowFont = nil;
@implementation _CPMenuBarWindow : CPPanel
{
CPMenu _menu;
CPView _highlightView;
CPArray _menuItemViews;
CPMenuItem _trackingMenuItem;
CPImageView _iconImageView;
CPTextField _titleField;
CPColor _textColor;
CPColor _titleColor;
CPColor _textShadowColor;
CPColor _titleShadowColor;
CPColor _highlightColor;
CPColor _highlightTextColor;
CPColor _highlightTextShadowColor;
}
+ (void)initialize
{
if (self != [_CPMenuBarWindow class])
return;
var bundle = [CPBundle bundleForClass:self];
_CPMenuBarWindowFont = [CPFont boldSystemFontOfSize:12.0];
}
+ (CPFont)font
{
return _CPMenuBarWindowFont;
}
- (id)init
{
// This only shows up in browser land, so don't bother calculating metrics in desktop.
var contentRect = [[CPPlatformWindow primaryPlatformWindow] contentBounds];
contentRect.size.height = MENUBAR_HEIGHT;
self = [super initWithContentRect:contentRect styleMask:CPBorderlessWindowMask];
if (self)
{
[self setLevel:CPMainMenuWindowLevel];
[self setAutoresizingMask:CPWindowWidthSizable];
var contentView = [self contentView];
[contentView setAutoresizesSubviews:NO];
[self setBecomesKeyOnlyIfNeeded:YES];
//
_iconImageView = [[CPImageView alloc] initWithFrame:CGRectMake(0.0, 0.0, 16.0, 16.0)];
[contentView addSubview:_iconImageView];
_titleField = [[CPTextField alloc] initWithFrame:CGRectMakeZero()];
[_titleField setFont:[CPFont boldSystemFontOfSize:13.0]];
[_titleField setAlignment:CPCenterTextAlignment];
[_titleField setTextShadowOffset:CGSizeMake(0, 1)];
[contentView addSubview:_titleField];
}
return self;
}
- (void)setTitle:(CPString)aTitle
{
#if PLATFORM(DOM)
var bundleName = [[CPBundle mainBundle] objectForInfoDictionaryKey:@"CPBundleName"];
if (![bundleName length])
document.title = aTitle;
else if ([aTitle length])
document.title = aTitle + @" - " + bundleName;
else
document.title = bundleName;
#endif
[_titleField setStringValue:aTitle];
[_titleField sizeToFit];
[self tile];
}
- (void)setIconImage:(CPImage)anImage
{
[_iconImageView setImage:anImage];
[_iconImageView setHidden:anImage == nil];
[self tile];
}
- (void)setIconImageAlphaValue:(float)anAlphaValue
{
[_iconImageView setAlphaValue:anAlphaValue];
}
- (void)setColor:(CPColor)aColor
{
if (!aColor)
{
if (!_CPMenuBarWindowBackgroundColor)
_CPMenuBarWindowBackgroundColor = [CPColor colorWithPatternImage:[[CPImage alloc] initWithContentsOfFile:[[CPBundle bundleForClass:[_CPMenuBarWindow class]] pathForResource:@"_CPMenuBarWindow/_CPMenuBarWindowBackground.png"] size:CGSizeMake(1.0, 28.0)]];
[[self contentView] setBackgroundColor:_CPMenuBarWindowBackgroundColor];
}
else
[[self contentView] setBackgroundColor:aColor];
}
- (void)setTextColor:(CPColor)aColor
{
if (_textColor == aColor)
return;
_textColor = aColor;
[_menuItemViews makeObjectsPerformSelector:@selector(setTextColor:) withObject:_textColor];
}
- (void)setTitleColor:(CPColor)aColor
{
if (_titleColor == aColor)
return;
_titleColor = aColor;
[_titleField setTextColor:aColor ? aColor : [CPColor blackColor]];
}
- (void)setTextShadowColor:(CPColor)aColor
{
if (_textShadowColor == aColor)
return;
_textShadowColor = aColor;
[_menuItemViews makeObjectsPerformSelector:@selector(setTextShadowColor:) withObject:_textShadowColor];
}
- (void)setTitleShadowColor:(CPColor)aColor
{
if (_titleShadowColor == aColor)
return;
_titleShadowColor = aColor;
[_titleField setTextShadowColor:aColor ? aColor : [CPColor whiteColor]];
}
- (void)setHighlightColor:(CPColor)aColor
{
if (_highlightColor == aColor)
return;
_highlightColor = aColor;
}
- (void)setHighlightTextColor:(CPColor)aColor
{
if (_highlightTextColor == aColor)
return;
_highlightTextColor = aColor;
// [_menuItemViews makeObjectsPerformSelector:@selector(setActivateColor:) withObject:_highlightTextColor];
}
- (void)setHighlightTextShadowColor:(CPColor)aColor
{
if (_highlightTextShadowColor == aColor)
return;
_highlightTextShadowColor = aColor;
// [_menuItemViews makeObjectsPerformSelector:@selector(setActivateShadowColor:) withObject:_highlightTextShadowColor];
}
- (void)setMenu:(CPMenu)aMenu
{
if (_menu == aMenu)
return;
var defaultCenter = [CPNotificationCenter defaultCenter];
if (_menu)
{
[defaultCenter
removeObserver:self
name:CPMenuDidAddItemNotification
object:_menu];
[defaultCenter
removeObserver:self
name:CPMenuDidChangeItemNotification
object:_menu];
[defaultCenter
removeObserver:self
name:CPMenuDidRemoveItemNotification
object:_menu];
var items = [_menu itemArray],
count = items.length;
while (count--)
[[items[count] _menuItemView] removeFromSuperview];
}
_menu = aMenu;
if (_menu)
{
[defaultCenter
addObserver:self
selector:@selector(menuDidAddItem:)
name:CPMenuDidAddItemNotification
object:_menu];
[defaultCenter
addObserver:self
selector:@selector(menuDidChangeItem:)
name:CPMenuDidChangeItemNotification
object:_menu];
[defaultCenter
addObserver:self
selector:@selector(menuDidRemoveItem:)
name:CPMenuDidRemoveItemNotification
object:_menu];
}
_menuItemViews = [];
var contentView = [self contentView],
items = [_menu itemArray],
count = items.length;
for (index = 0; index < count; ++index)
{
var item = items[index],
menuItemView = [item _menuItemView];
_menuItemViews.push(menuItemView);
[menuItemView setTextColor:_textColor];
[menuItemView setHidden:[item isHidden]];
[menuItemView synchronizeWithMenuItem];
[contentView addSubview:menuItemView];
}
[self tile];
}
- (void)menuDidChangeItem:(CPNotification)aNotification
{
var menuItem = [_menu itemAtIndex:[[aNotification userInfo] objectForKey:@"CPMenuItemIndex"]],
menuItemView = [menuItem _menuItemView];
[menuItemView setHidden:[menuItem isHidden]];
[menuItemView synchronizeWithMenuItem];
[self tile];
}
- (void)menuDidAddItem:(CPNotification)aNotification
{
var index = [[aNotification userInfo] objectForKey:@"CPMenuItemIndex"],
menuItem = [_menu itemAtIndex:index],
menuItemView = [menuItem _menuItemView];
[_menuItemViews insertObject:menuItemView atIndex:index];
[menuItemView setTextColor:_textColor];
[menuItemView setHidden:[menuItem isHidden]];
[menuItemView synchronizeWithMenuItem];
[[self contentView] addSubview:menuItemView];
[self tile];
}
- (void)menuDidRemoveItem:(CPNotification)aNotification
{
var index = [[aNotification userInfo] objectForKey:@"CPMenuItemIndex"],
menuItemView = [_menuItemViews objectAtIndex:index];
[_menuItemViews removeObjectAtIndex:index];
[menuItemView removeFromSuperview];
[self tile];
}
- (void)mouseDown:(CPEvent)anEvent
{
var constraintRect = CGRectInset([[self platformWindow] visibleFrame], 5.0, 0.0);
constraintRect.size.height -= 5.0;
[[_CPMenuManager sharedMenuManager]
beginTracking:anEvent
menuContainer:self
constraintRect:constraintRect
callback:function(aMenuContainer, aMenu)
{
[aMenu _performActionOfHighlightedItemChain];
[aMenu _highlightItemAtIndex:CPNotFound];
}];
}
- (CPFont)font
{
[CPFont systemFontOfSize:12.0];
}
- (void)tile
{
var items = [_menu itemArray],
index = 0,
count = items.length,
x = MENUBAR_LEFT_MARGIN,
y = 0.0,
isLeftAligned = YES;
for (; index < count; ++index)
{
var item = items[index];
if ([item isSeparatorItem])
{
x = CGRectGetWidth([self frame]) - MENUBAR_RIGHT_MARGIN;
isLeftAligned = NO;
continue;
}
if ([item isHidden])
continue;
var menuItemView = [item _menuItemView],
frame = [menuItemView frame];
if (isLeftAligned)
{
[menuItemView setFrame:CGRectMake(x, 0.0, CGRectGetWidth(frame), MENUBAR_HEIGHT)];
x += CGRectGetWidth([menuItemView frame]);
}
else
{
[menuItemView setFrame:CGRectMake(x - CGRectGetWidth(frame), 0.0, CGRectGetWidth(frame), MENUBAR_HEIGHT)];
x = CGRectGetMinX([menuItemView frame]);
}
}
var bounds = [[self contentView] bounds],
titleFrame = [_titleField frame];
if ([_iconImageView isHidden])
[_titleField setFrameOrigin:CGPointMake((CGRectGetWidth(bounds) - CGRectGetWidth(titleFrame)) / 2.0, (CGRectGetHeight(bounds) - CGRectGetHeight(titleFrame)) / 2.0)];
else
{
var iconFrame = [_iconImageView frame],
iconWidth = CGRectGetWidth(iconFrame),
totalWidth = iconWidth + CGRectGetWidth(titleFrame);
[_iconImageView setFrameOrigin:CGPointMake((CGRectGetWidth(bounds) - totalWidth) / 2.0, (CGRectGetHeight(bounds) - CGRectGetHeight(iconFrame)) / 2.0)];
[_titleField setFrameOrigin:CGPointMake((CGRectGetWidth(bounds) - totalWidth) / 2.0 + iconWidth, (CGRectGetHeight(bounds) - CGRectGetHeight(titleFrame)) / 2.0)];
}
}
- (void)setFrame:(CGRect)aRect display:(BOOL)shouldDisplay animate:(BOOL)shouldAnimate
{
var size = [self frame].size;
[super setFrame:aRect display:shouldDisplay animate:shouldAnimate];
if (!_CGSizeEqualToSize(size, aRect.size))
[self tile];
}
@end
@implementation _CPMenuBarWindow (CPMenuContainer)
- (BOOL)isMenuBar
{
return YES;
}
- (CGRect)globalFrame
{
return [self frame];
}
- (_CPManagerScrollingState)scrollingStateForPoint:(CGPoint)aGlobalLocation
{
return _CPMenuManagerScrollingStateNone;
}
- (CPInteger)itemIndexAtPoint:(CGPoint)aPoint
{
var items = [_menu itemArray],
index = items.length;
while (index--)
{
var item = items[index];
if ([item isHidden] || [item isSeparatorItem])
continue;
if (CGRectContainsPoint([self rectForItemAtIndex:index], aPoint))
return index;
}
return CPNotFound;
}
- (CGRect)rectForItemAtIndex:(CPInteger)anIndex
{
var menuItem = [_menu itemAtIndex:anIndex === CPNotFound ? 0 : anIndex];
return [[menuItem _menuItemView] frame];
}
@end
@implementation _CPMenuBarView : _CPMenuView
{
}
- (CGRect)rectForItemAtIndex:(int)anIndex
{
return [_menuItemViews[anIndex === CPNotFound ? 0 : anIndex] frame];
}
- (int)itemIndexAtPoint:(CGPoint)aPoint
{
var bounds = [self bounds];
if (!CGRectContainsPoint(bounds, aPoint))
return CPNotFound;
var x = aPoint.x,
low = 0,
high = _visibleMenuItemInfos.length - 1;
while (low <= high)
{
var middle = FLOOR(low + (high - low) / 2),
info = _visibleMenuItemInfos[middle],
frame = [info.view frame];
if (x < CGRectGetMinX(frame))
high = middle - 1;
else if (x > CGRectGetMaxX(frame))
low = middle + 1;
else
return info.index;
}
return CPNotFound;
}
- (void)tile
{
var items = [_menu itemArray],
index = 0,
count = items.length,
x = MENUBAR_LEFT_MARGIN,
y = 0.0,
isLeftAligned = YES;
for (; index < count; ++index)
{
var item = items[index];
if ([item isSeparatorItem])
{
x = CGRectGetWidth([self frame]) - MENUBAR_RIGHT_MARGIN;
isLeftAligned = NO;
continue;
}
if ([item isHidden])
continue;
var menuItemView = [item _menuItemView],
frame = [menuItemView frame];
if (isLeftAligned)
{
[menuItemView setFrameOrigin:CGPointMake(x, (MENUBAR_HEIGHT - 1.0 - CGRectGetHeight(frame)) / 2.0)];
x += CGRectGetWidth([menuItemView frame]) + MENUBAR_MARGIN;
}
else
{
[menuItemView setFrameOrigin:CGPointMake(x - CGRectGetWidth(frame), (MENUBAR_HEIGHT - 1.0 - CGRectGetHeight(frame)) / 2.0)];
x = CGRectGetMinX([menuItemView frame]) - MENUBAR_MARGIN;
}
}
var bounds = [[self contentView] bounds],
titleFrame = [_titleField frame];
if ([_iconImageView isHidden])
[_titleField setFrameOrigin:CGPointMake((CGRectGetWidth(bounds) - CGRectGetWidth(titleFrame)) / 2.0, (CGRectGetHeight(bounds) - CGRectGetHeight(titleFrame)) / 2.0)];
else
{
var iconFrame = [_iconImageView frame],
iconWidth = CGRectGetWidth(iconFrame),
totalWidth = iconWidth + CGRectGetWidth(titleFrame);
[_iconImageView setFrameOrigin:CGPointMake((CGRectGetWidth(bounds) - totalWidth) / 2.0, (CGRectGetHeight(bounds) - CGRectGetHeight(iconFrame)) / 2.0)];
[_titleField setFrameOrigin:CGPointMake((CGRectGetWidth(bounds) - totalWidth) / 2.0 + iconWidth, (CGRectGetHeight(bounds) - CGRectGetHeight(titleFrame)) / 2.0)];
}
}
@end
+370
View File
@@ -0,0 +1,370 @@
#include "../CoreGraphics/CGGeometry.h"
@import <Foundation/CPObject.j>
_CPMenuManagerScrollingStateUp = -1,
_CPMenuManagerScrollingStateDown = 1,
_CPMenuManagerScrollingStateNone = 0;
var STICKY_TIME_INTERVAL = 500;
var SharedMenuManager = nil;
@implementation _CPMenuManager: CPObject
{
CPTimeInterval _startTime;
int _scrollingState;
CGPoint _lastGlobalLocation;
CPView _lastMouseOverMenuView;
CGRect _constraintRect;
CPMutableArray _menuContainerStack;
Function _trackingCallback;
}
+ (_CPMenuManager)sharedMenuManager
{
if (!SharedMenuManager)
SharedMenuManager = [[_CPMenuManager alloc] init];
return SharedMenuManager;
}
- (id)init
{
if (SharedMenuManager)
return SharedMenuManager;
return [super init];
}
- (id)trackingMenuContainer
{
return _menuContainerStack[0];
}
- (CPMenu)trackingMenu
{
return [[self trackingMenuContainer] menu];
}
- (void)beginTracking:(CPEvent)anEvent
menuContainer:(id)aMenuContainer
constraintRect:(CGRect)aRect
callback:(Function)aCallback
{
var menu = [aMenuContainer menu];
CPApp._activeMenu = menu;
_startTime = [anEvent timestamp];//new Date();
_scrollingState = _CPMenuManagerScrollingStateNone;
_constraintRect = aRect;
_menuContainerStack = [aMenuContainer];
_trackingCallback = aCallback;
if (menu === [CPApp mainMenu])
{
var globalLocation = [anEvent globalLocation];
// Find which menu window the mouse is currently on top of
var menuLocation = [aMenuContainer convertGlobalToBase:globalLocation];
// Find out the item the mouse is currently on top of
var activeItemIndex = [aMenuContainer itemIndexAtPoint:menuLocation],
activeItem = activeItemIndex !== CPNotFound ? [menu itemAtIndex:activeItemIndex] : nil;
_menuBarButtonItemIndex = activeItemIndex;
_menuBarButtonMenuContainer = aMenuContainer;
if ([activeItem _isMenuBarButton])
return [self trackMenuBarButtonEvent:anEvent];
}
[self trackEvent:anEvent];
}
- (void)trackEvent:(CPEvent)anEvent
{
var type = [anEvent type],
trackingMenu = [self trackingMenu];
// Close Menu Event.
if (type === CPAppKitDefined)
return [self completeTracking]
[CPApp setTarget:self selector:@selector(trackEvent:) forNextEventMatchingMask:CPPeriodicMask | CPMouseMovedMask | CPLeftMouseDraggedMask | CPLeftMouseUpMask | CPAppKitDefinedMask untilDate:nil inMode:nil dequeue:YES];
// Periodic events don't have a valid location.
var globalLocation = type === CPPeriodic ? _lastGlobalLocation : [anEvent globalLocation];
// Remember this for the next periodic event.
_lastGlobalLocation = globalLocation;
// Find which menu window the mouse is currently on top of
var activeMenuContainer = [self menuContainerForPoint:globalLocation],
activeMenu = [activeMenuContainer menu],
menuLocation = [activeMenuContainer convertGlobalToBase:globalLocation];
// Find out the item the mouse is currently on top of
var activeItemIndex = activeMenuContainer ? [activeMenuContainer itemIndexAtPoint:menuLocation] : CPNotFound,
activeItem = activeItemIndex !== CPNotFound ? [activeMenu itemAtIndex:activeItemIndex] : nil;
// If the item isn't enabled its as if we clicked on nothing.
if (![activeItem isEnabled] || [activeItem _isMenuBarButton])
{
activeItemIndex = CPNotFound;
activeItem = nil;
}
var mouseOverMenuView = [activeItem view];
if (type === CPPeriodic)
{
if (_scrollingState === _CPMenuManagerScrollingStateUp)
[activeMenuContainer scrollUp];
else if (_scrollingState === _CPMenuManagerScrollingStateDown)
[activeMenuContainer scrollDown];
}
// If we're over a custom menu view...
if (mouseOverMenuView)
{
if (!_lastMouseOverMenuView)
[activeMenu _highlightItemAtIndex:CPNotFound];
if (_lastMouseOverMenuView != mouseOverMenuView)
{
[mouseOverMenuView mouseExited:anEvent];
// FIXME: Possibly multiple of these?
[_lastMouseOverMenuView mouseEntered:anEvent];
_lastMouseOverMenuView = mouseOverMenuView;
}
var menuContainerWindow = activeMenuContainer;
if (![menuContainerWindow isKindOfClass:[CPWindow class]])
menuContainerWindow = [menuContainerWindow window];
[menuContainerWindow
sendEvent:[CPEvent mouseEventWithType:type location:menuLocation modifierFlags:[anEvent modifierFlags]
timestamp:[anEvent timestamp]
windowNumber:menuContainerWindow
context:nil
eventNumber:0
clickCount:[anEvent clickCount]
pressure:[anEvent pressure]]];
}
else
{
if (_lastMouseOverMenuView)
{
[_lastMouseOverMenuView mouseExited:anEvent];
_lastMouseOverMenuView = nil;
}
[activeMenu _highlightItemAtIndex:activeItemIndex];
if (type === CPMouseMoved || type === CPLeftMouseDragged || type === CPLeftMouseDown)
{
var oldScrollingState = _scrollingState;
_scrollingState = [activeMenuContainer scrollingStateForPoint:globalLocation];
if (_scrollingState !== oldScrollingState)
{
if (_scrollingState === _CPMenuManagerScrollingStateNone)
[CPEvent stopPeriodicEvents];
else if (oldScrollingState === _CPMenuManagerScrollingStateNone)
[CPEvent startPeriodicEventsAfterDelay:0.0 withPeriod:0.04];
}
}
else if (type === CPLeftMouseUp && ([anEvent timestamp] - _startTime > STICKY_TIME_INTERVAL))
[trackingMenu cancelTracking];
}
// If the item has a submenu, show it.
if ([activeItem hasSubmenu])// && [activeItem action] === @selector(submenuAction:))
{
var activeItemRect = [activeMenuContainer rectForItemAtIndex:activeItemIndex];
if ([activeMenuContainer isMenuBar])
var newMenuOrigin = CGPointMake(CGRectGetMinX(activeItemRect), CGRectGetMaxY(activeItemRect));
else
var newMenuOrigin = CGPointMake(CGRectGetMaxX(activeItemRect), CGRectGetMinY(activeItemRect));
newMenuOrigin = [activeMenuContainer convertBaseToGlobal:newMenuOrigin];
[self showMenu:[activeItem submenu] fromMenu:[activeItem menu] atPoint:newMenuOrigin];
}
// This handles both the case where we've moved away from the menu, and where
// we've moved to an item without a submenu.
else
[self showMenu:nil fromMenu:activeMenu atPoint:CGPointMakeZero()];
}
- (void)trackMenuBarButtonEvent:(CPEvent)anEvent
{
var type = [anEvent type];
if (type === CPAppKitDefined)
return [self completeTracking];
var globalLocation = [anEvent globalLocation];
// Find which menu window the mouse is currently on top of
var menu = [self trackingMenu],
trackingMenuContainer = [self trackingMenuContainer],
menuLocation = [trackingMenuContainer convertGlobalToBase:globalLocation];
if ([trackingMenuContainer itemIndexAtPoint:menuLocation] === _menuBarButtonItemIndex)
[menu _highlightItemAtIndex:_menuBarButtonItemIndex];
else
[menu _highlightItemAtIndex:CPNotFound];
[CPApp setTarget:self selector:@selector(trackMenuBarButtonEvent:) forNextEventMatchingMask:CPPeriodicMask | CPMouseMovedMask | CPLeftMouseDraggedMask | CPLeftMouseUpMask | CPAppKitDefinedMask untilDate:nil inMode:nil dequeue:YES];
if (type === CPLeftMouseUp)
[menu cancelTracking];
}
- (void)completeTracking
{
var trackingMenu = [self trackingMenu];
// Stop all periodic events at this point.
[CPEvent stopPeriodicEvents];
// Get the highlighted item from the original menu.
var highlightedItem = [trackingMenu highlightedItem];
// Hide all submenus.
[self showMenu:nil fromMenu:trackingMenu atPoint:nil];
var delegate = [trackingMenu delegate];
if ([delegate respondsToSelector:@selector(menuDidClose:)])
[delegate menuDidClose:trackingMenu];
if (_trackingCallback)
_trackingCallback([self trackingMenuContainer], trackingMenu);
[[CPNotificationCenter defaultCenter]
postNotificationName:CPMenuDidEndTrackingNotification
object:trackingMenu];
CPApp._activeMenu = nil;
}
- (id)menuContainerForPoint:(float)aGlobalLocation
{
var count = [_menuContainerStack count],
firstMenuContainer = _menuContainerStack[0];
// Trivial case.
if (count === 1)
return firstMenuContainer;
var firstMenuWindowIndex = 0,
lastMenuWindowIndex = count - 1;
// If the first menu container is a bar, then it has to fall strictly within its bounds.
if ([firstMenuContainer isMenuBar])
{
if (CGRectContainsPoint([firstMenuContainer globalFrame], aGlobalLocation))
return firstMenuContainer;
firstMenuWindowIndex = 1;
}
var index = count,
x = aGlobalLocation.x,
closerDeltaX = Infinity,
closerMenuContainer = nil;
while (index-- > firstMenuWindowIndex)
{
var menuContainer = _menuContainerStack[index],
menuContainerFrame = [menuContainer globalFrame],
menuContainerMinX = _CGRectGetMinX(menuContainerFrame),
menuContainerMaxX = _CGRectGetMaxX(menuContainerFrame);
// If within the x bounds of this menu container, return it.
if (x < menuContainerMaxX && x >= menuContainerMinX)
return menuContainer;
// If this is either the first or last menu *window*, check to see how close we are to it.
if (index === firstMenuWindowIndex || index === lastMenuWindowIndex)
{
var deltaX = ABS(x < menuContainerMinX ? menuContainerMinX - x : menuContainerMaxX - x);
if (deltaX < closerDeltaX)
{
closerMenuContainer = menuContainer;
closerDeltaX = deltaX;
}
}
}
return closerMenuContainer;
}
- (void)showMenu:(CPMenu)newMenu fromMenu:(CPMenu)baseMenu atPoint:(CGPoint)aGlobalLocation
{
var count = _menuContainerStack.length,
index = count;
// Hide all menus up to the base menu...
while (index--)
{
var menuContainer = _menuContainerStack[index],
menu = [menuContainer menu];
// If we reach the base menu, or this menu is already being shown, break.
if (menu === baseMenu)
break;
// If this menu is already being shown, unhighlight and return.
if (menu === newMenu)//&& [menu supermenu] === baseMenu)
return [newMenu _highlightItemAtIndex:CPNotFound];
[menuContainer orderOut:self];
[menuContainer setMenu:nil];
[_CPMenuWindow poolMenuWindow:menuContainer];
[_menuContainerStack removeObjectAtIndex:index];
}
if (!newMenu)
return;
// Unhighlight any previously highlighted item.
[newMenu _highlightItemAtIndex:CPNotFound];
var menuWindow = [_CPMenuWindow menuWindowWithMenu:newMenu font:[_menuContainerStack[0] font]];
[_menuContainerStack addObject:menuWindow];
[menuWindow setConstraintRect:_constraintRect];
// If our parent menu is a menu bar...
if (baseMenu === [self trackingMenu] && [[self trackingMenuContainer] isMenuBar])
[menuWindow setBackgroundStyle:_CPMenuWindowMenuBarBackgroundStyle];
else
[menuWindow setBackgroundStyle:_CPMenuWindowPopUpBackgroundStyle];
[menuWindow setFrameOrigin:aGlobalLocation];
[menuWindow orderFront:self];
}
@end
+548
View File
@@ -0,0 +1,548 @@
#include "../CoreGraphics/CGGeometry.h"
var _CPMenuWindowPool = [],
_CPMenuWindowPoolCapacity = 5,
_CPMenuWindowBackgroundColors = [];
_CPMenuWindowMenuBarBackgroundStyle = 0;
_CPMenuWindowPopUpBackgroundStyle = 1;
_CPMenuWindowAttachedMenuBackgroundStyle = 2;
var STICKY_TIME_INTERVAL = 500,
TOP_MARGIN = 5.0,
LEFT_MARGIN = 1.0,
RIGHT_MARGIN = 1.0,
BOTTOM_MARGIN = 5.0,
SCROLL_INDICATOR_HEIGHT = 16.0;
/*
@ignore
*/
@implementation _CPMenuWindow : CPWindow
{
_CPMenuView _menuView;
CPClipView _menuClipView;
CPImageView _moreAboveView;
CPImageView _moreBelowView;
CGRect _unconstrainedFrame;
CGRect _constraintRect;
}
+ (id)menuWindowWithMenu:(CPMenu)aMenu font:(CPFont)aFont
{
var menuWindow = nil;
if (_CPMenuWindowPool.length)
{
menuWindow = _CPMenuWindowPool.pop();
// Do this so that coordinates will be accurate.
[menuWindow setFrameOrigin:CGPointMakeZero()];
}
else
menuWindow = [[_CPMenuWindow alloc] init];
[menuWindow setFont:aFont];
[menuWindow setMenu:aMenu];
[menuWindow setMinWidth:[aMenu minimumWidth]];
return menuWindow;
}
+ (void)poolMenuWindow:(_CPMenuWindow)aMenuWindow
{
if (!aMenuWindow || _CPMenuWindowPool.length >= _CPMenuWindowPoolCapacity)
return;
_CPMenuWindowPool.push(aMenuWindow);
}
+ (void)initialize
{
if (self != [_CPMenuWindow class])
return;
var bundle = [CPBundle bundleForClass:self];
_CPMenuWindowMoreAboveImage = [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"_CPMenuWindow/_CPMenuWindowMoreAbove.png"] size:CGSizeMake(38.0, 18.0)];
_CPMenuWindowMoreBelowImage = [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"_CPMenuWindow/_CPMenuWindowMoreBelow.png"] size:CGSizeMake(38.0, 18.0)];
}
- (id)initWithContentRect:(CGRect)aRect styleMask:(unsigned)aStyleMask
{
_constraintRect = _CGRectMakeZero();
_unconstrainedFrame = _CGRectMakeZero();
self = [super initWithContentRect:aRect styleMask:CPBorderlessWindowMask];
if (self)
{
[self setLevel:CPPopUpMenuWindowLevel];
[self setHasShadow:YES];
[self setShadowStyle:CPMenuWindowShadowStyle];
[self setAcceptsMouseMovedEvents:YES];
var contentView = [self contentView];
_menuView = [[_CPMenuView alloc] initWithFrame:CGRectMakeZero()];
_menuClipView = [[CPClipView alloc] initWithFrame:CGRectMake(LEFT_MARGIN, TOP_MARGIN, 0.0, 0.0)];
[_menuClipView setDocumentView:_menuView];
[contentView addSubview:_menuClipView];
_moreAboveView = [[CPImageView alloc] initWithFrame:CGRectMakeZero()];
[_moreAboveView setImage:_CPMenuWindowMoreAboveImage];
[_moreAboveView setFrameSize:[_CPMenuWindowMoreAboveImage size]];
[contentView addSubview:_moreAboveView];
_moreBelowView = [[CPImageView alloc] initWithFrame:CGRectMakeZero()];
[_moreBelowView setImage:_CPMenuWindowMoreBelowImage];
[_moreBelowView setFrameSize:[_CPMenuWindowMoreBelowImage size]];
[contentView addSubview:_moreBelowView];
[self setShadowStyle:CPWindowShadowStyleMenu];
}
return self;
}
+ (float)_standardLeftMargin
{
return LEFT_MARGIN;
}
- (void)setFont:(CPFont)aFont
{
[_menuView setFont:aFont];
}
- (CPFont)font
{
return [_menuView font];
}
+ (CPColor)backgroundColorForBackgroundStyle:(_CPMenuWindowBackgroundStyle)aBackgroundStyle
{
var color = _CPMenuWindowBackgroundColors[aBackgroundStyle];
if (!color)
{
var bundle = [CPBundle bundleForClass:[self class]];
if (aBackgroundStyle == _CPMenuWindowPopUpBackgroundStyle)
color = [CPColor colorWithPatternImage:[[CPNinePartImage alloc] initWithImageSlices:
[
[[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"_CPMenuWindow/_CPMenuWindowRounded0.png"] size:CGSizeMake(4.0, 4.0)],
[[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"_CPMenuWindow/_CPMenuWindow1.png"] size:CGSizeMake(1.0, 4.0)],
[[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"_CPMenuWindow/_CPMenuWindowRounded2.png"] size:CGSizeMake(4.0, 4.0)],
[[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"_CPMenuWindow/_CPMenuWindow3.png"] size:CGSizeMake(4.0, 1.0)],
[[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"_CPMenuWindow/_CPMenuWindow4.png"] size:CGSizeMake(1.0, 1.0)],
[[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"_CPMenuWindow/_CPMenuWindow5.png"] size:CGSizeMake(4.0, 1.0)],
[[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"_CPMenuWindow/_CPMenuWindowRounded6.png"] size:CGSizeMake(4.0, 4.0)],
[[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"_CPMenuWindow/_CPMenuWindow7.png"] size:CGSizeMake(1.0, 4.0)],
[[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"_CPMenuWindow/_CPMenuWindowRounded8.png"] size:CGSizeMake(4.0, 4.0)]
]]];
else if (aBackgroundStyle == _CPMenuWindowMenuBarBackgroundStyle)
color = [CPColor colorWithPatternImage:[[CPNinePartImage alloc] initWithImageSlices:
[
[[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"_CPMenuWindow/_CPMenuWindow3.png"] size:CGSizeMake(4.0, 0.0)],
[[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"_CPMenuWindow/_CPMenuWindow4.png"] size:CGSizeMake(1.0, 0.0)],
[[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"_CPMenuWindow/_CPMenuWindow5.png"] size:CGSizeMake(4.0, 0.0)],
[[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"_CPMenuWindow/_CPMenuWindow3.png"] size:CGSizeMake(4.0, 1.0)],
[[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"_CPMenuWindow/_CPMenuWindow4.png"] size:CGSizeMake(1.0, 1.0)],
[[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"_CPMenuWindow/_CPMenuWindow5.png"] size:CGSizeMake(4.0, 1.0)],
[[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"_CPMenuWindow/_CPMenuWindowRounded6.png"] size:CGSizeMake(4.0, 4.0)],
[[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"_CPMenuWindow/_CPMenuWindow7.png"] size:CGSizeMake(1.0, 4.0)],
[[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"_CPMenuWindow/_CPMenuWindowRounded8.png"] size:CGSizeMake(4.0, 4.0)]
]]];
_CPMenuWindowBackgroundColors[aBackgroundStyle] = color;
}
return color;
}
- (void)setBackgroundStyle:(_CPMenuWindowBackgroundStyle)aBackgroundStyle
{
[self setBackgroundColor:[[self class] backgroundColorForBackgroundStyle:aBackgroundStyle]];
}
- (void)setMenu:(CPMenu)aMenu
{
[aMenu _setMenuWindow:self];
[_menuView setMenu:aMenu];
var menuViewSize = [_menuView frame].size;
[self setFrameSize:CGSizeMake(LEFT_MARGIN + menuViewSize.width + RIGHT_MARGIN, TOP_MARGIN + menuViewSize.height + BOTTOM_MARGIN)];
[_menuView scrollPoint:CGPointMake(0.0, 0.0)];
[_menuClipView setFrame:CGRectMake(LEFT_MARGIN, TOP_MARGIN, menuViewSize.width, menuViewSize.height)];
}
- (void)setMinWidth:(float)aWidth
{
var size = [self unconstrainedFrame].size;
[self setFrameSize:CGSizeMake(MAX(size.width, aWidth), size.height)];
}
- (CPMenu)menu
{
return [_menuView menu];
}
- (void)orderFront:(id)aSender
{
[self setFrame:_unconstrainedFrame];
[super orderFront:aSender];
}
- (void)setConstraintRect:(CGRect)aRect
{
_constraintRect = aRect;
[self setFrame:_unconstrainedFrame];
}
- (CGRect)unconstrainedFrame
{
return _CGRectMakeCopy(_unconstrainedFrame);
}
// We need this because if not this will call setFrame: with -frame instead of -unconstrainedFrame, turning
// the constrained frame into the unconstrained frame.
- (void)setFrameOrigin:(CGPoint)aPoint
{
[super setFrame:_CGRectMake(aPoint.x, aPoint.y, _CGRectGetWidth(_unconstrainedFrame), _CGRectGetHeight(_unconstrainedFrame))];
}
- (void)setFrameSize:(CGSize)aSize
{
[super setFrame:_CGRectMake(_CGRectGetMinX(_unconstrainedFrame), _CGRectGetMinY(_unconstrainedFrame), aSize.width, aSize.height)];
}
- (void)setFrame:(CGRect)aFrame display:(BOOL)shouldDisplay animate:(BOOL)shouldAnimate
{
// FIXME: There are integral window issues with platform windows.
// FIXME: This gets called far too often.
_unconstrainedFrame = _CGRectMakeCopy(aFrame);
var constrainedFrame = CGRectIntersection(_unconstrainedFrame, _constraintRect);
// We don't want to simply intersect the visible frame and the unconstrained frame.
// We should be allowing as much of the width to fit as possible (pushing back and forward).
constrainedFrame.origin.x = CGRectGetMinX(_unconstrainedFrame);
constrainedFrame.size.width = CGRectGetWidth(_unconstrainedFrame);
if (CGRectGetWidth(constrainedFrame) > CGRectGetWidth(_constraintRect))
constrainedFrame.size.width = CGRectGetWidth(_constraintRect);
if (CGRectGetMaxX(constrainedFrame) > CGRectGetMaxX(_constraintRect))
constrainedFrame.origin.x -= CGRectGetMaxX(constrainedFrame) - CGRectGetMaxX(_constraintRect);
if (CGRectGetMinX(constrainedFrame) < CGRectGetMinX(_constraintRect))
constrainedFrame.origin.x = CGRectGetMinX(_constraintRect);
[super setFrame:constrainedFrame display:shouldDisplay animate:shouldAnimate];
// This needs to happen before changing the frame.
var menuViewOrigin = CGPointMake(CGRectGetMinX(aFrame) + LEFT_MARGIN, CGRectGetMinY(aFrame) + TOP_MARGIN),
moreAbove = menuViewOrigin.y < CGRectGetMinY(constrainedFrame) + TOP_MARGIN,
moreBelow = menuViewOrigin.y + CGRectGetHeight([_menuView frame]) > CGRectGetMaxY(constrainedFrame) - BOTTOM_MARGIN,
topMargin = TOP_MARGIN,
bottomMargin = BOTTOM_MARGIN,
contentView = [self contentView],
bounds = [contentView bounds];
if (moreAbove)
{
topMargin += SCROLL_INDICATOR_HEIGHT;
var frame = [_moreAboveView frame];
[_moreAboveView setFrameOrigin:CGPointMake((CGRectGetWidth(bounds) - CGRectGetWidth(frame)) / 2.0, (TOP_MARGIN + SCROLL_INDICATOR_HEIGHT - CGRectGetHeight(frame)) / 2.0)];
}
[_moreAboveView setHidden:!moreAbove];
if (moreBelow)
{
bottomMargin += SCROLL_INDICATOR_HEIGHT;
[_moreBelowView setFrameOrigin:CGPointMake((CGRectGetWidth(bounds) - CGRectGetWidth([_moreBelowView frame])) / 2.0, CGRectGetHeight(bounds) - SCROLL_INDICATOR_HEIGHT - BOTTOM_MARGIN)];
}
[_moreBelowView setHidden:!moreBelow];
var clipFrame = CGRectMake(LEFT_MARGIN, topMargin, CGRectGetWidth(constrainedFrame) - LEFT_MARGIN - RIGHT_MARGIN, CGRectGetHeight(constrainedFrame) - topMargin - bottomMargin)
[_menuClipView setFrame:clipFrame];
[_menuView setFrameSize:CGSizeMake(CGRectGetWidth(clipFrame), CGRectGetHeight([_menuView frame]))];
[_menuView scrollPoint:CGPointMake(0.0, [self convertBaseToGlobal:clipFrame.origin].y - menuViewOrigin.y)];
}
- (BOOL)hasMinimumNumberOfVisibleItems
{
var visibleRect = [_menuView visibleRect];
// Clearly if the entire view isn't visible the minimum won't be visible.
if (CGRectIsEmpty(visibleRect))
return NO;
var numberOfUnhiddenItems = [_menuView numberOfUnhiddenItems],
minimumNumberOfVisibleItems = MIN(numberOfUnhiddenItems, 3),
count = 0,
index = [_menuView itemIndexAtPoint:[_menuView convertPoint:[_menuClipView frame].origin fromView:nil]];
for (; index < numberOfUnhiddenItems && count < minimumNumberOfVisibleItems; ++index)
{
var itemRect = [_menuView rectForUnhiddenItemAtIndex:index],
visibleItemRect = CGRectIntersection(visibleRect, itemRect);
// As soon as we get to the first unhidden item that is no longer visible, stop.
if (CGRectIsEmpty(visibleItemRect))
break;
// If the item is *completely* visible, count it.
if (CGRectEqualToRect(visibleItemRect, itemRect))
++count;
}
return count >= minimumNumberOfVisibleItems;
}
- (BOOL)canScrollUp
{
return ![_moreAboveView isHidden];
}
- (BOOL)canScrollDown
{
return ![_moreBelowView isHidden];
}
- (BOOL)canScroll
{
return [self canScrollUp] || [self canScrollDown];
}
- (void)scrollUp
{
if (CGRectGetMinY(_unconstrainedFrame) >= CGRectGetMinY(_constraintRect))
return;
_unconstrainedFrame.origin.y += 10;
[self setFrame:_unconstrainedFrame];
}
- (void)scrollDown
{
if (CGRectGetMaxY(_unconstrainedFrame) <= CGRectGetHeight(_constraintRect))
return;
_unconstrainedFrame.origin.y -= 10;
[self setFrame:_unconstrainedFrame];
}
@end
@implementation _CPMenuWindow (CPMenuContainer)
- (CGRect)globalFrame
{
return [self frame];
}
- (BOOL)isMenuBar
{
return NO;
}
- (_CPManagerScrollingState)scrollingStateForPoint:(CGPoint)aGlobalLocation
{
var frame = [self frame];
if (![self canScroll])
return _CPMenuManagerScrollingStateNone;
// If we're at or above of the top scroll indicator...
if (aGlobalLocation.y < CGRectGetMinY(frame) + TOP_MARGIN + SCROLL_INDICATOR_HEIGHT)
return _CPMenuManagerScrollingStateUp;
// If we're at or below the bottom scroll indicator...
if (aGlobalLocation.y > CGRectGetMaxY(frame) - BOTTOM_MARGIN - SCROLL_INDICATOR_HEIGHT)
return _CPMenuManagerScrollingStateDown;
return _CPMenuManagerScrollingStateNone;
}
- (float)deltaYForItemAtIndex:(int)anIndex
{
return TOP_MARGIN + CGRectGetMinY([_menuView rectForItemAtIndex:anIndex]);
}
- (CGPoint)rectForItemAtIndex:(int)anIndex
{
return [_menuView convertRect:[_menuView rectForItemAtIndex:anIndex] toView:nil];
}
- (int)itemIndexAtPoint:(CGPoint)aPoint
{
// Don't return indexes of items that aren't visible.
if (!CGRectContainsPoint([_menuClipView bounds], [_menuClipView convertPoint:aPoint fromView:nil]))
return NO;
return [_menuView itemIndexAtPoint:[_menuView convertPoint:aPoint fromView:nil]];
}
@end
/*
@ignore
*/
@implementation _CPMenuView : CPView
{
CPArray _menuItemViews;
CPArray _visibleMenuItemInfos;
CPFont _font @accessors(property=font);
}
- (unsigned)numberOfUnhiddenItems
{
return _visibleMenuItemInfos.length;
}
- (CGRect)rectForUnhiddenItemAtIndex:(int)anIndex
{
return [self rectForItemAtIndex:_visibleMenuItemInfos[anIndex].index];
}
- (CGRect)rectForItemAtIndex:(int)anIndex
{
return [_menuItemViews[anIndex === CPNotFound ? 0 : anIndex] frame];
}
- (int)itemIndexAtPoint:(CGPoint)aPoint
{
var x = aPoint.x,
bounds = [self bounds];
if (x < CGRectGetMinX(bounds) || x > CGRectGetMaxX(bounds))
return CPNotFound;
var y = aPoint.y,
low = 0,
high = _visibleMenuItemInfos.length - 1;
while (low <= high)
{
var middle = FLOOR(low + (high - low) / 2),
info = _visibleMenuItemInfos[middle]
frame = [info.view frame];
if (y < CGRectGetMinY(frame))
high = middle - 1;
else if (y > CGRectGetMaxY(frame))
low = middle + 1;
else
return info.index;
}
return CPNotFound;
}
- (void)tile
{
[_menuItemViews makeObjectsPerformSelector:@selector(removeFromSuperview)];
_menuItemViews = [];
_visibleMenuItemInfos = [];
var menu = [self menu];
if (!menu)
return;
var items = [menu itemArray],
index = 0,
count = [items count],
maxWidth = 0,
y = 0,
showsStateColumn = [menu showsStateColumn];
for (; index < count; ++index)
{
var item = items[index],
view = [item _menuItemView];
_menuItemViews.push(view);
if ([item isHidden])
continue;
_visibleMenuItemInfos.push({ view:view, index:index });
[view setFont:_font];
[view setShowsStateColumn:showsStateColumn];
[view synchronizeWithMenuItem];
[view setFrameOrigin:CGPointMake(0.0, y)];
[self addSubview:view];
var size = [view minSize],
width = size.width;
if (maxWidth < width)
maxWidth = width;
y += size.height;
}
for (index = 0; index < count; ++index)
{
var view = _menuItemViews[index];
[view setFrameSize:CGSizeMake(maxWidth, CGRectGetHeight([view frame]))];
}
[self setAutoresizesSubviews:NO];
[self setFrameSize:CGSizeMake(maxWidth, y)];
[self setAutoresizesSubviews:YES];
}
- (void)setMenu:(CPMenu)aMenu
{
[super setMenu:aMenu];
[self tile];
}
@end
File diff suppressed because it is too large Load Diff
+235
View File
@@ -0,0 +1,235 @@
var HORIZONTAL_MARGIN = 8.0,
SUBMENU_INDICATOR_MARGIN = 3.0,
VERTICAL_MARGIN = 4.0;
var SelectionColor = nil,
SUBMENU_INDICATOR_COLOR = nil,
_CPMenuItemSelectionColor = nil,
_CPMenuItemTextShadowColor = nil,
_CPMenuItemDefaultStateImages = [],
_CPMenuItemDefaultStateHighlightedImages = [];
@implementation _CPMenuItemMenuBarView : CPView
{
CPMenuItem _menuItem @accessors(property=menuItem);
CPFont _font;
CPColor _textColor;
CPColor _textShadowColor;
BOOL _isDirty;
_CPImageAndTextView _imageAndTextView;
CPView _submenuIndicatorView;
}
+ (void)initialize
{
if (self !== [_CPMenuItemMenuBarView class])
return;
var bundle = [CPBundle bundleForClass:self];
SelectionColor = [CPColor colorWithPatternImage:[[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"_CPMenuBarWindow/_CPMenuBarWindowBackgroundSelected.png"] size:CGSizeMake(1.0, 28.0)]];
SUBMENU_INDICATOR_COLOR = [CPColor grayColor];
_CPMenuItemSelectionColor = [CPColor colorWithCalibratedRed:95.0 / 255.0 green:131.0 / 255.0 blue:185.0 / 255.0 alpha:1.0];
_CPMenuItemTextShadowColor = [CPColor colorWithCalibratedRed:26.0 / 255.0 green: 73.0 / 255.0 blue:109.0 / 255.0 alpha:1.0];
_CPMenuItemDefaultStateImages[CPOffState] = nil;
_CPMenuItemDefaultStateHighlightedImages[CPOffState] = nil;
_CPMenuItemDefaultStateImages[CPOnState] = [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPMenuItem/CPMenuItemOnState.png"] size:CGSizeMake(14.0, 14.0)];
_CPMenuItemDefaultStateHighlightedImages[CPOnState] = [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPMenuItem/CPMenuItemOnStateHighlighted.png"] size:CGSizeMake(14.0, 14.0)];
_CPMenuItemDefaultStateImages[CPMixedState] = nil;
_CPMenuItemDefaultStateHighlightedImages[CPMixedState] = nil;
}
+ (id)view
{
return [[self alloc] init];
}
- (id)initWithFrame:(CGRect)aFrame
{
self = [super initWithFrame:aFrame];
if (self)
{
_imageAndTextView = [[_CPImageAndTextView alloc] initWithFrame:CGRectMake(HORIZONTAL_MARGIN, 0.0, 0.0, 0.0)];
[_imageAndTextView setImagePosition:CPImageLeft];
[_imageAndTextView setTextShadowOffset:CGSizeMake(0.0, 1.0)];
[_imageAndTextView setAutoresizingMask:CPViewMinYMargin | CPViewMaxYMargin];
[self addSubview:_imageAndTextView];
_submenuIndicatorView = [[_CPMenuItemMenuBarSubmenuIndicatorView alloc] initWithFrame:CGRectMake(0.0, 0.0, 9.0, 6.0)];
[_submenuIndicatorView setAutoresizingMask:CPViewMinYMargin | CPViewMaxYMargin];
[self addSubview:_submenuIndicatorView];
[self setAutoresizingMask:CPViewWidthSizable | CPViewHeightSizable];
}
return self;
}
- (CPColor)textColor
{
if (![_menuItem isEnabled])
return [CPColor lightGrayColor];
return _textColor || [CPColor colorWithCalibratedRed:70.0 / 255.0 green:69.0 / 255.0 blue:69.0 / 255.0 alpha:1.0];
}
- (CPColor)textShadowColor
{
if (![_menuItem isEnabled])
return [CPColor colorWithWhite:0.8 alpha:0.8];
return _textShadowColor || [CPColor colorWithWhite:1.0 alpha:0.8];
}
- (void)update
{
var x = HORIZONTAL_MARGIN,
height = 0.0;
[_imageAndTextView setFont:[_menuItem font] || [_CPMenuBarWindow font]];
[_imageAndTextView setVerticalAlignment:CPCenterVerticalTextAlignment];
[_imageAndTextView setImage:[_menuItem image]];
[_imageAndTextView setText:[_menuItem title]];
[_imageAndTextView setTextColor:[self textColor]];
[_imageAndTextView setTextShadowColor:[self textShadowColor]];
[_imageAndTextView setTextShadowOffset:CGSizeMake(0.0, 1.0)];
[_imageAndTextView sizeToFit];
var imageAndTextViewFrame = [_imageAndTextView frame];
imageAndTextViewFrame.origin.x = x;
x += CGRectGetWidth(imageAndTextViewFrame);
height = MAX(height, CGRectGetHeight(imageAndTextViewFrame));
var hasSubmenuIndicator = [_menuItem hasSubmenu] && [_menuItem action];
if (hasSubmenuIndicator)
{
[_submenuIndicatorView setHidden:NO];
[_submenuIndicatorView setColor:[self textColor]];
[_submenuIndicatorView setShadowColor:[self textShadowColor]];
var submenuViewFrame = [_submenuIndicatorView frame];
submenuViewFrame.origin.x = x + SUBMENU_INDICATOR_MARGIN;
x = CGRectGetMaxX(submenuViewFrame);
height = MAX(height, CGRectGetHeight(submenuViewFrame));
}
else
[_submenuIndicatorView setHidden:YES];
height += 2.0 * VERTICAL_MARGIN;
imageAndTextViewFrame.origin.y = FLOOR((height - CGRectGetHeight(imageAndTextViewFrame)) / 2.0);
[_imageAndTextView setFrame:imageAndTextViewFrame];
if (hasSubmenuIndicator)
{
submenuViewFrame.origin.y = FLOOR((height - CGRectGetHeight(submenuViewFrame)) / 2.0) + 1.0;
[_submenuIndicatorView setFrame:submenuViewFrame];
}
_minSize = CGSizeMake(x + HORIZONTAL_MARGIN, height);
[self setAutoresizesSubviews:NO];
[self setFrameSize:_minSize];
[self setAutoresizesSubviews:YES];
}
- (void)highlight:(BOOL)shouldHighlight
{
// FIXME: This should probably be even throw.
if (![_menuItem isEnabled])
shouldHighlight = NO;
if (shouldHighlight)
{
if (![_menuItem _isMenuBarButton])
[self setBackgroundColor:SelectionColor];
[_imageAndTextView setImage:[_menuItem alternateImage] || [_menuItem image]];
[_imageAndTextView setTextColor:[CPColor whiteColor]];
[_imageAndTextView setTextShadowColor:_CPMenuItemTextShadowColor];
[_submenuIndicatorView setColor:[CPColor whiteColor]];
[_submenuIndicatorView setShadowColor:[CPColor colorWithWhite:0.1 alpha:0.7]];
}
else
{
[self setBackgroundColor:nil];
[_imageAndTextView setImage:[_menuItem image]];
[_imageAndTextView setTextColor:[self textColor]];
[_imageAndTextView setTextShadowColor:[self textShadowColor]];
[_submenuIndicatorView setColor:[self textColor]];
[_submenuIndicatorView setShadowColor:[self textShadowColor]];
}
}
@end
@implementation _CPMenuItemMenuBarSubmenuIndicatorView : CPView
{
CPColor _color;
CPColor _shadowColor;
}
- (void)setColor:(CPColor)aColor
{
if (_color === aColor)
return;
_color = aColor;
[self setNeedsDisplay:YES];
}
- (void)setShadowColor:(CPColor)aColor
{
if (_shadowColor === aColor)
return;
_shadowColor = aColor;
[self setNeedsDisplay:YES];
}
- (void)drawRect:(CGRect)aRect
{
var context = [[CPGraphicsContext currentContext] graphicsPort],
bounds = [self bounds];
bounds.size.height -= 1.0;
bounds.size.width -= 2.0;
bounds.origin.x += 1.0;
CGContextBeginPath(context);
CGContextMoveToPoint(context, CGRectGetMinX(bounds), CGRectGetMinY(bounds));
CGContextAddLineToPoint(context, CGRectGetMaxX(bounds), CGRectGetMinY(bounds));
CGContextAddLineToPoint(context, CGRectGetMidX(bounds), CGRectGetMaxY(bounds));
CGContextClosePath(context);
CGContextSetShadowWithColor(context, CGSizeMake(0.0, 1.0), 1.1, _shadowColor);
CGContextSetFillColor(context, _color);
CGContextFillPath(context);
}
@end
@@ -0,0 +1,38 @@
@import <AppKit/CPView.j>
@implementation _CPMenuItemSeparatorView : CPView
{
}
+ (id)view
{
return [[self alloc] initWithFrame:CGRectMake(0.0, 0.0, 0.0, 10.0)];
}
- (id)initWithFrame:(CGRect)aFrame
{
self = [super initWithFrame:aFrame];
if (self)
[self setAutoresizingMask:CPViewWidthSizable];
return self;
}
- (void)drawRect:(CGRect)aRect
{
var context = [[CPGraphicsContext currentContext] graphicsPort],
bounds = [self bounds];
CGContextBeginPath(context);
CGContextMoveToPoint(context, CGRectGetMinX(bounds), FLOOR(CGRectGetMidY(bounds)) - 0.5);
CGContextAddLineToPoint(context, CGRectGetMaxX(bounds), FLOOR(CGRectGetMidY(bounds)) - 0.5);
CGContextSetStrokeColor(context, [CPColor lightGrayColor]);
CGContextStrokePath(context);
}
@end
+300
View File
@@ -0,0 +1,300 @@
var LEFT_MARGIN = 3.0,
RIGHT_MARGIN = 14.0 + 3.0,
STATE_COLUMN_WIDTH = 14.0,
INDENTATION_WIDTH = 17.0,
VERTICAL_MARGIN = 4.0,
RIGHT_COLUMNS_MARGIN = 30.0,
KEY_EQUIVALENT_MARGIN = 10.0;
var SUBMENU_INDICATOR_COLOR = nil,
_CPMenuItemSelectionColor = nil,
_CPMenuItemTextShadowColor = nil,
_CPMenuItemDefaultStateImages = [],
_CPMenuItemDefaultStateHighlightedImages = [];
@implementation _CPMenuItemStandardView : CPView
{
CPMenuItem _menuItem @accessors(property=menuItem);
CPFont _font;
CPColor _textColor;
CPColor _textShadowColor;
CGSize _minSize @accessors(readonly, property=minSize);
BOOL _isDirty;
CPImageView _stateView;
_CPImageAndTextView _imageAndTextView;
_CPImageAndTextView _keyEquivalentView;
CPView _submenuIndicatorView;
}
+ (void)initialize
{
if (self !== [_CPMenuItemStandardView class])
return;
SUBMENU_INDICATOR_COLOR = [CPColor grayColor];
_CPMenuItemSelectionColor = [CPColor colorWithCalibratedRed:95.0 / 255.0 green:131.0 / 255.0 blue:185.0 / 255.0 alpha:1.0];
_CPMenuItemTextShadowColor = [CPColor colorWithCalibratedRed:26.0 / 255.0 green: 73.0 / 255.0 blue:109.0 / 255.0 alpha:1.0]
var bundle = [CPBundle bundleForClass:self];
_CPMenuItemDefaultStateImages[CPOffState] = nil;
_CPMenuItemDefaultStateHighlightedImages[CPOffState] = nil;
_CPMenuItemDefaultStateImages[CPOnState] = [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPMenuItem/CPMenuItemOnState.png"] size:CGSizeMake(14.0, 14.0)];
_CPMenuItemDefaultStateHighlightedImages[CPOnState] = [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPMenuItem/CPMenuItemOnStateHighlighted.png"] size:CGSizeMake(14.0, 14.0)];
_CPMenuItemDefaultStateImages[CPMixedState] = nil;
_CPMenuItemDefaultStateHighlightedImages[CPMixedState] = nil;
}
+ (id)view
{
return [[self alloc] init];
}
+ (float)_standardLeftMargin
{
return LEFT_MARGIN + STATE_COLUMN_WIDTH;
}
- (id)initWithFrame:(CGRect)aFrame
{
self = [super initWithFrame:aFrame];
if (self)
{
_stateView = [[CPImageView alloc] initWithFrame:CGRectMake(0.0, 0.0, 0.0, 0.0)];
[_stateView setImageScaling:CPScaleNone];
[self addSubview:_stateView];
_imageAndTextView = [[_CPImageAndTextView alloc] initWithFrame:CGRectMake(0.0, 0.0, 0.0, 0.0)];
[_imageAndTextView setImagePosition:CPImageLeft];
[_imageAndTextView setTextShadowOffset:CGSizeMake(0.0, 1.0)];
[self addSubview:_imageAndTextView];
_keyEquivalentView = [[_CPImageAndTextView alloc] initWithFrame:CGRectMake(0.0, 0.0, 0.0, 0.0)];
[_keyEquivalentView setImagePosition:CPNoImage];
[_keyEquivalentView setTextShadowOffset:CGSizeMake(0.0, 1.0)];
[_keyEquivalentView setAutoresizingMask:CPViewMinXMargin];
[self addSubview:_keyEquivalentView];
_submenuIndicatorView = [[_CPMenuItemSubmenuIndicatorView alloc] initWithFrame:CGRectMake(0.0, 0.0, 8.0, 10.0)];
[_submenuIndicatorView setColor:SUBMENU_INDICATOR_COLOR];
[_submenuIndicatorView setAutoresizingMask:CPViewMinXMargin];
[self addSubview:_submenuIndicatorView];
[self setAutoresizingMask:CPViewWidthSizable];
}
return self;
}
- (CPColor)textColor
{
if (![_menuItem isEnabled])
return [CPColor lightGrayColor];
return _textColor || [CPColor colorWithCalibratedRed:70.0 / 255.0 green:69.0 / 255.0 blue:69.0 / 255.0 alpha:1.0];
}
- (CPColor)textShadowColor
{
if (![_menuItem isEnabled])
return nil;
return _textShadowColor || [CPColor colorWithWhite:1.0 alpha:0.8];
}
- (void)setFont:(CPFont)aFont
{
_font = aFont;
}
- (void)update
{
var x = LEFT_MARGIN + [_menuItem indentationLevel] * INDENTATION_WIDTH,
height = 0.0,
hasStateColumn = [[_menuItem menu] showsStateColumn];
if (hasStateColumn)
{
[_stateView setHidden:NO];
[_stateView setImage:_CPMenuItemDefaultStateImages[[_menuItem state]] || nil];
x += STATE_COLUMN_WIDTH;
}
else
[_stateView setHidden:YES];
[_imageAndTextView setFont:[_menuItem font] || _font];
[_imageAndTextView setVerticalAlignment:CPCenterVerticalTextAlignment];
[_imageAndTextView setImage:[_menuItem image]];
[_imageAndTextView setText:[_menuItem title]];
[_imageAndTextView setTextColor:[self textColor]];
[_imageAndTextView setTextShadowColor:[self textShadowColor]];
[_imageAndTextView setTextShadowOffset:CGSizeMake(0.0, 1.0)];
[_imageAndTextView sizeToFit];
var imageAndTextViewFrame = [_imageAndTextView frame];
imageAndTextViewFrame.origin.x = x;
x += CGRectGetWidth(imageAndTextViewFrame);
height = MAX(height, CGRectGetHeight(imageAndTextViewFrame));
var hasKeyEquivalent = !![_menuItem keyEquivalent],
hasSubmenu = [_menuItem hasSubmenu];
if (hasKeyEquivalent || hasSubmenu)
x += RIGHT_COLUMNS_MARGIN;
if (hasKeyEquivalent)
{
[_keyEquivalentView setFont:[_menuItem font] || _font];
[_keyEquivalentView setVerticalAlignment:CPCenterVerticalTextAlignment];
[_keyEquivalentView setImage:[_menuItem image]];
[_keyEquivalentView setText:[_menuItem keyEquivalentStringRepresentation]];
[_keyEquivalentView setTextColor:[self textColor]];
[_keyEquivalentView setTextShadowColor:[self textShadowColor]];
[_keyEquivalentView setTextShadowOffset:CGSizeMake(0, 1)];
[_keyEquivalentView setFrameOrigin:CGPointMake(x, VERTICAL_MARGIN)];
[_keyEquivalentView sizeToFit];
var keyEquivalentViewFrame = [_keyEquivalentView frame];
keyEquivalentViewFrame.origin.x = x;
x += CGRectGetWidth(keyEquivalentViewFrame);
height = MAX(height, CGRectGetHeight(keyEquivalentViewFrame));
if (hasSubmenu)
x += RIGHT_COLUMNS_MARGIN;
}
else
[_keyEquivalentView setHidden:YES];
if (hasSubmenu)
{
[_submenuIndicatorView setHidden:NO];
var submenuViewFrame = [_submenuIndicatorView frame];
submenuViewFrame.origin.x = x;
x += CGRectGetWidth(submenuViewFrame);
height = MAX(height, CGRectGetHeight(submenuViewFrame));
}
else
[_submenuIndicatorView setHidden:YES];
height += 2.0 * VERTICAL_MARGIN;
imageAndTextViewFrame.origin.y = FLOOR((height - CGRectGetHeight(imageAndTextViewFrame)) / 2.0);
[_imageAndTextView setFrame:imageAndTextViewFrame];
if (hasStateColumn)
[_stateView setFrameSize:CGSizeMake(STATE_COLUMN_WIDTH, height)];
if (hasKeyEquivalent)
{
keyEquivalentViewFrame.origin.y = FLOOR((height - CGRectGetHeight(keyEquivalentViewFrame)) / 2.0);
[_keyEquivalentView setFrame:keyEquivalentViewFrame];
}
if (hasSubmenu)
{
submenuViewFrame.origin.y = FLOOR((height - CGRectGetHeight(submenuViewFrame)) / 2.0);
[_submenuIndicatorView setFrame:submenuViewFrame];
}
_minSize = CGSizeMake(x + RIGHT_MARGIN, height);
[self setAutoresizesSubviews:NO];
[self setFrameSize:_minSize];
[self setAutoresizesSubviews:YES];
}
- (void)highlight:(BOOL)shouldHighlight
{
// FIXME: This should probably be even throw.
if (![_menuItem isEnabled])
return;
if (shouldHighlight)
{
[self setBackgroundColor:_CPMenuItemSelectionColor];
[_imageAndTextView setImage:[_menuItem alternateImage] || [_menuItem image]];
[_imageAndTextView setTextColor:[CPColor whiteColor]];
[_keyEquivalentView setTextColor:[CPColor whiteColor]];
[_submenuIndicatorView setColor:[CPColor whiteColor]];
[_imageAndTextView setTextShadowColor:_CPMenuItemTextShadowColor];
[_keyEquivalentView setTextShadowColor:_CPMenuItemTextShadowColor];
}
else
{
[self setBackgroundColor:nil];
[_imageAndTextView setImage:[_menuItem image]];
[_imageAndTextView setTextColor:[self textColor]];
[_keyEquivalentView setTextColor:[self textColor]];
[_submenuIndicatorView setColor:SUBMENU_INDICATOR_COLOR];
[_imageAndTextView setTextShadowColor:[self textShadowColor]];
[_keyEquivalentView setTextShadowColor:[self textShadowColor]];
}
if (shouldHighlight)
[_stateView setImage:_CPMenuItemDefaultStateHighlightedImages[[_menuItem state]] || nil];
else
[_stateView setImage:_CPMenuItemDefaultStateImages[[_menuItem state]] || nil];
}
@end
@implementation _CPMenuItemSubmenuIndicatorView : CPView
{
CPColor _color;
}
- (void)setColor:(CPColor)aColor
{
if (_color === aColor)
return;
_color = aColor;
[self setNeedsDisplay:YES];
}
- (void)drawRect:(CGRect)aRect
{
var context = [[CPGraphicsContext currentContext] graphicsPort],
bounds = [self bounds];
CGContextBeginPath(context);
CGContextMoveToPoint(context, CGRectGetMinX(bounds), CGRectGetMinY(bounds));
CGContextAddLineToPoint(context, CGRectGetMaxX(bounds), CGRectGetMidY(bounds));
CGContextAddLineToPoint(context, CGRectGetMinX(bounds), CGRectGetMaxY(bounds));
CGContextClosePath(context);
CGContextSetFillColor(context, _color);
CGContextFillPath(context);
}
@end
+255
View File
@@ -0,0 +1,255 @@
@import "_CPMenuItemSeparatorView.j"
@import "_CPMenuItemStandardView.j"
@import "_CPMenuItemMenuBarView.j"
var LEFT_MARGIN = 3.0,
RIGHT_MARGIN = 16.0,
STATE_COLUMN_WIDTH = 14.0,
INDENTATION_WIDTH = 17.0,
VERTICAL_MARGIN = 4.0;
var _CPMenuItemSelectionColor = nil,
_CPMenuItemTextShadowColor = nil,
_CPMenuItemDefaultStateImages = [],
_CPMenuItemDefaultStateHighlightedImages = [];
/*
@ignore
*/
@implementation _CPMenuItemView : CPView
{
CPMenuItem _menuItem;
CPView _view;
CPFont _font;
CPColor _textColor;
CPColor _textShadowColor;
CGSize _minSize;
BOOL _isDirty;
BOOL _showsStateColumn;
CPImageView _stateView;
_CPImageAndTextView _imageAndTextView;
CPView _submenuView;
}
+ (void)initialize
{
if (self != [_CPMenuItemView class])
return;
_CPMenuItemSelectionColor = [CPColor colorWithCalibratedRed:95.0 / 255.0 green:131.0 / 255.0 blue:185.0 / 255.0 alpha:1.0];
_CPMenuItemTextShadowColor = [CPColor colorWithCalibratedRed:26.0 / 255.0 green: 73.0 / 255.0 blue:109.0 / 255.0 alpha:1.0]
var bundle = [CPBundle bundleForClass:self];
_CPMenuItemDefaultStateImages[CPOffState] = nil;
_CPMenuItemDefaultStateHighlightedImages[CPOffState] = nil;
_CPMenuItemDefaultStateImages[CPOnState] = [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPMenuItem/CPMenuItemOnState.png"] size:CGSizeMake(14.0, 14.0)];
_CPMenuItemDefaultStateHighlightedImages[CPOnState] = [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPMenuItem/CPMenuItemOnStateHighlighted.png"] size:CGSizeMake(14.0, 14.0)];
_CPMenuItemDefaultStateImages[CPMixedState] = nil;
_CPMenuItemDefaultStateHighlightedImages[CPMixedState] = nil;
}
+ (float)leftMargin
{
return LEFT_MARGIN + STATE_COLUMN_WIDTH;
}
- (id)initWithFrame:(CGRect)aFrame forMenuItem:(CPMenuItem)aMenuItem
{
self = [super initWithFrame:aFrame];
if (self)
{
_menuItem = aMenuItem;
_showsStateColumn = YES;
_isDirty = YES;
[self setAutoresizingMask:CPViewWidthSizable];
[self synchronizeWithMenuItem];
}
return self;
}
- (CGSize)minSize
{
return _minSize;
}
- (void)setDirty
{
_isDirty = YES;
}
- (void)synchronizeWithMenuItem
{
var menuItemView = [_menuItem view];
if ([_menuItem isSeparatorItem])
{
if (![_view isKindOfClass:[_CPMenuItemSeparatorView class]])
{
[_view removeFromSuperview];
_view = [_CPMenuItemSeparatorView view];
}
}
else if (menuItemView)
{
if (_view !== menuItemView)
{
[_view removeFromSuperview];
_view = menuItemView;
}
}
else if ([_menuItem menu] == [CPApp mainMenu])
{
if (![_view isKindOfClass:[_CPMenuItemMenuBarView class]])
{
[_view removeFromSuperview];
_view = [_CPMenuItemMenuBarView view];
}
[_view setMenuItem:_menuItem];
}
else
{
if (![_view isKindOfClass:[_CPMenuItemStandardView class]])
{
[_view removeFromSuperview];
_view = [_CPMenuItemStandardView view];
}
[_view setMenuItem:_menuItem];
}
if ([_view superview] !== self)
[self addSubview:_view];
if ([_view respondsToSelector:@selector(update)])
[_view update];
_minSize = [_view frame].size;
[self setAutoresizesSubviews:NO];
[self setFrameSize:_minSize];
[self setAutoresizesSubviews:YES];
}
- (void)setShowsStateColumn:(BOOL)shouldShowStateColumn
{
_showsStateColumn = shouldShowStateColumn;
}
- (void)highlight:(BOOL)shouldHighlight
{
if ([_view respondsToSelector:@selector(highlight:)])
[_view highlight:shouldHighlight];
}
- (BOOL)eventOnSubmenu:(CPEvent)anEvent
{
if (![_menuItem hasSubmenu])
return NO;
return CGRectContainsPoint([_submenuView frame], [self convertPoint:[anEvent locationInWindow] fromView:nil]);
}
- (BOOL)isHidden
{
return [_menuItem isHidden];
}
- (CPMenuItem)menuItem
{
return _menuItem;
}
- (void)setFont:(CPFont)aFont
{
if (_font === aFont)
return;
_font = aFont;
if ([_view respondsToSelector:@selector(setFont:)])
[_view setFont:aFont];
[self setDirty];
}
- (void)setTextColor:(CPColor)aColor
{
if (_textColor == aColor)
return;
_textColor = aColor;
[_imageAndTextView setTextColor:[self textColor]];
[_submenuView setColor:[self textColor]];
}
- (CPColor)textColor
{
return nil;
}
- (void)setTextShadowColor:(CPColor)aColor
{
if (_textShadowColor == aColor)
return;
_textShadowColor = aColor;
[_imageAndTextView setTextShadowColor:[self textShadowColor]];
//[_submenuView setColor:[self textColor]];
}
- (CPColor)textShadowColor
{
return [_menuItem isEnabled] ? (_textShadowColor ? _textShadowColor : [CPColor colorWithWhite:1.0 alpha:0.8]) : [CPColor colorWithWhite:0.8 alpha:0.8];
}
@end
@implementation _CPMenuItemArrowView : CPView
{
CPColor _color;
}
- (void)setColor:(CPColor)aColor
{
if (_color == aColor)
return;
_color = aColor;
[self setNeedsDisplay:YES];
}
- (void)drawRect:(CGRect)aRect
{
var context = [[CPGraphicsContext currentContext] graphicsPort];
CGContextBeginPath(context);
CGContextMoveToPoint(context, 1.0, 4.0);
CGContextAddLineToPoint(context, 9.0, 4.0);
CGContextAddLineToPoint(context, 5.0, 8.0);
CGContextAddLineToPoint(context, 1.0, 4.0);
CGContextClosePath(context);
CGContextSetFillColor(context, _color);
CGContextFillPath(context);
}
@end
+46
View File
@@ -0,0 +1,46 @@
@import <AppKit/CPPanel.j>
@implementation CPOpenPanel : CPPanel
{
BOOL _canChooseFiles @accessors(property=canChooseFiles);
BOOL _canChooseDirectories @accessors(property=canChooseDirectories);
BOOL _allowsMultipleSelection @accessors(property=allowsMultipleSelection);
CPURL _directoryURL @accessors(property=directoryURL);
CPArray _URLs;
}
+ (id)openPanel
{
return [[CPOpenPanel alloc] init];
}
- (CPInteger)runModal
{
if (typeof window["cpOpenPanel"] === "function")
{
// FIXME: Is this correct???
[[CPRunLoop currentRunLoop] limitDateForMode:CPDefaultRunLoopMode];
var options = { directoryURL: [self directoryURL],
canChooseFiles: [self canChooseFiles],
canChooseDirectories: [self canChooseDirectories],
allowsMultipleSelection: [self allowsMultipleSelection] };
var result = window.cpOpenPanel(options);
_URLs = result.URLs;
return result.button;
}
throw "-runModal is unimplemented.";
}
- (CPArray)URLs
{
return _URLs;
}
@end
+1021 -55
View File
File diff suppressed because it is too large Load Diff
+24 -14
View File
@@ -20,14 +20,17 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
import "CPWindow.j"
@import "CPWindow.j"
CPOKButton = 1;
CPCancelButton = 0;
/*
The <objj>CPPanel</objj> class defines objects that manage the panels of the Cappuccino user interface. A panel is a window that serves an auxiliary function within an application. It generally displays controls that the user can act on to give instructions to the application or to modify the contents of a standard window.</p>
/*!
@ingroup appkit
@class CPPanel
The CPPanel class defines objects that manage the panels of the Cappuccino user interface. A panel is a window that serves an auxiliary function within an application. It generally displays controls that the user can act on to give instructions to the application or to modify the contents of a standard window.</p>
<p>Panels behave differently from standard windows in only a small number of ways, but the ways are important to the user interface:</p>
@@ -43,23 +46,30 @@ CPCancelButton = 0;
<li>A panel can be made to work even when there's an attention panel on-screen. This permits actions within the panel to affect the attention panel.</li>
</ul>
*/
/*
@global
@class CPWindow
*/
CPDocModalWindowMask = 1 << 6;
@implementation CPPanel : CPWindow
{
BOOL _becomesKeyOnlyIfNeeded;
BOOL _worksWhenModal;
}
/*
Returns <code>YES</code> if the receiver is a floating panel (like a palette).
/*!
Returns \c YES if the receiver is a floating panel (like a palette).
*/
- (BOOL)isFloatingPanel
{
return [self level] == CPFloatingWindowLevel;
}
/*
Sets the receiver to be a floating panel. <code>YES</code>
makes the window a floating panel. <code>NO</code> makes it a normal window.
/*!
Sets the receiver to be a floating panel. \c YES
makes the window a floating panel. \c NO makes it a normal window.
@param isFloatingPanel specifies whether to make it floating
*/
- (void)setFloatingPanel:(BOOL)isFloatingPanel
@@ -67,18 +77,18 @@ CPCancelButton = 0;
[self setLevel:isFloatingPanel ? CPFloatingWindowLevel : CPNormalWindowLevel];
}
/*
Returns <code>YES</code> if the window only becomes key
if needed. <code>NO</code> means it behaves just like other windows.
/*!
Returns \c YES if the window only becomes key
if needed. \c NO means it behaves just like other windows.
*/
- (BOOL)becomesKeyOnlyIfNeeded
{
return _becomesKeyOnlyIfNeeded;
}
/*
/*!
Sets whether the the window becomes key only if needed.
@param shouldBecomeKeyOnlyIfNeeded <code>YES</code> makes the window become key only if needed
@param shouldBecomeKeyOnlyIfNeeded \c YES makes the window become key only if needed
*/
- (void)setBecomesKeyOnlyIfNeeded:(BOOL)shouldBecomeKeyOnlyIfNeeded
{
@@ -90,7 +100,7 @@ CPCancelButton = 0;
return _worksWhenModal;
}
/*
/*!
Sets whether this window can receive input while another window is running modally.
@param shouldWorkWhenModal whether to receive input while another window is modal
*/
+188 -39
View File
@@ -20,10 +20,12 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
import <Foundation/CPObject.j>
import <Foundation/CPArray.j>
import <Foundation/CPDictionary.j>
import <Foundation/CPPropertyListSerialization.j>
@import <Foundation/CPObject.j>
@import <Foundation/CPArray.j>
@import <Foundation/CPDictionary.j>
@import <Foundation/CPPropertyListSerialization.j>
#include "Platform/Platform.h"
CPGeneralPboard = @"CPGeneralPboard";
@@ -38,12 +40,23 @@ CPFontPboardType = @"CPFontPboardType";
CPHTMLPboardType = @"CPHTMLPboardType";
CPStringPboardType = @"CPStringPboardType";
CPURLPboardType = @"CPURLPboardType";
CPImagesPboardType = @"CPImagesPboardType";
CPVideosPboardType = @"CPVideosPboardType";
UTF8PboardType = @"public.utf8-plain-text";
// Deprecated
CPImagePboardType = @"CPImagePboardType";
var CPPasteboards = nil;
/*
<objj>CPPasteBoard</objj> is the object responsible for cut/copy/paste and drag&drop operations.
var CPPasteboards = nil,
supportsNativePasteboard = NO;
/*!
@ingroup appkit
@class CPPasteboard
CPPasteBoard is the object responsible for cut/copy/paste and drag&drop operations.
*/
@implementation CPPasteboard : CPObject
{
@@ -53,6 +66,8 @@ var CPPasteboards = nil;
unsigned _changeCount;
CPString _stateUID;
WebScriptObject _nativePasteboard;
}
/*
@@ -66,9 +81,12 @@ var CPPasteboards = nil;
[self setVersion:1.0];
CPPasteboards = [CPDictionary dictionary];
if (typeof window.cpPasteboardWithName !== "undefined")
supportsNativePasteboard = YES;
}
/*
/*!
Returns a new instance of a pasteboard
*/
+ (id)generalPasteboard
@@ -76,7 +94,7 @@ var CPPasteboards = nil;
return [CPPasteboard pasteboardWithName:CPGeneralPboard];
}
/*
/*!
Returns a pasteboard with the specified name. If the pasteboard doesn't exist, it will be created.
@param aName the name of the pasteboard
@return the requested pasteboard
@@ -84,7 +102,7 @@ var CPPasteboards = nil;
+ (id)pasteboardWithName:(CPString)aName
{
var pasteboard = [CPPasteboards objectForKey:aName];
if (pasteboard)
return pasteboard;
@@ -108,12 +126,18 @@ var CPPasteboards = nil;
_provided = [CPDictionary dictionary];
_changeCount = 0;
if (supportsNativePasteboard)
{
_nativePasteboard = window.cpPasteboardWithName(aName);
[self _synchronizePasteboard];
}
}
return self;
}
/*
/*!
Adds supported data types to the pasteboard
@param types the data types
@param anOwner the object that contains the data types
@@ -136,17 +160,32 @@ var CPPasteboards = nil;
[_owners setObject:anOwner forKey:type];
}
if (_nativePasteboard)
{
var nativeTypes = [types copy];
if ([types containsObject:CPStringPboardType])
nativeTypes.push(UTF8PboardType);
_nativePasteboard.addTypes_(nativeTypes);
}
return ++_changeCount;
}
/*
/*!
Sets the data types that this pasteboard will contain.
@param type the data types it will support
@param anOwner the object that contains the the data
@return the pasteboard's change count
*/
- (unsigned)declareTypes:(CPArray)types owner:(id)anOwner
{
[self _declareTypes:types owner:anOwner updateNativePasteboard:YES];
}
/*! @ignore */
- (unsigned)_declareTypes:(CPArray)types owner:(id)anOwner updateNativePasteboard:(BOOL)shouldUpdate
{
[_types setArray:types];
@@ -157,67 +196,80 @@ var CPPasteboards = nil;
while (count--)
[_owners setObject:anOwner forKey:_types[count]];
if (_nativePasteboard && shouldUpdate)
{
var nativeTypes = [types copy];
if ([types containsObject:CPStringPboardType])
nativeTypes.push(UTF8PboardType);
_nativePasteboard.declareTypes_(nativeTypes);
_changeCount = _nativePasteboard.changeCount();
}
return ++_changeCount;
}
/*
/*!
Sets the pasteboard data for the specified type
@param aData the data
@param aType the data type being set
@return <code>YES</code> if the data was successfully written to the pasteboard
@return \c YES if the data was successfully written to the pasteboard
*/
- (BOOL)setData:(CPData)aData forType:(CPString)aType
{
[_provided setObject:aData forKey:aType];
if (aType === CPStringPboardType)
[self setData:aData forType:UTF8PboardType];
return YES;
}
/*
/*!
Writes the specified property list as data for the specified type
@param aPropertyList the property list to write
@param aType the data type
@return <code>YES</code> if the property list was successfully written to the pasteboard
@return \c YES if the property list was successfully written to the pasteboard
*/
- (BOOL)setPropertyList:(id)aPropertyList forType:(CPString)aType
{
return [self setData:[CPPropertyListSerialization dataFromPropertyList:aPropertyList format:CPPropertyListXMLFormat_v1_0 errorDescription:nil] forType:aType];
return [self setData:[CPPropertyListSerialization dataFromPropertyList:aPropertyList format:CPPropertyList280NorthFormat_v1_0] forType:aType];
}
/*
/*!
Sets the specified string as data for the specified type
@param aString the string to write
@param aType the data type
@return <code>YES</code> if the string was successfully written to the pasteboard
@return \c YES if the string was successfully written to the pasteboard
*/
- (void)setString:(CPString)aString forType:(CPString)aType
{
return [self setPropertyList:aString forType:aType];
[self setPropertyList:aString forType:aType];
}
// Determining Types
/*
/*!
Checks the pasteboard's types for a match with the types listen in the specified array. The array should
be ordered by the requestor's most preferred data type first.
@param anArray an array of requested types ordered by preference
@return the highest match with the pasteboard's supported types or <code>nil</code> if no match was found
@return the highest match with the pasteboard's supported types or \c nil if no match was found
*/
- (CPString)availableTypeFromArray:(CPArray)anArray
{
return [_types firstObjectCommonWithArray:anArray];
return [[self types] firstObjectCommonWithArray:anArray];
}
/*
/*!
Returns the pasteboards supported types
*/
- (CPArray)types
{
[self _synchronizePasteboard];
return _types;
}
// Reading data
/*
/*!
Returns the number of changes that have occurred to this pasteboard
*/
- (unsigned)changeCount
@@ -225,10 +277,10 @@ var CPPasteboards = nil;
return _changeCount;
}
/*
/*!
Returns the pasteboard data for the specified data type
@param aType the requested data type
@return the requested data or <code>nil</code> if the data doesn't exist
@return the requested data or \c nil if the data doesn't exist
*/
- (CPData)dataForType:(CPString)aType
{
@@ -241,35 +293,65 @@ var CPPasteboards = nil;
if (owner)
{
[owner pasteboard:self provideDataForType:aType];
++_changeCount;
[owner pasteboard:self provideDataForType:aType];
return [_provided objectForKey:aType];
}
if (aType === CPStringPboardType)
return [self dataForType:UTF8PboardType];
return nil;
}
/*
- (void)_synchronizePasteboard
{
if (_nativePasteboard && _nativePasteboard.changeCount() > _changeCount)
{
var nativeTypes = [_nativePasteboard.types() copy];
if ([nativeTypes containsObject:UTF8PboardType])
nativeTypes.push(CPStringPboardType);
[self _declareTypes:nativeTypes owner:self updateNativePasteboard:NO];
_changeCount = _nativePasteboard.changeCount();
}
}
/*! @ignore
method provided for integration with native pasteboard
*/
- (void)pasteboard:(CPPasteboard)aPasteboard provideDataForType:(CPString)aType
{
if (aType === CPStringPboardType)
{
var string = _nativePasteboard.stringForType_(UTF8PboardType);
[self setString:string forType:CPStringPboardType];
[self setString:string forType:UTF8PboardType];
}
else
[self setString:_nativePasteboard.stringForType_(aType) forType:aType];
}
/*!
Returns the property list for the specified data type
@param aType the requested data type
@return the property list or <code>nil</code> if the list was not found
@return the property list or \c nil if the list was not found
*/
- (id)propertyListForType:(CPString)aType
{
var data = [self dataForType:aType];
if (data)
return [CPPropertyListSerialization propertyListFromData:data format:CPPropertyListXMLFormat_v1_0 errorDescription:nil];
return [CPPropertyListSerialization propertyListFromData:data format:CPPropertyList280NorthFormat_v1_0];
return nil;
}
/*
/*!
Returns the string for the specified data type
@param aType the requested data type
@return the string or <code>nil</code> if the string was not found
@return the string or \c nil if the string was not found
*/
- (CPString)stringForType:(CPString)aType
{
@@ -296,3 +378,70 @@ var CPPasteboards = nil;
}
@end
#if PLATFORM(DOM)
var DOMDataTransferPasteboard = nil;
@implementation _CPDOMDataTransferPasteboard : CPPasteboard
{
DataTransfer _dataTransfer;
}
+ (_CPDOMDataTransferPasteboard)DOMDataTransferPasteboard
{
if (!DOMDataTransferPasteboard)
DOMDataTransferPasteboard = [[_CPDOMDataTransferPasteboard alloc] init];
return DOMDataTransferPasteboard;
}
- (void)_setDataTransfer:(DataTransfer)aDataTransfer
{
_dataTransfer = aDataTransfer;
}
- (void)_setPasteboard:(CPPasteboard)aPasteboard
{
_dataTransfer.clearData();
var types = [aPasteboard types],
count = types.length;
while (count--)
{
var type = types[count];
if (type === CPStringPboardType)
_dataTransfer.setData(type, [aPasteboard stringForType:type]);
else
_dataTransfer.setData(type, [[aPasteboard dataForType:type] rawString]);
}
}
- (CPArray)types
{
return Array.prototype.slice.apply(_dataTransfer.types);
}
- (CPData)dataForType:(CPString)aType
{
var dataString = _dataTransfer.getData(aType);
if (aType === CPStringPboardType)
return [CPData dataFromPropertyList:dataString format:kCFPropertyList280NorthFormat_v1_0];
return [CPData dataWithRawString:dataString];
}
- (id)propertyListForType:(CPString)aType
{
if (aType === CPStringPboardType)
return _dataTransfer.getData(aType);
return [CPPropertyListSerialization propertyListFromData:[self dataForType:aType] format:CPPropertyListUnknownFormat];
}
@end
#endif
+197 -192
View File
@@ -20,34 +20,41 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
import "CPButton.j"
import "CPGeometry.j"
import "CPMenu.j"
import "CPMenuItem.j"
@import "CPButton.j"
@import "CPGeometry.j"
@import "CPMenu.j"
@import "CPMenuItem.j"
#include "CoreGraphics/CGGeometry.h"
var VISIBLE_MARGIN = 7.0;
var CPPopUpButtonArrowsImage = nil;
CPPopUpButtonStatePullsDown = CPThemeState("pulls-down");
/*
A <objj>CPPopUpButton</objj> contains a pop-up menu of items that a user can select from.
/*!
@ingroup appkit
@class CPPopUpButton
A CPPopUpButton contains a pop-up menu of items that a user can select from.
*/
@implementation CPPopUpButton : CPButton
{
BOOL _pullsDown;
int _selectedIndex;
CPRectEdge _preferredEdge;
CPImageView _arrowsView;
CPMenu _menu;
}
/*
+ (CPString)themeClass
{
return "popup-button";
}
/*!
Initializes the pop-up button to the specified size.
@param aFrame the size for the button
@param shouldPullDown <code>YES</code> makes this a pull-down menu, <code>NO</code> makes it a pop-up menu.
@param shouldPullDown \c YES makes this a pull-down menu, \c NO makes it a pop-up menu.
@return the initialized pop-up button
*/
- (id)initWithFrame:(CGRect)aFrame pullsDown:(BOOL)shouldPullDown
@@ -56,16 +63,16 @@ var CPPopUpButtonArrowsImage = nil;
if (self)
{
_pullsDown = shouldPullDown;
_selectedIndex = CPNotFound;
_preferredEdge = CPMaxYEdge;
[self setBezelStyle:CPTexturedRoundedBezelStyle];
[self setImagePosition:CPImageLeft];
[self setAlignment:CPLeftTextAlignment];
[self setValue:CPImageLeft forThemeAttribute:@"image-position"];
[self setValue:CPLeftTextAlignment forThemeAttribute:@"alignment"];
[self setValue:CPLineBreakByTruncatingTail forThemeAttribute:@"line-break-mode"];
[self setMenu:[[CPMenu alloc] initWithTitle:@""]];
[self setPullsDown:shouldPullDown];
}
return self;
@@ -76,76 +83,61 @@ var CPPopUpButtonArrowsImage = nil;
return [self initWithFrame:aFrame pullsDown:NO];
}
- (void)setBordered:(BOOL)shouldBeBordered
{
if (shouldBeBordered)
{
var bounds = [self bounds];
_arrowsView = [[CPImageView alloc] initWithFrame:CGRectMake(CGRectGetWidth(bounds) - 10.0, (CGRectGetHeight(bounds) - 8.0) / 2.0, 5.0, 8.0)];
if (!CPPopUpButtonArrowsImage)
CPPopUpButtonArrowsImage = [[CPImage alloc] initWithContentsOfFile:[[CPBundle bundleForClass:[CPPopUpButton class]] pathForResource:@"CPPopUpButton/CPPopUpButtonArrows.png"] size:CGSizeMake(5.0, 8.0)];
[_arrowsView setImage:CPPopUpButtonArrowsImage];
[_arrowsView setAutoresizingMask:CPViewMaxXMargin | CPViewMinYMargin | CPViewMaxYMargin];
[self addSubview:_arrowsView];
}
else
{
[_arrowsView removeFromSuperview];
_arrowsView = nil;
}
[super setBordered:shouldBeBordered];
}
// Setting the Type of Menu
/*
/*!
Specifies whether the object is a pull-down or a pop-up menu.
@param shouldPullDown <code>YES</code> makes the pop-up button
a pull-down menu. <code>NO</code> makes it a pop-up menu.
@param shouldPullDown \c YES makes the pop-up button
a pull-down menu. \c NO makes it a pop-up menu.
*/
- (void)setPullsDown:(BOOL)shouldPullDown
{
if (_pullsDown == shouldPullDown)
if (shouldPullDown)
var changed = [self setThemeState:CPPopUpButtonStatePullsDown];
else
var changed = [self unsetThemeState:CPPopUpButtonStatePullsDown];
if (!changed)
return;
_pullsDown = shouldPullDown;
var items = [_menu itemArray];
if (items.length <= 0)
if ([items count] <= 0)
return;
[items[0] setHidden:_pullsDown];
[items[0] setHidden:[self pullsDown]];
[self synchronizeTitleAndSelectedItem];
}
/*
Returns <code>YES</code> if the button is a pull-down menu. <code>NO</code> if the button is a pop-up menu.
/*!
Returns \c YES if the button is a pull-down menu. \c NO if the button is a pop-up menu.
*/
- (BOOL)pullsDown
{
return _pullsDown;
return [self hasThemeState:CPPopUpButtonStatePullsDown];
}
// Inserting and Deleting Items
/*
/*!
Adds a new menu item using a CPMenuItem object.
*/
- (void)addItem:(CPMenuItem)anItem
{
[_menu addItem:anItem];
}
/*!
Adds a new menu item with the specified title.
@param the new menu item's tite
*/
- (void)addItemWithTitle:(CPString)aTitle
{
[_menu addItemWithTitle:aTitle action:NULL keyEquivalent:NULL];
[_menu addItemWithTitle:aTitle action:NULL keyEquivalent:nil];
}
/*
/*!
Adds multiple new menu items with the titles specified in the provided array.
@param titles an arry of names for the new items
*/
@@ -158,7 +150,7 @@ var CPPopUpButtonArrowsImage = nil;
[self addItemWithTitle:titles[index]];
}
/*
/*!
Inserts a new item with the specified title and index location.
@param aTitle the new itme's title
@param anIndex the item's index in the menu
@@ -172,10 +164,10 @@ var CPPopUpButtonArrowsImage = nil;
if ([items[count] title] == aTitle)
[self removeItemAtIndex:count];
[_menu insertItemWithTitle:aTitle action:NULL keyEquivalent:NULL atIndex:anIndex];
[_menu insertItemWithTitle:aTitle action:NULL keyEquivalent:nil atIndex:anIndex];
}
/*
/*!
Removes all menu items from the pop-up button's menu
*/
- (void)removeAllItems
@@ -186,7 +178,7 @@ var CPPopUpButtonArrowsImage = nil;
[_menu removeItemAtIndex:0];
}
/*
/*!
Removes a menu item with the specified title from the button.
@param aTitle the title of the item to remove
*/
@@ -196,7 +188,7 @@ var CPPopUpButtonArrowsImage = nil;
[self synchronizeTitleAndSelectedItem];
}
/*
/*!
Removes the menu item at the specified index
@param anIndex the index of the item to remove
*/
@@ -207,27 +199,27 @@ var CPPopUpButtonArrowsImage = nil;
}
// Getting the User's Selection
/*
Returns the selected item or <code>nil</code> if no item is selected.
/*!
Returns the selected item or \c nil if no item is selected.
*/
- (CPMenuItem)selectedItem
{
if (_selectedIndex < 0)
if (_selectedIndex < 0 || _selectedIndex > [self numberOfItems] - 1)
return nil;
return [_menu itemAtIndex:_selectedIndex];
}
/*
Returns the title of the selected item or <code>nil</code> if no item is selected.
/*!
Returns the title of the selected item or \c nil if no item is selected.
*/
- (CPString)titleOfSelectedItem
{
return [[self selectedItem] title];
}
/*
Returns the index of the selected item. If no item is selected, it returns <objj>CPNotFound</objj>.
/*!
Returns the index of the selected item. If no item is selected, it returns CPNotFound.
*/
- (int)indexOfSelectedItem
{
@@ -235,8 +227,8 @@ var CPPopUpButtonArrowsImage = nil;
}
// For us, CPNumber is toll-free bridged to Number, so just return the selected index.
/*
Returns the selected item's index. If no item is selected, it returns <objj>CPNotFound</objj>.
/*!
Returns the selected item's index. If no item is selected, it returns CPNotFound.
*/
- (id)objectValue
{
@@ -244,7 +236,7 @@ var CPPopUpButtonArrowsImage = nil;
}
// Setting the Current Selection
/*
/*!
Selects the specified menu item.
@param aMenuItem the item to select
*/
@@ -253,7 +245,7 @@ var CPPopUpButtonArrowsImage = nil;
[self selectItemAtIndex:[self indexOfItem:aMenuItem]];
}
/*
/*!
Selects the item at the specified index
@param anIndex the index of the item to select
*/
@@ -262,18 +254,18 @@ var CPPopUpButtonArrowsImage = nil;
if (_selectedIndex == anIndex)
return;
if (_selectedIndex >= 0 && !_pullsDown)
if (_selectedIndex >= 0 && ![self pullsDown])
[[self selectedItem] setState:CPOffState];
_selectedIndex = anIndex;
if (_selectedIndex >= 0 && !_pullsDown)
if (_selectedIndex >= 0 && ![self pullsDown])
[[self selectedItem] setState:CPOnState];
[self synchronizeTitleAndSelectedItem];
}
/*
/*!
Selects the menu item with the specified tag
@param the tag of the item to select
*/
@@ -282,7 +274,7 @@ var CPPopUpButtonArrowsImage = nil;
[self selectItemAtIndex:[self indexOfItemWithTag:aTag]];
}
/*
/*!
Selects the item with the specified title
@param the title of the item to select
*/
@@ -291,7 +283,7 @@ var CPPopUpButtonArrowsImage = nil;
[self selectItemAtIndex:[self indexOfItemWithTitle:aTitle]];
}
/*
/*!
Sets the object for the selected item. If no item is selected, then this method has no effect.
@param the object set for the selected item
*/
@@ -301,7 +293,7 @@ var CPPopUpButtonArrowsImage = nil;
}
// Getting Menu Items
/*
/*!
Returns the button's menu of items.
*/
- (CPMenu)menu
@@ -309,12 +301,12 @@ var CPPopUpButtonArrowsImage = nil;
return _menu;
}
/*
/*!
Sets the menu for the button
*/
- (void)setMenu:(CPMenu)aMenu
{
if (_menu == aMenu)
if (_menu === aMenu)
return;
var defaultCenter = [CPNotificationCenter defaultCenter];
@@ -323,19 +315,16 @@ var CPPopUpButtonArrowsImage = nil;
{
[defaultCenter
removeObserver:self
selector:@selector(menuDidAddItem:)
name:CPMenuDidAddItemNotification
object:_menu];
[defaultCenter
removeObserver:self
selector:@selector(menuDidChangeItem:)
name:CPMenuDidChangeItemNotification
object:_menu];
[defaultCenter
removeObserver:self
selector:@selector(menuDidRemoveItem:)
name:CPMenuDidRemoveItemNotification
object:_menu];
}
@@ -366,7 +355,7 @@ var CPPopUpButtonArrowsImage = nil;
[self synchronizeTitleAndSelectedItem];
}
/*
/*!
Returns a count of the number of items in the button's menu.
*/
- (int)numberOfItems
@@ -374,7 +363,7 @@ var CPPopUpButtonArrowsImage = nil;
return [_menu numberOfItems];
}
/*
/*!
Returns an array of the items in the menu
*/
- (CPArray)itemArray
@@ -382,8 +371,8 @@ var CPPopUpButtonArrowsImage = nil;
return [_menu itemArray];
}
/*
Returns the item at the specified index or <code>nil</code> if the item does not exist.
/*!
Returns the item at the specified index or \c nil if the item does not exist.
@param anIndex the index of the item to obtain
*/
- (CPMenuItem)itemAtIndex:(unsigned)anIndex
@@ -391,8 +380,8 @@ var CPPopUpButtonArrowsImage = nil;
return [_menu itemAtIndex:anIndex];
}
/*
Returns the title of the item at the specified index or <code>nil</code> if no item exists.
/*!
Returns the title of the item at the specified index or \c nil if no item exists.
@param anIndex the index of the item
*/
- (CPString)itemTitleAtIndex:(unsigned)anIndex
@@ -400,7 +389,7 @@ var CPPopUpButtonArrowsImage = nil;
return [[_menu itemAtIndex:anIndex] title];
}
/*
/*!
Returns an array of all the menu item titles.
*/
- (CPArray)itemTitles
@@ -415,7 +404,7 @@ var CPPopUpButtonArrowsImage = nil;
items.push([items[index] title]);
}
/*
/*!
Returns the menu item with the specified title.
@param aTitle the title of the desired menu item
*/
@@ -424,7 +413,7 @@ var CPPopUpButtonArrowsImage = nil;
return [_menu itemAtIndex:[_menu indexOfItemWithTitle:aTitle]];
}
/*
/*!
Returns the last menu item
*/
- (CPMenuItem)lastItem
@@ -433,8 +422,8 @@ var CPPopUpButtonArrowsImage = nil;
}
// Getting the Indices of Menu Items
/*
Returns the index of the specified item or <objj>CPNotFound</objj> if the item is not in the list.
/*!
Returns the index of the specified item or CPNotFound if the item is not in the list.
@param aMenuItem the item to obtain the index for
*/
- (int)indexOfItem:(CPMenuItem)aMenuItem
@@ -442,17 +431,17 @@ var CPPopUpButtonArrowsImage = nil;
return [_menu indexOfItem:aMenuItem];
}
/*
Returns the index of the item with the specified tag or <objj>CPNotFound</objj> if the item is not in the list.
/*!
Returns the index of the item with the specified tag or CPNotFound if the item is not in the list.
@param aTag the item's tag
*/
- (int)indexOfItemWithTag:(int)aTag
{
return [_menu indexOfItemWithTag:aMenuItem];
return [_menu indexOfItemWithTag:aTag];
}
/*
Returns the index of the item with the specified title or <objj>CPNotFound</objj>.
/*!
Returns the index of the item with the specified title or CPNotFound.
@param aTitle the item's titel
*/
- (int)indexOfItemWithTitle:(CPString)aTitle
@@ -460,20 +449,20 @@ var CPPopUpButtonArrowsImage = nil;
return [_menu indexOfItemWithTitle:aTitle];
}
/*
/*!
Returns the index of the item with the specified
represented object or <objj>CPNotFound</objj>
represented object or CPNotFound
if a match does not exist.
@param anObject the item's represented object
*/
- (int)indexOfItemWithRepresentedObject:(id)anObject
{
return [_menu indexOfItemWithRepresentedObejct:anObject];
return [_menu indexOfItemWithRepresentedObject:anObject];
}
/*
/*!
Returns the index of the item with the specified target
and action. Returns <objj>CPNotFound</objj> if the no
and action. Returns CPNotFound if the no
such item is in the list.
@param aTarget the item's target
@param anAction the item's action
@@ -484,7 +473,7 @@ var CPPopUpButtonArrowsImage = nil;
}
// Setting the Cell Edge to Pop out in Restricted Situations
/*
/*!
Returns the button's edge where the pop-up menu will be
displayed when there is not enough room to display directly
above the button.
@@ -494,7 +483,7 @@ var CPPopUpButtonArrowsImage = nil;
return _preferredEdge;
}
/*
/*!
Sets the preffered edge of the button to display the
pop-up when there is a limited amount of screen space.
By default, the pop-up should draw on top of the button.
@@ -505,19 +494,27 @@ var CPPopUpButtonArrowsImage = nil;
}
// Setting the Title
/*
/*!
Sets the pop-up button's title.
@param aTitle the new title
*/
- (void)setTitle:(CPString)aTitle
{
if ([self title] == aTitle)
if ([self title] === aTitle)
return;
if (_pullsDown)
if ([self pullsDown])
{
[_items[0] setTitle:aTitle];
[self synchronizeTitleAndSelectedItem];
var items = [_menu itemArray];
if ([items count] <= 0)
[self addItemWithTitle:aTitle];
else
{
[items[0] setTitle:aTitle];
[self synchronizeTitleAndSelectedItem];
}
}
else
{
@@ -535,7 +532,7 @@ var CPPopUpButtonArrowsImage = nil;
}
// Setting the Image
/*
/*!
This method has no effect. Because the image is taken
from the currently selected item, this method serves
no purpose.
@@ -546,7 +543,7 @@ var CPPopUpButtonArrowsImage = nil;
}
// Setting the State
/*
/*!
Makes sure the selected item and the item
being displayed are one and the same.
*/
@@ -554,11 +551,11 @@ var CPPopUpButtonArrowsImage = nil;
{
var item = nil;
if (_pullsDown)
if ([self pullsDown])
{
var items = [_menu itemArray];
if (items.length > 0)
if ([items count] > 0)
item = items[0];
}
else
@@ -569,7 +566,7 @@ var CPPopUpButtonArrowsImage = nil;
}
//
/*
/*!
Called when the menu has a new item added to it.
@param aNotification information about the event
*/
@@ -586,7 +583,7 @@ var CPPopUpButtonArrowsImage = nil;
else if (index < _selectedIndex)
++_selectedIndex;
if (index == 0 && _pullsDown)
if (index == 0 && [self pullsDown])
{
var items = [_menu itemArray];
@@ -595,9 +592,18 @@ var CPPopUpButtonArrowsImage = nil;
if (items.length > 0)
[items[1] setHidden:NO];
}
var item = [_menu itemArray][index],
action = [item action];
if (!action || (action === @selector(_popUpItemAction:)))
{
[item setTarget:self];
[item setAction:@selector(_popUpItemAction:)];
}
}
/*
/*!
Called when a menu item has changed.
@param aNotification information about the event
*/
@@ -605,16 +611,16 @@ var CPPopUpButtonArrowsImage = nil;
{
var index = [[aNotification userInfo] objectForKey:@"CPMenuItemIndex"];
if (_pullsDown && index != 0)
if ([self pullsDown] && index != 0)
return;
if (!_pullsDown && index != _selectedIndex)
if (![self pullsDown] && index != _selectedIndex)
return;
[self synchronizeTitleAndSelectedItem];
}
/*
/*!
Called when an item was removed from the menu.
@param aNotification information about the event
*/
@@ -622,81 +628,79 @@ var CPPopUpButtonArrowsImage = nil;
{
var numberOfItems = [self numberOfItems];
if (numberOfItems <= _selectedIndex)
if (numberOfItems <= _selectedIndex && numberOfItems > 0)
[self selectItemAtIndex:numberOfItems - 1];
else
[self synchronizeTitleAndSelectedItem];
}
- (void)mouseDown:(CPEvent)anEvent
{
if (![self isEnabled])
if (![self isEnabled] || ![self numberOfItems])
return;
[self highlight:YES];
var theWindow = [self window],
menuWindow = [_CPMenuWindow menuWindowWithMenu:[self menu] font:[self font]];
[menuWindow setDelegate:self];
[menuWindow setBackgroundStyle:_CPMenuWindowPopUpBackgroundStyle];
var menuOrigin = [theWindow convertBaseToBridge:[self convertPoint:CGPointMakeZero() toView:nil]];
// Pull Down Menus show up directly below their buttons.
if (_pullsDown)
menuOrigin.y += CGRectGetHeight([self frame]);
// Pop Up Menus attempt to show up "on top" of the selected item.
var menu = [self menu],
bounds = [self bounds],
minimumWidth = CGRectGetWidth(bounds);
// FIXME: setFont: should set the font on the menu.
[menu setFont:[self font]];
if ([self pullsDown])
{
var positionedItem = nil,
location = CGPointMake(0.0, CGRectGetMaxY(bounds));
}
else
{
var contentRect = [menuWindow rectForItemAtIndex:_selectedIndex];
menuOrigin.x -= CGRectGetMinX(contentRect) + [_CPMenuItemView leftMargin];
menuOrigin.y -= CGRectGetMinY(contentRect);
var contentRect = [self contentRectForBounds:bounds],
positionedItem = [self selectedItem],
standardLeftMargin = [_CPMenuWindow _standardLeftMargin] + [_CPMenuItemStandardView _standardLeftMargin],
location = CGPointMake(CGRectGetMinX(contentRect) - standardLeftMargin, 0.0);
minimumWidth += standardLeftMargin;
}
[menuWindow setFrameOrigin:menuOrigin];
var menuMaxX = CGRectGetMaxX([menuWindow frame]),
buttonMaxX = CGRectGetMaxX([self convertRect:[self bounds] toView:nil]);
if (menuMaxX < buttonMaxX)
[menuWindow setMinWidth:CGRectGetWidth([menuWindow frame]) + buttonMaxX - menuMaxX - VISIBLE_MARGIN];
[menuWindow orderFront:self];
[menuWindow beginTrackingWithEvent:anEvent sessionDelegate:self didEndSelector:@selector(menuWindowDidFinishTracking:highlightedItem:)];
[menu setMinimumWidth:minimumWidth];
[menu
_popUpMenuPositioningItem:positionedItem
atLocation:location
topY:CGRectGetMinY(bounds)
bottomY:CGRectGetMaxY(bounds)
inView:self
callback:function(aMenu)
{
[self highlight:NO];
var highlightedItem = [aMenu highlightedItem];
if ([highlightedItem _isSelectable])
[self selectItem:highlightedItem];
}];
/*
else
{
// This is confusing, I KNOW, so let me explain it to you.
// We want the *content* of the selected menu item to overlap the *content* of our pop up.
// 1. So calculate where our content is, then calculate where the menu item is.
// 2. Move LEFT by whatever indentation we have (offsetWidths, aka, window margin, item margin, etc).
// 3. MOVE UP by the difference in sizes of the content and menu item, this will only work if the content is vertically centered.
var contentRect = [self convertRect:[self contentRectForBounds:bounds] toView:nil],
menuOrigin = [theWindow convertBaseToGlobal:contentRect.origin],
menuItemRect = [menuWindow rectForItemAtIndex:_selectedIndex];
menuOrigin.x -= CGRectGetMinX(menuItemRect) + [menuWindow overlapOffsetWidth] + [[[menu itemAtIndex:_selectedIndex] _menuItemView] overlapOffsetWidth];
menuOrigin.y -= CGRectGetMinY(menuItemRect) + (CGRectGetHeight(menuItemRect) - CGRectGetHeight(contentRect)) / 2.0;
}
*/
}
/*
@ignore
*/
- (void)menuWindowDidFinishTracking:(_CPMenuWindow)aMenuWindow highlightedItem:(CPMenuItem)aMenuItem
- (void)_popUpItemAction:(id)aSender
{
[_CPMenuWindow poolMenuWindow:aMenuWindow];
[self highlight:NO];
var index = [_menu indexOfItem:aMenuItem];
if (index == CPNotFound)
return;
[self selectItemAtIndex:index];
var selectedItem = [self selectedItem],
target = nil,
action = [selectedItem action];
if (!action)
{
target = [self target];
action = [self action];
}
// FIXME: If [selectedItem target] == nil do we use our own target?
else
target = [selectedItem target];
[self sendAction:action to:target];
[self sendAction:[self action] to:[self target]];
}
@end
@@ -706,7 +710,7 @@ var CPPopUpButtonMenuKey = @"CPPopUpButtonMenuKey",
CPPopUpButtonPullsDownKey = @"CPPopUpButtonPullsDownKey";
@implementation CPPopUpButton (CPCoding)
/*
/*!
Initializes the pop-up button with data from the
specified coder.
@param aCoder the coder from which to read
@@ -719,15 +723,17 @@ var CPPopUpButtonMenuKey = @"CPPopUpButtonMenuKey",
if (self)
{
// Nothing is currently selected
_selectedIndex = -1;
[self setMenu:[aCoder decodeObjectForKey:CPPopUpButtonMenuKey]];
[self selectItemAtIndex:[aCoder decodeObjectForKey:CPPopUpButtonSelectedIndexKey]];
[self setPullsDown:[aCoder decodeBoolForKey:CPPopUpButtonPullsDownKey]];
}
return self;
}
/*
/*!
Encodes the data of the pop-up button into a coder
@param aCoder the coder to which the data
will be written
@@ -738,7 +744,6 @@ var CPPopUpButtonMenuKey = @"CPPopUpButtonMenuKey",
[aCoder encodeObject:_menu forKey:CPPopUpButtonMenuKey];
[aCoder encodeInt:_selectedIndex forKey:CPPopUpButtonSelectedIndexKey];
[aCoder encodeBool:_pullsDown forKey:CPPopUpButtonPullsDownKey];
}
@end
+59 -64
View File
@@ -20,12 +20,13 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
import <AppKit/CGGeometry.j>
import <AppKit/CPImageView.j>
import <AppKit/CPView.j>
@import <AppKit/CGGeometry.j>
@import <AppKit/CPImageView.j>
@import <AppKit/CPView.j>
#include "CoreGraphics/CGGeometry.h"
/*
@global
@group CPProgressIndicatorStyle
@@ -48,7 +49,10 @@ var CPProgressIndicatorSpinningStyleColors = nil,
CPProgressIndicatorStyleIdentifiers = nil,
CPProgressIndicatorStyleSizes = nil;
/*
/*!
@ingroup appkit
@class CPProgressIndicator
This class is used in a Cappuccino GUI to display the progress of a
function or task. If the duration of the task is unknown, there is
also an indeterminate mode for the indicator.
@@ -100,17 +104,14 @@ var CPProgressIndicatorSpinningStyleColors = nil,
for (; start <= end; ++start)
{
CPProgressIndicatorBezelBorderViewPool[start] = [];
CPProgressIndicatorBezelBorderViewPool[start][CPMiniControlSize] = [];
CPProgressIndicatorBezelBorderViewPool[start][CPSmallControlSize] = [];
CPProgressIndicatorBezelBorderViewPool[start][CPRegularControlSize] = [];
}
CPProgressIndicatorClassName = [self className];
CPProgressIndicatorStyleIdentifiers = [];
CPProgressIndicatorStyleIdentifiers[CPProgressIndicatorBarStyle] = @"Bar";
CPProgressIndicatorStyleIdentifiers[CPProgressIndicatorSpinningStyle] = @"Spinny";
CPProgressIndicatorStyleIdentifiers[CPProgressIndicatorHUDBarStyle] = @"HUDBar";
@@ -122,30 +123,20 @@ var CPProgressIndicatorSpinningStyleColors = nil,
CPProgressIndicatorStyleSizes = [];
// Bar Sttyle
var prefix = CPProgressIndicatorClassName + @"BezelBorder" + CPProgressIndicatorStyleIdentifiers[CPProgressIndicatorBarStyle];
var prefixes = [
CPProgressIndicatorClassName + @"BezelBorder" + CPProgressIndicatorStyleIdentifiers[CPProgressIndicatorBarStyle],
CPProgressIndicatorClassName + @"Bar" + CPProgressIndicatorStyleIdentifiers[CPProgressIndicatorBarStyle],
CPProgressIndicatorClassName + @"BezelBorder" + CPProgressIndicatorStyleIdentifiers[CPProgressIndicatorHUDBarStyle],
CPProgressIndicatorClassName + @"Bar" + CPProgressIndicatorStyleIdentifiers[CPProgressIndicatorHUDBarStyle]
];
CPProgressIndicatorStyleSizes[prefix + regularIdentifier] = [_CGSizeMake(3.0, 15.0), _CGSizeMake(1.0, 15.0), _CGSizeMake(3.0, 15.0)];
CPProgressIndicatorStyleSizes[prefix + smallIdentifier] = [_CGSizeMake(3.0, 15.0), _CGSizeMake(1.0, 15.0), _CGSizeMake(3.0, 15.0)];
CPProgressIndicatorStyleSizes[prefix + miniIdentifier] = [_CGSizeMake(3.0, 15.0), _CGSizeMake(1.0, 15.0), _CGSizeMake(3.0, 15.0)];
prefix = CPProgressIndicatorClassName + @"Bar" + CPProgressIndicatorStyleIdentifiers[CPProgressIndicatorBarStyle];
CPProgressIndicatorStyleSizes[prefix + regularIdentifier] = _CGSizeMake(1.0, 9.0);
CPProgressIndicatorStyleSizes[prefix + smallIdentifier] = _CGSizeMake(1.0, 9.0);
CPProgressIndicatorStyleSizes[prefix + miniIdentifier] = _CGSizeMake(1.0, 9.0);
// HUD Bar Style
prefix = CPProgressIndicatorClassName + @"BezelBorder" + CPProgressIndicatorStyleIdentifiers[CPProgressIndicatorHUDBarStyle];
CPProgressIndicatorStyleSizes[prefix + regularIdentifier] = [_CGSizeMake(3.0, 15.0), _CGSizeMake(1.0, 15.0), _CGSizeMake(3.0, 15.0)];
CPProgressIndicatorStyleSizes[prefix + smallIdentifier] = [_CGSizeMake(3.0, 15.0), _CGSizeMake(1.0, 15.0), _CGSizeMake(3.0, 15.0)];
CPProgressIndicatorStyleSizes[prefix + miniIdentifier] = [_CGSizeMake(3.0, 15.0), _CGSizeMake(1.0, 15.0), _CGSizeMake(3.0, 15.0)];
prefix = CPProgressIndicatorClassName + @"Bar" + CPProgressIndicatorStyleIdentifiers[CPProgressIndicatorHUDBarStyle];
CPProgressIndicatorStyleSizes[prefix + regularIdentifier] = _CGSizeMake(1.0, 9.0);
CPProgressIndicatorStyleSizes[prefix + smallIdentifier] = _CGSizeMake(1.0, 9.0);
CPProgressIndicatorStyleSizes[prefix + miniIdentifier] = _CGSizeMake(1.0, 9.0);
for (var i = 0, count = prefixes.length; i<count; i++)
{
var prefix = prefixes[i];
CPProgressIndicatorStyleSizes[prefix + regularIdentifier] = [_CGSizeMake(3.0, 16.0), _CGSizeMake(1.0, 16.0), _CGSizeMake(3.0, 16.0)];
CPProgressIndicatorStyleSizes[prefix + smallIdentifier] = [_CGSizeMake(3.0, 16.0), _CGSizeMake(1.0, 16.0), _CGSizeMake(3.0, 16.0)];
CPProgressIndicatorStyleSizes[prefix + miniIdentifier] = [_CGSizeMake(3.0, 16.0), _CGSizeMake(1.0, 16.0), _CGSizeMake(3.0, 16.0)];
}
}
- (id)initWithFrame:(CGRect)aFrame
@@ -178,7 +169,7 @@ var CPProgressIndicatorSpinningStyleColors = nil,
{
}
/*
/*!
Starts the animation of the progress indicator in indeterminate mode.
@param the requesting object
*/
@@ -189,7 +180,7 @@ var CPProgressIndicatorSpinningStyleColors = nil,
[self _hideOrDisplay];
}
/*
/*!
Stops the animation of the progress indicator in indeterminate mode.
@param the requesting object
*/
@@ -200,8 +191,8 @@ var CPProgressIndicatorSpinningStyleColors = nil,
[self _hideOrDisplay];
}
/*
Always returns <code>NO</code>. Cappuccino does not have multiple threads.
/*!
Always returns \c NO. Cappuccino does not have multiple threads.
*/
- (BOOL)usesThreadedAnimation
{
@@ -209,7 +200,7 @@ var CPProgressIndicatorSpinningStyleColors = nil,
}
// Advancing the Progress Bar
/*
/*!
Increases the progress of the bar by the specified value.
@param aValue the amount to increase the progress value
*/
@@ -218,7 +209,7 @@ var CPProgressIndicatorSpinningStyleColors = nil,
[self setDoubleValue:_doubleValue + aValue];
}
/*
/*!
Sets the progress value of the indicator.
*/
- (void)setDoubleValue:(double)aValue
@@ -228,7 +219,7 @@ var CPProgressIndicatorSpinningStyleColors = nil,
[self drawBar];
}
/*
/*!
Returns the value of the progress indicator.
*/
- (double)doubleValue
@@ -236,7 +227,7 @@ var CPProgressIndicatorSpinningStyleColors = nil,
return _doubleValue;
}
/*
/*!
Sets the minimum value of the progress indicator. The default is 0.0.
@param aValue the new minimum value
*/
@@ -245,7 +236,7 @@ var CPProgressIndicatorSpinningStyleColors = nil,
_minValue = aValue;
}
/*
/*!
Returns the minimum value of the progress indicator.
*/
- (double)minValue
@@ -253,7 +244,7 @@ var CPProgressIndicatorSpinningStyleColors = nil,
return _minValue;
}
/*
/*!
Sets the maximum value of the progress indicator. The default is 100.0.
@param aValue the new maximum value.
*/
@@ -262,7 +253,7 @@ var CPProgressIndicatorSpinningStyleColors = nil,
_maxValue = aValue;
}
/*
/*!
Returns the maximum value of the progress indicator.
*/
- (double)maxValue
@@ -271,7 +262,7 @@ var CPProgressIndicatorSpinningStyleColors = nil,
}
// Setting the Appearance
/*
/*!
Sets the progress indicator's size.
@param aControlSize the new size
*/
@@ -285,7 +276,7 @@ var CPProgressIndicatorSpinningStyleColors = nil,
[self updateBackgroundColor];
}
/*
/*!
Returns the progress indicator's size
*/
- (CPControlSize)controlSize
@@ -323,13 +314,13 @@ var CPProgressIndicatorSpinningStyleColors = nil,
return YES;
}
/*
/*!
Specifies whether this progress indicator should be indeterminate or display progress based on it's max and min.
@param isDeterminate <code>YES</code> makes the indicator indeterminate
@param isDeterminate \c YES makes the indicator indeterminate
*/
- (void)setIndeterminate:(BOOL)isIndeterminate
{
if (_indeterminate == isIndeterminate)
if (_isIndeterminate == isIndeterminate)
return;
_isIndeterminate = isIndeterminate;
@@ -337,15 +328,15 @@ var CPProgressIndicatorSpinningStyleColors = nil,
[self updateBackgroundColor];
}
/*
Returns <code>YES</code> if the progress bar is indeterminate.
/*!
Returns \c YES if the progress bar is indeterminate.
*/
- (BOOL)isIndeterminate
{
return _isIndeterminate;
}
/*
/*!
Sets the progress indicator's style
@param aStyle the style to set it to
*/
@@ -359,7 +350,7 @@ var CPProgressIndicatorSpinningStyleColors = nil,
[self updateBackgroundColor];
}
/*
/*!
Resizes the indicator based on it's style.
*/
- (void)sizeToFit
@@ -372,10 +363,10 @@ var CPProgressIndicatorSpinningStyleColors = nil,
_CPControlIdentifierForControlSize(_controlSize)][0].height)];
}
/*
Sets whether the indicator should be displayed when it isn't animating. By default this is <code>YES</code> if the style
is <objj>CPProgressIndicatorBarStyle</objj>, and <code>NO</code> if it's <objj>CPProgressIndicatorSpinningStyle</objj>.
@param isDisplayedWhenStopped <code>YES</code> means the indicator will be displayed when it's not animating.
/*!
Sets whether the indicator should be displayed when it isn't animating. By default this is \c YES if the style
is CPProgressIndicatorBarStyle, and \c NO if it's CPProgressIndicatorSpinningStyle.
@param isDisplayedWhenStopped \c YES means the indicator will be displayed when it's not animating.
*/
- (void)setDisplayedWhenStopped:(BOOL)isDisplayedWhenStopped
{
@@ -389,8 +380,8 @@ var CPProgressIndicatorSpinningStyleColors = nil,
[self _hideOrDisplay];
}
/*
Returns <code>YES</code> if the progress bar is displayed when not animating.
/*!
Returns \c YES if the progress bar is displayed when not animating.
*/
- (BOOL)isDisplayedWhenStopped
{
@@ -424,21 +415,25 @@ var CPProgressIndicatorSpinningStyleColors = nil,
if (!_barView)
{
_barView = [[CPView alloc] initWithFrame:CGRectMake(2.0, 2.0, 0.0, 9.0)];
[_barView setBackgroundColor:[CPColor redColor]];
_barView = [[CPView alloc] initWithFrame:CGRectMake(0.0, 0.0, 0.0, 16.0)];
[self addSubview:_barView];
}
[_barView setBackgroundColor:_CPControlColorWithPatternImage(
[_barView setBackgroundColor:_CPControlThreePartImagePattern(
NO,
CPProgressIndicatorStyleSizes,
CPProgressIndicatorClassName,
@"Bar",
CPProgressIndicatorStyleIdentifiers[_style],
_CPControlIdentifierForControlSize(_controlSize))];
[_barView setFrameSize:CGSizeMake(CGRectGetWidth([self bounds]) * (_doubleValue - _minValue) / (_maxValue - _minValue) - 4.0, 9.0)];
var width = CGRectGetWidth([self bounds]),
barWidth = width * ((_doubleValue - _minValue) / (_maxValue - _minValue));
if (barWidth > 0.0 && barWidth < 4.0)
barWidth = 4.0;
[_barView setFrameSize:CGSizeMake(barWidth, 16.0)];
}
/* @ignore */
+259
View File
@@ -0,0 +1,259 @@
/*
* CPRadio.j
* AppKit
*
* Created by Francisco Tolmasky.
* Copyright 2009, 280 North, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
@import <Foundation/CPObject.j>
@import <Foundation/CPSet.j>
@import "CPButton.j"
/*!
@ingroup appkit
from this mailing list thread:
http://groups.google.com/group/objectivej/browse_thread/thread/7c41cbd9cbee9ea3
-----------------------------------
Creating a checkbox is easy enough:
checkbox = [[CPCheckBox alloc] initWithFrame:aFrame];
That's basically all there is to it. Radio buttons are very similar,
the key difference is the introduction of a new class CPRadioGroup,
which defines which radio buttons are part of the same group:
[myRadioButton setRadioGroup:aRadioGroup];
Every radio button receives a unique radio group by default (so if you
do nothing further, they will all behave independently), but you can
use an existing radio button's group with other buttons as so:
button1 = [[CPRadio alloc] initWithFrame:aFrame];
...
button2 = [[CPRadio alloc] initWithFrame:aFrame radioGroup:[button1
radioGroup]];
...
button3 = [[CPRadio alloc] initWithFrame:aFrame radioGroup:[button1
radioGroup]];
...etc...
Here, all the radio buttons will act "together". [[button1 radioGroup]
allRadios] returns every button that's part of this group, and
[[button1 radioGroup] selectedRadio] returns the currently selected
option.
*/
@implementation CPRadio : CPButton
{
CPRadioGroup _radioGroup;
}
+ (id)radioWithTitle:(CPString)aTitle theme:(CPTheme)aTheme
{
return [self buttonWithTitle:aTitle theme:aTheme];
}
+ (id)radioWithTitle:(CPString)aTitle
{
return [self buttonWithTitle:aTitle];
}
+ (CPButton)standardButtonWithTitle:(CPString)aTitle
{
var button = [[CPRadio alloc] init];
[button setTitle:aTitle];
return button;
}
+ (CPString)themeClass
{
return @"radio";
}
// Designated Initializer
- (id)initWithFrame:(CGRect)aFrame radioGroup:(CPRadioGroup)aRadioGroup
{
self = [super initWithFrame:aFrame];
if (self)
{
[self setRadioGroup:aRadioGroup];
[self setHighlightsBy:CPContentsCellMask];
[self setShowsStateBy:CPContentsCellMask];
// Defaults?
[self setImagePosition:CPImageLeft];
[self setAlignment:CPLeftTextAlignment];
[self setBordered:YES];
}
return self;
}
- (id)initWithFrame:(CGRect)aFrame
{
return [self initWithFrame:aFrame radioGroup:[CPRadioGroup new]];
}
- (CPInteger)nextState
{
return CPOnState;
}
- (void)setRadioGroup:(CPRadioGroup)aRadioGroup
{
if (_radioGroup === aRadioGroup)
return;
[_radioGroup _removeRadio:self];
_radioGroup = aRadioGroup;
[_radioGroup _addRadio:self];
}
- (CPRadioGroup)radioGroup
{
return _radioGroup;
}
- (void)setObjectValue:(id)aValue
{
[super setObjectValue:aValue];
if ([self state] === CPOnState)
[_radioGroup _setSelectedRadio:self];
}
@end
var CPRadioRadioGroupKey = @"CPRadioRadioGroupKey";
@implementation CPRadio (CPCoding)
- (id)initWithCoder:(CPCoder)aCoder
{
self = [super initWithCoder:aCoder];
if (self)
_radioGroup = [aCoder decodeObjectForKey:CPRadioRadioGroupKey];
return self;
}
- (void)encodeWithCoder:(CPCoder)aCoder
{
[super encodeWithCoder:aCoder];
[aCoder encodeObject:_radioGroup forKey:CPRadioRadioGroupKey];
}
@end
@implementation CPRadioGroup : CPObject
{
CPSet _radios;
CPRadio _selectedRadio;
id _target @accessors(property=target);
SEL _action @accessors(property=action);
}
- (id)init
{
self = [super init];
if (self)
{
_radios = [CPSet set];
_selectedRadio = nil;
}
return self;
}
- (void)_addRadio:(CPRadio)aRadio
{
[_radios addObject:aRadio];
if ([aRadio state] === CPOnState)
[self _setSelectedRadio:aRadio];
}
- (void)_removeRadio:(CPRadio)aRadio
{
if (_selectedRadio === aRadio)
_selectedRadio = nil;
[_radios removeObject:aRadio];
}
- (void)_setSelectedRadio:(CPRadio)aRadio
{
if (_selectedRadio === aRadio)
return;
[_selectedRadio setState:CPOffState];
_selectedRadio = aRadio;
[CPApp sendAction:_action to:_target from:self];
}
- (CPRadio)selectedRadio
{
return _selectedRadio;
}
- (CPArray)radios
{
return [_radios allObjects];
}
@end
var CPRadioGroupRadiosKey = @"CPRadioGroupRadiosKey",
CPRadioGroupSelectedRadioKey = @"CPRadioGroupSelectedRadioKey";
@implementation CPRadioGroup (CPCoding)
- (id)initWithCoder:(CPCoder)aCoder
{
self = [super init];
if (self)
{
_radios = [aCoder decodeObjectForKey:CPRadioGroupRadiosKey];
_selectedRadio = [aCoder decodeObjectForKey:CPRadioGroupSelectedRadioKey];
}
return self;
}
- (void)encodeWithCoder:(CPCoder)aCoder
{
[aCoder encodeObject:_radios forKey:CPRadioGroupRadiosKey];
[aCoder encodeObject:_selectedRadio forKey:CPRadioGroupSelectedRadioKey];
}
@end
+105 -57
View File
@@ -20,14 +20,27 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
import <Foundation/CPObject.j>
@import <Foundation/CPObject.j>
CPDeleteKeyCode = 8;
CPUpArrowKeyCode = 63232;
CPDownArrowKeyCode = 63233;
CPLeftArrowKeyCode = 63234;
CPRightArrowKeyCode = 63235;
CPTabKeyCode = 9;
CPReturnKeyCode = 13;
CPEscapeKeyCode = 27;
CPSpaceKeyCode = 32;
CPPageUpKeyCode = 33;
CPPageDownKeyCode = 34;
CPLeftArrowKeyCode = 37;
CPUpArrowKeyCode = 38;
CPRightArrowKeyCode = 39;
CPDownArrowKeyCode = 40;
/*!
@ingroup appkit
@class CPResponder
Subclasses of CPResonder can be part of the responder chain.
*/
@implementation CPResponder : CPObject
{
CPMenu _menu;
@@ -35,27 +48,27 @@ CPRightArrowKeyCode = 63235;
}
// Changing the first responder
/*
Returns <code>YES</code> if the receiver is able to become the first responder. <code>NO</code> otherwise.
/*!
Returns \c YES if the receiver is able to become the first responder. \c NO otherwise.
*/
- (BOOL)acceptsFirstResponder
{
return NO;
}
/*
/*!
Notifies the receiver that it will become the first responder. The receiver can reject first
responder if it returns <code>NO</code>. The default implementation always returns <code>YES</code>.
@return <code>YES</code> if the receiver accepts first responder status.
responder if it returns \c NO. The default implementation always returns \c YES.
@return \c YES if the receiver accepts first responder status.
*/
- (BOOL)becomeFirstResponder
{
return YES;
}
/*
/*!
Notifies the receiver that it has been asked to give up first responder status.
@return <code>YES</code> if the receiver is willing to give up first responder status.
@return \c YES if the receiver is willing to give up first responder status.
*/
- (BOOL)resignFirstResponder
{
@@ -63,7 +76,7 @@ CPRightArrowKeyCode = 63235;
}
// Setting the next responder
/*
/*!
Sets the receiver's next responder.
@param aResponder the responder after the receiver
*/
@@ -72,7 +85,7 @@ CPRightArrowKeyCode = 63235;
_nextResponder = aResponder;
}
/*
/*!
Returns the responder after the receiver.
*/
- (CPResponder)nextResponder
@@ -80,38 +93,57 @@ CPRightArrowKeyCode = 63235;
return _nextResponder;
}
/*
/*!
Called to interpret a series of key events.
@param events an array of key <objj>CPEvent</objj>s
@param events an array of key CPEvents
*/
- (void)interpretKeyEvents:(CPArray)events
{
var event,
index = 0;
while(event = events[index++])
var index = 0,
count = [events count];
for (; index < count; ++index)
{
var event = events[index];
switch([event keyCode])
{
case CPLeftArrowKeyCode: [self moveBackward:self];
case CPPageUpKeyCode: [self doCommandBySelector:@selector(pageUp:)];
break;
case CPRightArrowKeyCode: [self moveForward:self];
case CPPageDownKeyCode: [self doCommandBySelector:@selector(pageDown:)];
break;
case CPUpArrowKeyCode: [self moveUp:self];
case CPLeftArrowKeyCode: [self doCommandBySelector:@selector(moveLeft:)];
break;
case CPDownArrowKeyCode: [self moveDown:self];
case CPRightArrowKeyCode: [self doCommandBySelector:@selector(moveRight:)];
break;
case CPDeleteKeyCode: [self deleteBackward:self];
case CPUpArrowKeyCode: [self doCommandBySelector:@selector(moveUp:)];
break;
case 3:
case 13: [self insertLineBreak:self];
case CPDownArrowKeyCode: [self doCommandBySelector:@selector(moveDown:)];
break;
case CPDeleteKeyCode: [self doCommandBySelector:@selector(deleteBackward:)];
break;
case CPReturnKeyCode:
case 3: [self doCommandBySelector:@selector(insertLineBreak:)];
break;
case CPEscapeKeyCode: [self doCommandBySelector:@selector(cancel:)];
break;
case CPTabKeyCode: var shift = [event modifierFlags] & CPShiftKeyMask;
if (!shift)
[self doCommandBySelector:@selector(insertTab:)];
else
[self doCommandBySelector:@selector(insertBackTab:)];
break;
default: [self insertText:[event characters]];
}
}
}
/*
/*!
Notifies the receiver that the user has clicked the mouse down in its area.
@param anEvent contains information about the click
*/
@@ -120,7 +152,7 @@ CPRightArrowKeyCode = 63235;
[_nextResponder performSelector:_cmd withObject:anEvent];
}
/*
/*!
Notifies the receiver that the user has initiated a drag
over it. A drag is a mouse movement while the left button is down.
@param anEvent contains information about the drag
@@ -130,7 +162,7 @@ CPRightArrowKeyCode = 63235;
[_nextResponder performSelector:_cmd withObject:anEvent];
}
/*
/*!
Notifies the receiver that the user has released the left mouse button.
@param anEvent contains information about the release
*/
@@ -139,7 +171,7 @@ CPRightArrowKeyCode = 63235;
[_nextResponder performSelector:_cmd withObject:anEvent];
}
/*
/*!
Notifies the receiver that the user has moved the mouse (with no buttons down).
@param anEvent contains information about the movement
*/
@@ -153,7 +185,7 @@ CPRightArrowKeyCode = 63235;
[_nextResponder performSelector:_cmd withObject:anEvent];
}
/*
/*!
Notifies the receiver that the mouse exited the receiver's area.
@param anEvent contains information about the exit
*/
@@ -162,7 +194,7 @@ CPRightArrowKeyCode = 63235;
[_nextResponder performSelector:_cmd withObject:anEvent];
}
/*
/*!
Notifies the receiver that the mouse scroll wheel has moved.
@param anEvent information about the scroll
*/
@@ -171,7 +203,7 @@ CPRightArrowKeyCode = 63235;
[_nextResponder performSelector:_cmd withObject:anEvent];
}
/*
/*!
Notifies the receiver that the user has pressed a key.
@param anEvent information about the key press
*/
@@ -180,7 +212,7 @@ CPRightArrowKeyCode = 63235;
[_nextResponder performSelector:_cmd withObject:anEvent];
}
/*
/*!
Notifies the receiver that the user has released a key.
@param anEvent information about the key press
*/
@@ -191,9 +223,9 @@ CPRightArrowKeyCode = 63235;
/*
FIXME This description is bad.
Based on <code>anEvent</code>, the receiver should simulate the event.
Based on \c anEvent, the receiver should simulate the event.
@param anEvent the event to simulate
@return <code>YES</code> if the event receiver simulated the event
@return \c YES if the event receiver simulated the event
*/
- (BOOL)performKeyEquivalent:(CPEvent)anEvent
{
@@ -201,23 +233,37 @@ CPRightArrowKeyCode = 63235;
}
// Action Methods
/*
Deletes one character backward, or the selection if anything is selected.
@param aSender the object requesting this
*/
- (void)deleteBackward:(id)aSender
{
}
/*
/*!
Insert a line break at the caret position or selection.
@param aSender the object requesting this
*/
- (void)insertLineBreak:(id)aSender
{
[self insertNewline:aSender];
}
/*
/*!
Insert a line break at the caret position or selection.
@param aSender the object requesting this
*/
- (void)insertNewline:(id)aSender
{
[[self nextResponder] insertNewline:aSender];
}
- (void)cancel:(id)sender
{
}
- (void)insertTab:(id)sender
{
}
- (void)insertBackTab:(id)sender
{
}
/*!
Inserts some text at the caret position or selection.
@param aString the string to insert
*/
@@ -226,24 +272,24 @@ CPRightArrowKeyCode = 63235;
}
// Dispatch methods
/*
/*!
The receiver will attempt to perform the command,
if it responds to it. If not, the <code>nextResponder</code> will be called to do it.
if it responds to it. If not, the \c -nextResponder will be called to do it.
@param aSelector the command to attempt
*/
- (void)doCommandBySelector:(SEL)aSelector
{
if([self respondsToSelector:aSelector])
if ([self respondsToSelector:aSelector])
[self performSelector:aSelector];
else
[_nextResponder doCommandBySelector:aSelector];
}
/*
/*!
The receiver will attempt to perform the command, or pass it on to the next responder if it doesn't respond to it.
@param aSelector the command to perform
@param anObject the argument to the method
@return <code>YES</code> if the receiver was able to perform the command, or a responder down the chain was
@return \c YES if the receiver was able to perform the command, or a responder down the chain was
able to perform the command.
*/
- (BOOL)tryToPerform:(SEL)aSelector with:(id)anObject
@@ -271,7 +317,7 @@ CPRightArrowKeyCode = 63235;
}
// Getting the Undo Manager
/*
/*!
Returns the undo manager for the receiver.
*/
- (CPUndoManager)undoManager
@@ -280,7 +326,7 @@ CPRightArrowKeyCode = 63235;
}
// Terminating the responder chain
/*
/*!
Called when an event finds no suitable responder.
@param anEventSelector the command that failed
*/
@@ -294,7 +340,7 @@ var CPResponderNextResponderKey = @"CPResponderNextResponderKey";
@implementation CPResponder (CPCoding)
/*
/*!
Initializes the responder with data from a coder.
@param aCoder the coder from which data will be read
@return the initialized responder
@@ -309,13 +355,15 @@ var CPResponderNextResponderKey = @"CPResponderNextResponderKey";
return self;
}
/*
/*!
Archives the responder to a coder.
@param aCoder the coder to which the responder will be archived
*/
- (void)encodeWithCoder:(CPCoder)aCoder
{
[aCoder encodeConditionalObject:_nextResponder forKey:CPResponderNextResponderKey];
// This will come out nil on the other side with decodeObjectForKey:
if (_nextResponder !== nil)
[aCoder encodeConditionalObject:_nextResponder forKey:CPResponderNextResponderKey];
}
@end
+67
View File
@@ -0,0 +1,67 @@
@import <AppKit/CPPanel.j>
@implementation CPSavePanel : CPPanel
{
CPURL _URL;
BOOL _isExtensionHidden @accessors(getter=isExtensionHidden, setter=setExtensionHidden:);
BOOL _canSelectHiddenExtension @accessors(property=canSelectHiddenExtension);
BOOL _allowsOtherFileTypes @accessors(property=allowsOtherFileTypes);
BOOL _canCreateDirectories @accessors(property=canCreateDirectories);
CPArray _allowedFileTypes @accessors(property=allowedFileTypes);
}
+ (id)savePanel
{
return [[CPSavePanel alloc] init];
}
- (id)init
{
if (self = [super init])
{
_canCreateDirectories = YES;
}
return self;
}
- (CPInteger)runModal
{
// FIXME: Is this correct???
[[CPRunLoop currentRunLoop] limitDateForMode:CPDefaultRunLoopMode];
if (typeof window["cpSavePanel"] === "function")
{
var resultObject = window.cpSavePanel({
isExtensionHidden: _isExtensionHidden,
canSelectHiddenExtension: _canSelectHiddenExtension,
allowsOtherFileTypes: _allowsOtherFileTypes,
canCreateDirectories: _canCreateDirectories,
allowedFileTypes: _allowedFileTypes
}),
result = resultObject.button;
_URL = result ? [CPURL URLWithString:resultObject.URL] : nil;
}
else
{
// FIXME: This is not the best way to do this.
var documentName = window.prompt("Document Name:"),
result = documentName !== null;
_URL = result ? [[self class] proposedFileURLWithDocumentName:documentName] : nil;
}
return result;
}
- (CPURL)URL
{
return _URL;
}
@end
+16
View File
@@ -0,0 +1,16 @@
@import <Foundation/CPObject.j>
#import "CoreGraphics/CGGeometry.h"
@implementation CPScreen : CPObject
{
}
- (CGRect)visibleFrame
{
return _CGRectMake(window.screen.availLeft, window.screen.availTop, window.screen.availWidth, window.screen.availHeight);
}
@end
+362 -197
View File
@@ -20,21 +20,27 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
import "CPView.j"
import "CPClipView.j"
import "CPScroller.j"
@import "CPView.j"
@import "CPClipView.j"
@import "CPScroller.j"
#include "CoreGraphics/CGGeometry.h"
/*
Used to display views that are too large for the viewing area. the <objj>CPScrollView</objj>
/*!
@ingroup appkit
@class CPScrollView
Used to display views that are too large for the viewing area. the CPScrollView
places scroll bars on the side of the view to allow the user to scroll and see the entire
contents of the view.
*/
@implementation CPScrollView : CPView
{
CPClipView _contentView;
CPClipView _headerClipView;
CPView _cornerView;
BOOL _hasVerticalScroller;
BOOL _hasHorizontalScroller;
BOOL _autohidesScrollers;
@@ -53,28 +59,32 @@ import "CPScroller.j"
- (id)initWithFrame:(CGRect)aFrame
{
self = [super initWithFrame:aFrame];
if (self)
{
_verticalLineScroll = 10.0;
_verticalPageScroll = 10.0;
_horizontalLineScroll = 10.0;
_horizontalPageScroll = 10.0;
_contentView = [[CPClipView alloc] initWithFrame:[self bounds]];
[self addSubview:_contentView];
_headerClipView = [[CPClipView alloc] init];
[self addSubview:_headerClipView];
[self setHasVerticalScroller:YES];
[self setHasHorizontalScroller:YES];
}
return self;
}
// Determining component sizes
/*
/*!
Returns the size of the scroll view's content view.
*/
- (CGRect)contentSize
@@ -82,7 +92,7 @@ import "CPScroller.j"
return [_contentView frame].size;
}
/*
/*!
Returns the view that is scrolled for the user.
*/
- (id)documentView
@@ -90,33 +100,33 @@ import "CPScroller.j"
return [_contentView documentView];
}
/*
/*!
Sets the content view that clips the document
@param aContentView the content view
*/
- (void)setContentView:(CPClipView)aContentView
{
if (!aContentView)
if (_contentView !== aContentView || !aContentView)
return;
var documentView = [aContentView documentView];
if (documentView)
[documentView removeFromSuperview];
[_contentView removeFromSuperview];
var size = [self contentSize];
_contentView = aContentView;
[_contentView setFrame:CGRectMake(0.0, 0.0, size.width, size.height)];
[_contentView setDocumentView:documentView];
[self addSubview:_contentView];
// This will size the content view appropriately, so no need to size it in this method.
[self reflectScrolledClipView:_contentView];
}
/*
/*!
Returns the content view that clips the document.
*/
- (CPClipView)contentView
@@ -124,24 +134,26 @@ import "CPScroller.j"
return _contentView;
}
/*
/*!
Sets the view that is scrolled for the user.
@param aView the view that will be scrolled
*/
- (void)setDocumentView:(CPView)aView
{
[_contentView setDocumentView:aView];
[self reflectScrolledClipView:_contentView];
[_contentView setDocumentView:aView];
// FIXME: This should be observed.
[self _updateCornerAndHeaderView];
[self reflectScrolledClipView:_contentView];
}
/*
Resizes the scroll view to contain the specified
clip view.
/*!
Resizes the scroll view to contain the specified clip view.
@param aClipView the clip view to resize to
*/
- (void)reflectScrolledClipView:(CPClipView)aClipView
{
if(_contentView != aClipView)
if(_contentView !== aClipView)
return;
if (_recursionCount > 5)
@@ -160,84 +172,112 @@ import "CPScroller.j"
}
else
{
[_verticalScroller setEnabled:NO];
[_horizontalScroller setEnabled:NO];
// [_verticalScroller setEnabled:NO];
// [_horizontalScroller setEnabled:NO];
}
[_contentView setFrame:[self bounds]];
[_headerClipView setFrame:_CGRectMakeZero()];
--_recursionCount;
return;
}
var documentFrame = [documentView frame],
contentViewFrame = [self bounds],
scrollPoint = [_contentView bounds].origin,
difference = _CGSizeMake(CPRectGetWidth(documentFrame) - CPRectGetWidth(contentViewFrame), CPRectGetHeight(documentFrame) - CPRectGetHeight(contentViewFrame)),
shouldShowVerticalScroller = (!_autohidesScrollers || difference.height > 0.0) && _hasVerticalScroller,
shouldShowHorizontalScroller = (!_autohidesScrollers || difference.width > 0.0) && _hasHorizontalScroller,
wasShowingVerticalScroller = ![_verticalScroller isHidden],
wasShowingHorizontalScroller = ![_horizontalScroller isHidden],
verticalScrollerWidth = [CPScroller scrollerWidthForControlSize:[_verticalScroller controlSize]],
horizontalScrollerHeight = [CPScroller scrollerWidthForControlSize:[_horizontalScroller controlSize]];
var documentFrame = [documentView frame], // the size of the whole document
contentFrame = [self bounds], // assume it takes up the entire size of the scrollview (no scrollers)
headerClipViewFrame = [self _headerClipViewFrame],
headerClipViewHeight = _CGRectGetHeight(headerClipViewFrame);
if (_autohidesScrollers)
{
if (shouldShowVerticalScroller)
shouldShowHorizontalScroller = (!_autohidesScrollers || difference.width > -verticalScrollerWidth) && _hasHorizontalScroller;
if (shouldShowHorizontalScroller)
shouldShowVerticalScroller = (!_autohidesScrollers || difference.height > -horizontalScrollerHeight) && _hasVerticalScroller;
}
[_verticalScroller setHidden:!shouldShowVerticalScroller];
[_verticalScroller setEnabled:!_autohidesScrollers && difference.height < 0];
contentFrame.origin.y += headerClipViewHeight;
contentFrame.size.height -= headerClipViewHeight;
[_horizontalScroller setHidden:!shouldShowHorizontalScroller];
[_horizontalScroller setEnabled:!_autohidesScrollers && difference.width < 0];
var difference = _CGSizeMake(_CGRectGetWidth(documentFrame) - _CGRectGetWidth(contentFrame), _CGRectGetHeight(documentFrame) - _CGRectGetHeight(contentFrame)),
verticalScrollerWidth = _CGRectGetWidth([_verticalScroller frame]),
horizontalScrollerHeight = _CGRectGetHeight([_horizontalScroller frame]),
hasVerticalScroll = difference.height > 0.0,
hasHorizontalScroll = difference.width > 0.0,
shouldShowVerticalScroller = _hasVerticalScroller && (!_autohidesScrollers || hasVerticalScroll),
shouldShowHorizontalScroller = _hasHorizontalScroller && (!_autohidesScrollers || hasHorizontalScroll);
// Now we have to account for the shown scrollers affecting the deltas.
if (shouldShowVerticalScroller)
{
var verticalScrollerHeight = CPRectGetHeight(contentViewFrame);
if (shouldShowHorizontalScroller)
verticalScrollerHeight -= horizontalScrollerHeight;
difference.width += verticalScrollerWidth;
contentViewFrame.size.width -= verticalScrollerWidth;
[_verticalScroller setFloatValue:(difference.height <= 0.0) ? 0.0 : scrollPoint.y / difference.height
knobProportion:CPRectGetHeight(contentViewFrame) / CPRectGetHeight(documentFrame)];
[_verticalScroller setFrame:CPRectMake(CPRectGetMaxX(contentViewFrame), 0.0, verticalScrollerWidth, verticalScrollerHeight)];
hasHorizontalScroll = difference.width > 0.0;
shouldShowHorizontalScroller = _hasHorizontalScroller && (!_autohidesScrollers || hasHorizontalScroll);
}
else if (wasShowingVerticalScroller)
[_verticalScroller setFloatValue:0.0 knobProportion:1.0];
if (shouldShowHorizontalScroller)
{
difference.height += horizontalScrollerHeight;
contentViewFrame.size.height -= horizontalScrollerHeight;
[_horizontalScroller setFloatValue:(difference.width <= 0.0) ? 0.0 : scrollPoint.x / difference.width
knobProportion:CPRectGetWidth(contentViewFrame) / CPRectGetWidth(documentFrame)];
[_horizontalScroller setFrame:CPRectMake(0.0, CPRectGetMaxY(contentViewFrame), CPRectGetWidth(contentViewFrame), horizontalScrollerHeight)];
hasVerticalScroll = difference.height > 0.0;
shouldShowVerticalScroller = _hasVerticalScroller && (!_autohidesScrollers || hasVerticalScroll);
}
// We now definitively know which scrollers are shown or not, as well as whether they are showing scroll values.
[_verticalScroller setHidden:!shouldShowVerticalScroller];
[_verticalScroller setEnabled:hasVerticalScroll];
[_horizontalScroller setHidden:!shouldShowHorizontalScroller];
[_horizontalScroller setEnabled:hasHorizontalScroll];
// We can thus appropriately account for them changing the content size.
if (shouldShowVerticalScroller)
contentFrame.size.width -= verticalScrollerWidth;
if (shouldShowHorizontalScroller)
contentFrame.size.height -= horizontalScrollerHeight;
var scrollPoint = [_contentView bounds].origin,
wasShowingVerticalScroller = ![_verticalScroller isHidden],
wasShowingHorizontalScroller = ![_horizontalScroller isHidden];
if (shouldShowVerticalScroller)
{
var verticalScrollerY = MAX(_CGRectGetHeight([self _cornerViewFrame]), headerClipViewHeight),
verticalScrollerHeight = _CGRectGetHeight([self bounds]) - verticalScrollerY;
if (shouldShowHorizontalScroller)
verticalScrollerHeight -= horizontalScrollerHeight;
[_verticalScroller setFloatValue:(difference.height <= 0.0) ? 0.0 : scrollPoint.y / difference.height];
[_verticalScroller setKnobProportion:_CGRectGetHeight(contentFrame) / _CGRectGetHeight(documentFrame)];
[_verticalScroller setFrame:_CGRectMake(_CGRectGetMaxX(contentFrame), verticalScrollerY, verticalScrollerWidth, verticalScrollerHeight)];
}
else if (wasShowingVerticalScroller)
{
[_verticalScroller setFloatValue:0.0];
[_verticalScroller setKnobProportion:1.0];
}
if (shouldShowHorizontalScroller)
{
[_horizontalScroller setFloatValue:(difference.width <= 0.0) ? 0.0 : scrollPoint.x / difference.width];
[_horizontalScroller setKnobProportion:_CGRectGetWidth(contentFrame) / _CGRectGetWidth(documentFrame)];
[_horizontalScroller setFrame:_CGRectMake(0.0, _CGRectGetMaxY(contentFrame), _CGRectGetWidth(contentFrame), horizontalScrollerHeight)];
}
else if (wasShowingHorizontalScroller)
[_horizontalScroller setFloatValue:0.0 knobProportion:1.0];
[_contentView setFrame:contentViewFrame];
{
[_horizontalScroller setFloatValue:0.0];
[_horizontalScroller setKnobProportion:1.0];
}
[_contentView setFrame:contentFrame];
[_headerClipView setFrame:headerClipViewFrame];
[_cornerView setFrame:[self _cornerViewFrame]];
--_recursionCount;
}
// Managing Scrollers
/*
/*!
Sets the scroll view's horizontal scroller.
@param aScroller the horizontal scroller for the scroll view
*/
- (void)setHorizontalScroller:(CPScroller)aScroller
{
if (_horizontalScroller == aScroller)
if (_horizontalScroller === aScroller)
return;
[_horizontalScroller removeFromSuperview];
@@ -254,7 +294,7 @@ import "CPScroller.j"
[self reflectScrolledClipView:_contentView];
}
/*
/*!
Returns the scroll view's horizontal scroller
*/
- (CPScroller)horizontalScroller
@@ -262,45 +302,42 @@ import "CPScroller.j"
return _horizontalScroller;
}
/*
/*!
Specifies whether the scroll view can have a horizontal scroller.
@param hasHorizontalScroller <code>YES</code> lets the scroll view
@param hasHorizontalScroller \c YES lets the scroll view
allocate a horizontal scroller if necessary.
*/
- (void)setHasHorizontalScroller:(BOOL)shouldHaveHorizontalScroller
{
if (_hasHorizontalScroller == shouldHaveHorizontalScroller)
if (_hasHorizontalScroller === shouldHaveHorizontalScroller)
return;
_hasHorizontalScroller = shouldHaveHorizontalScroller;
if (_hasHorizontalScroller && !_horizontalScroller)
[self setHorizontalScroller:[[CPScroller alloc] initWithFrame:CPRectMake(0.0, 0.0, CPRectGetWidth([self bounds]), [CPScroller scrollerWidth])]];
else if (!_hasHorizontalScroller && _horizontalScroller)
{
[_horizontalScroller setHidden:YES];
[self reflectScrolledClipView:_contentView];
[self setHorizontalScroller:[[CPScroller alloc] initWithFrame:CGRectMake(0.0, 0.0, MAX(_CGRectGetWidth([self bounds]), [CPScroller scrollerWidth]+1), [CPScroller scrollerWidth])]];
[[self horizontalScroller] setFrameSize:CGSizeMake(_CGRectGetWidth([self bounds]), [CPScroller scrollerWidth])];
}
[self reflectScrolledClipView:_contentView];
}
/*
Returns <code>YES</code> if the scroll view can have a horizontal
scroller.
/*!
Returns \c YES if the scroll view can have a horizontal scroller.
*/
- (BOOL)hasHorizontalScroller
{
return _hasHorizontalScroller;
}
/*
/*!
Sets the scroll view's vertical scroller.
@param aScroller the vertical scroller
*/
- (void)setVerticalScroller:(CPScroller)aScroller
{
if (_verticalScroller == aScroller)
if (_verticalScroller === aScroller)
return;
[_verticalScroller removeFromSuperview];
@@ -317,7 +354,7 @@ import "CPScroller.j"
[self reflectScrolledClipView:_contentView];
}
/*
/*!
Return's the scroll view's vertical scroller
*/
- (CPScroller)verticalScroller
@@ -325,64 +362,122 @@ import "CPScroller.j"
return _verticalScroller;
}
/*
/*!
Specifies whether the scroll view has can have
a vertical scroller. It allocates it if necessary.
@param hasVerticalScroller <code>YES</code> allows
@param hasVerticalScroller \c YES allows
the scroll view to display a vertical scroller
*/
- (void)setHasVerticalScroller:(BOOL)shouldHaveVerticalScroller
{
if (_hasVerticalScroller == shouldHaveVerticalScroller)
if (_hasVerticalScroller === shouldHaveVerticalScroller)
return;
_hasVerticalScroller = shouldHaveVerticalScroller;
if (_hasVerticalScroller && !_verticalScroller)
[self setVerticalScroller:[[CPScroller alloc] initWithFrame:CPRectMake(0.0, 0.0, [CPScroller scrollerWidth], CPRectGetHeight([self bounds]))]];
else if (!_hasVerticalScroller && _verticalScroller)
{
[_verticalScroller setHidden:YES];
[self reflectScrolledClipView:_contentView];
[self setVerticalScroller:[[CPScroller alloc] initWithFrame:_CGRectMake(0.0, 0.0, [CPScroller scrollerWidth], MAX(_CGRectGetHeight([self bounds]), [CPScroller scrollerWidth]+1))]];
[[self verticalScroller] setFrameSize:CGSizeMake([CPScroller scrollerWidth], _CGRectGetHeight([self bounds]))];
}
[self reflectScrolledClipView:_contentView];
}
/*
Returns <code>YES</code> if the scroll view can have
a vertical scroller.
/*!
Returns \c YES if the scroll view can have a vertical scroller.
*/
- (BOOL)hasHorizontalScroller
- (BOOL)hasVerticalScroller
{
return _hasHorizontalScroller;
return _hasVerticalScroller;
}
/*
/*!
Sets whether the scroll view hides its scoll bars when not needed.
@param autohidesScrollers <code>YES</code> causes the scroll bars
@param autohidesScrollers \c YES causes the scroll bars
to be hidden when not needed.
*/
- (void)setAutohidesScrollers:(BOOL)autohidesScrollers
{
if (_autohidesScrollers == autohidesScrollers)
return;
_autohidesScrollers = autohidesScrollers;
[self reflectScrolledClipView:_contentView];
}
/*
Returns <code>YES</code> if the scroll view hides its scroll
/*!
Returns \c YES if the scroll view hides its scroll
bars when not necessary.
*/
- (BOOL)autohidesScrollers
{
return _autohidesScrollers;
}
/*
- (void)setFrameSize:(CPRect)aSize
- (void)_updateCornerAndHeaderView
{
[super setFrameSize:aSize];
var documentView = [self documentView],
currentHeaderView = [self _headerView],
documentHeaderView = [documentView respondsToSelector:@selector(headerView)] ? [documentView headerView] : nil;
if (currentHeaderView !== documentHeaderView)
{
[currentHeaderView removeFromSuperview];
[_headerClipView setDocumentView:documentHeaderView];
}
var documentCornerView = [documentView respondsToSelector:@selector(cornerView)] ? [documentView cornerView] : nil;
if (_cornerView !== documentCornerView)
{
[_cornerView removeFromSuperview];
_cornerView = documentCornerView;
if (_cornerView)
[self addSubview:_cornerView];
}
[self reflectScrolledClipView:_contentView];
}*/
}
- (CPView)_headerView
{
var headerClipViewSubviews = [_headerClipView subviews];
return [headerClipViewSubviews count] ? headerClipViewSubviews[0] : nil;
}
- (CGRect)_cornerViewFrame
{
if (!_cornerView)
return _CGRectMakeZero();
var bounds = [self bounds],
frame = [_cornerView frame];
frame.origin.x = _CGRectGetMaxX(bounds) - _CGRectGetWidth(frame);
frame.origin.y = 0;
return frame;
}
- (CGRect)_headerClipViewFrame
{
var headerView = [self _headerView];
if (!headerView)
return _CGRectMakeZero();
var frame = [self bounds];
frame.size.height = _CGRectGetHeight([headerView frame]);
frame.size.width -= _CGRectGetWidth([self _cornerViewFrame]);
return frame;
}
/* @ignore */
- (void)_verticalScrollerDidScroll:(CPScroller)aScroller
@@ -407,7 +502,8 @@ import "CPScroller.j"
case CPScrollerKnobSlot:
case CPScrollerKnob:
default: contentBounds.origin.y = value * (_CGRectGetHeight(documentFrame) - _CGRectGetHeight(contentBounds));
// We want integral bounds!
default: contentBounds.origin.y = ROUND(value * (_CGRectGetHeight(documentFrame) - _CGRectGetHeight(contentBounds)));
}
[_contentView scrollToPoint:contentBounds.origin];
@@ -436,13 +532,15 @@ import "CPScroller.j"
case CPScrollerKnobSlot:
case CPScrollerKnob:
default: contentBounds.origin.x = value * (_CGRectGetWidth(documentFrame) - _CGRectGetWidth(contentBounds));
// We want integral bounds!
default: contentBounds.origin.x = ROUND(value * (_CGRectGetWidth(documentFrame) - _CGRectGetWidth(contentBounds)));
}
[_contentView scrollToPoint:contentBounds.origin];
[_headerClipView scrollToPoint:CGPointMake(contentBounds.origin.x, 0.0)];
}
/*
/*!
Lays out the scroll view's components.
*/
- (void)tile
@@ -462,11 +560,9 @@ import "CPScroller.j"
}
// Setting Scrolling Behavior
/*
Sets how much the document moves when scrolled. Sets
the vertical and horizontal scroll.
@param aLineScroll the amount to move the document
when scrolled
/*!
Sets how much the document moves when scrolled. Sets the vertical and horizontal scroll.
@param aLineScroll the amount to move the document when scrolled
*/
- (void)setLineScroll:(float)aLineScroll
{
@@ -474,59 +570,51 @@ import "CPScroller.j"
[self setVerticalLineScroll:aLineScroll];
}
/*
Returns how much the document moves
when scrolled
/*!
Returns how much the document moves when scrolled
*/
- (float)lineScroll
{
return [self horizontalLineScroll];
}
/*
Sets how much the document moves when scrolled
horizontally.
@param aLineScroll the amount to move horizontally
when scrolled.
/*!
Sets how much the document moves when scrolled horizontally.
@param aLineScroll the amount to move horizontally when scrolled.
*/
- (void)setHorizontalLineScroll:(float)aLineScroll
{
_horizontalLineScroll = aLineScroll;
}
/*
Returns how much the document moves horizontally
when scrolled.
/*!
Returns how much the document moves horizontally when scrolled.
*/
- (float)horizontalLineScroll
{
return _horizontalLineScroll;
}
/*
Sets how much the document moves when scrolled
vertically.
@param aLineScroll the new amount to move vertically
when scrolled.
/*!
Sets how much the document moves when scrolled vertically.
@param aLineScroll the new amount to move vertically when scrolled.
*/
- (void)setVerticalLineScroll:(float)aLineScroll
{
_verticalLineScroll = aLineScroll;
}
/*
Returns how much the document moves vertically
when scrolled.
/*!
Returns how much the document moves vertically when scrolled.
*/
- (float)verticalLineScroll
{
return _verticalLineScroll;
}
/*
/*!
Sets the horizontal and vertical page scroll amount.
@param aPageScroll the new horizontal and vertical page
scroll amount
@param aPageScroll the new horizontal and vertical page scroll amount
*/
- (void)setPageScroll:(float)aPageScroll
{
@@ -534,16 +622,15 @@ import "CPScroller.j"
[self setVerticalPageScroll:aPageScroll];
}
/*
Returns the vertical and horizontal page scroll
amount.
/*!
Returns the vertical and horizontal page scroll amount.
*/
- (float)pageScroll
{
return [self horizontalPageScroll];
}
/*
/*!
Sets the horizontal page scroll amount.
@param aPageScroll the new horizontal page scroll amount
*/
@@ -552,7 +639,7 @@ import "CPScroller.j"
_horizontalPageScroll = aPageScroll;
}
/*
/*!
Returns the horizontal page scroll amount.
*/
- (float)horizontalPageScroll
@@ -560,17 +647,16 @@ import "CPScroller.j"
return _horizontalPageScroll;
}
/*
/*!
Sets the vertical page scroll amount.
@param aPageScroll the new vertcal page scroll
amount
@param aPageScroll the new vertcal page scroll amount
*/
- (void)setVerticalPageScroll:(float)aPageScroll
{
_verticalPageScroll = aPageScroll;
}
/*
/*!
Returns the vertical page scroll amount.
*/
- (float)verticalPageScroll
@@ -578,59 +664,138 @@ import "CPScroller.j"
return _verticalPageScroll;
}
/*
/*!
Handles a scroll wheel event from the user.
@param anEvent the scroll wheel event
*/
- (void)scrollWheel:(CPEvent)anEvent
{
var value = [_verticalScroller floatValue],
documentFrame = [[self documentView] frame],
var documentFrame = [[self documentView] frame],
contentBounds = [_contentView bounds];
contentBounds.origin.x += [anEvent deltaX] * _horizontalLineScroll;
contentBounds.origin.y += [anEvent deltaY] * _verticalLineScroll;
// We want integral bounds!
contentBounds.origin.x = ROUND(contentBounds.origin.x + [anEvent deltaX] * _horizontalLineScroll);
contentBounds.origin.y = ROUND(contentBounds.origin.y + [anEvent deltaY] * _verticalLineScroll);
[_contentView scrollToPoint:contentBounds.origin];
[_headerClipView scrollToPoint:CGPointMake(contentBounds.origin.x, 0.0)];
}
- (void)keyDown:(CPEvent)anEvent
{
var keyCode = [anEvent keyCode],
value = [_verticalScroller floatValue],
documentFrame = [[self documentView] frame],
[self interpretKeyEvents:[anEvent]];
}
- (void)pageUp:(id)sender
{
var contentBounds = [_contentView bounds];
[self moveByOffset:CGSizeMake(0.0, -(_CGRectGetHeight(contentBounds) - _verticalPageScroll))];
}
- (void)pageDown:(id)sender
{
var contentBounds = [_contentView bounds];
[self moveByOffset:CGSizeMake(0.0, _CGRectGetHeight(contentBounds) - _verticalPageScroll)];
}
- (void)moveLeft:(id)sender
{
[self moveByOffset:CGSizeMake(-_horizontalLineScroll, 0.0)];
}
- (void)moveRight:(id)sender
{
[self moveByOffset:CGSizeMake(_horizontalLineScroll, 0.0)];
}
- (void)moveUp:(id)sender
{
[self moveByOffset:CGSizeMake(0.0, -_verticalLineScroll)];
}
- (void)moveDown:(id)sender
{
[self moveByOffset:CGSizeMake(0.0, _verticalLineScroll)];
}
- (void)moveByOffset:(CGSize)aSize
{
var documentFrame = [[self documentView] frame],
contentBounds = [_contentView bounds];
switch (keyCode)
{
case 33: /*pageup*/
contentBounds.origin.y -= _CGRectGetHeight(contentBounds) - _verticalPageScroll;
break;
case 34: /*pagedown*/
contentBounds.origin.y += _CGRectGetHeight(contentBounds) - _verticalPageScroll;
break;
case 38: /*up arrow*/
contentBounds.origin.y -= _verticalLineScroll;
break;
case 40: /*down arrow*/
contentBounds.origin.y += _verticalLineScroll;
break;
case 37: /*left arrow*/
contentBounds.origin.x -= _horizontalLineScroll;
break;
case 49: /*right arrow*/
contentBounds.origin.x += _horizontalLineScroll;
break;
default: return [super keyDown:anEvent];
}
contentBounds.origin.x += aSize.width;
contentBounds.origin.y += aSize.height;
[_contentView scrollToPoint:contentBounds.origin];
[_headerClipView scrollToPoint:CGPointMake(contentBounds.origin, 0)];
}
@end
var CPScrollViewContentViewKey = "CPScrollViewContentView",
CPScrollViewHeaderClipViewKey = "CPScrollViewHeaderClipViewKey",
CPScrollViewVLineScrollKey = "CPScrollViewVLineScroll",
CPScrollViewHLineScrollKey = "CPScrollViewHLineScroll",
CPScrollViewVPageScrollKey = "CPScrollViewVPageScroll",
CPScrollViewHPageScrollKey = "CPScrollViewHPageScroll",
CPScrollViewHasVScrollerKey = "CPScrollViewHasVScroller",
CPScrollViewHasHScrollerKey = "CPScrollViewHasHScroller",
CPScrollViewVScrollerKey = "CPScrollViewVScroller",
CPScrollViewHScrollerKey = "CPScrollViewHScroller",
CPScrollViewAutohidesScrollerKey = "CPScrollViewAutohidesScroller",
CPScrollViewCornerViewKey = "CPScrollViewCornerViewKey";
@implementation CPScrollView (CPCoding)
- (id)initWithCoder:(CPCoder)aCoder
{
if (self = [super initWithCoder:aCoder])
{
_verticalLineScroll = [aCoder decodeFloatForKey:CPScrollViewVLineScrollKey];
_verticalPageScroll = [aCoder decodeFloatForKey:CPScrollViewVPageScrollKey];
_horizontalLineScroll = [aCoder decodeFloatForKey:CPScrollViewHLineScrollKey];
_horizontalPageScroll = [aCoder decodeFloatForKey:CPScrollViewHPageScrollKey];
_contentView = [aCoder decodeObjectForKey:CPScrollViewContentViewKey];
_headerClipView = [aCoder decodeObjectForKey:CPScrollViewHeaderClipViewKey];
_verticalScroller = [aCoder decodeObjectForKey:CPScrollViewVScrollerKey];
_horizontalScroller = [aCoder decodeObjectForKey:CPScrollViewHScrollerKey];
_hasVerticalScroller = [aCoder decodeBoolForKey:CPScrollViewHasVScrollerKey];
_hasHorizontalScroller = [aCoder decodeBoolForKey:CPScrollViewHasHScrollerKey];
_autohidesScrollers = [aCoder decodeBoolForKey:CPScrollViewAutohidesScrollerKey];
_cornerView = [aCoder decodeObjectForKey:CPScrollViewCornerViewKey];
// Do to the anything goes nature of decoding, our subviews may not exist yet, so layout at the end of the run loop when we're sure everything is in a correct state.
[[CPRunLoop currentRunLoop] performSelector:@selector(reflectScrolledClipView:) target:self argument:_contentView order:0 modes:[CPDefaultRunLoopMode]];
}
return self;
}
- (void)encodeWithCoder:(CPCoder)aCoder
{
[super encodeWithCoder:aCoder];
[aCoder encodeObject:_contentView forKey:CPScrollViewContentViewKey];
[aCoder encodeObject:_headerClipView forKey:CPScrollViewHeaderClipViewKey];
[aCoder encodeObject:_verticalScroller forKey:CPScrollViewVScrollerKey];
[aCoder encodeObject:_horizontalScroller forKey:CPScrollViewHScrollerKey];
[aCoder encodeFloat:_verticalLineScroll forKey:CPScrollViewVLineScrollKey];
[aCoder encodeFloat:_verticalPageScroll forKey:CPScrollViewVPageScrollKey];
[aCoder encodeFloat:_horizontalLineScroll forKey:CPScrollViewHLineScrollKey];
[aCoder encodeFloat:_horizontalPageScroll forKey:CPScrollViewHPageScrollKey];
[aCoder encodeBool:_hasVerticalScroller forKey:CPScrollViewHasVScrollerKey];
[aCoder encodeBool:_hasHorizontalScroller forKey:CPScrollViewHasHScrollerKey];
[aCoder encodeBool:_autohidesScrollers forKey:CPScrollViewAutohidesScrollerKey];
[aCoder encodeObject:_cornerView forKey:CPScrollViewCornerViewKey];
}
@end
+269 -322
View File
@@ -20,7 +20,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
import "CPControl.j"
@import "CPControl.j"
#include "CoreGraphics/CGGeometry.h"
@@ -41,38 +41,20 @@ CPNoScrollerParts = 0;
CPOnlyScrollerArrows = 1;
CPAllScrollerParts = 2;
var _CPScrollerWidths = [],
_CPScrollerKnobMinimumHeights = [],
_CPScrollerArrowHeights = [],
_CPScrollerArrowUsableHeights = [];
/*!
@ingroup appkit
@class CPScroller
*/
_CPScrollerWidths[CPRegularControlSize] = 14.0;
_CPScrollerWidths[CPSmallControlSize] = 11.0;
_CPScrollerWidths[CPMiniControlSize] = 11.0; // FIXME
_CPScrollerKnobMinimumHeights[CPRegularControlSize] = 18.0;
_CPScrollerKnobMinimumHeights[CPSmallControlSize] = 12.0;
_CPScrollerKnobMinimumHeights[CPMiniControlSize] = 12.0; // FIXME
var PARTS_ARRANGEMENT = [CPScrollerKnobSlot, CPScrollerDecrementLine, CPScrollerIncrementLine, CPScrollerKnob],
NAMES_FOR_PARTS = {},
PARTS_FOR_NAMES = {};
_CPScrollerArrowHeights[CPRegularControlSize] = 21.0;
_CPScrollerArrowHeights[CPSmallControlSize] = 16.0;
_CPScrollerArrowHeights[CPMiniControlSize] = 16.0; // FIXME
NAMES_FOR_PARTS[CPScrollerDecrementLine] = @"decrement-line";
NAMES_FOR_PARTS[CPScrollerIncrementLine] = @"increment-line";
NAMES_FOR_PARTS[CPScrollerKnobSlot] = @"knob-slot";
NAMES_FOR_PARTS[CPScrollerKnob] = @"knob";
_CPScrollerArrowUsableHeights[CPRegularControlSize] = 16.0
_CPScrollerArrowUsableHeights[CPSmallControlSize] = 10.0;
_CPScrollerArrowUsableHeights[CPMiniControlSize] = 10.0; // FIXME
var _CPScrollerKnobIdentifier = @"Knob",
_CPScrollerKnobSlotIdentifier = @"KnobSlot",
_CPScrollerDecrementArrowIdentifier = @"DecrementArrow",
_CPScrollerIncrementArrowIdentifier = @"IncrementArrow",
_CPScrollerHorizontalIdentifier = @"Horizontal",
_CPScrollerVerticalIdentifier = @"Vertical",
_CPScrollerHighlightedIdentifier = @"Highlighted",
_CPScrollerDisabledIdentifier = @"Disabled";
var _CPScrollerClassName = nil,
_CPScrollerPartSizes = {};
@implementation CPScroller : CPControl
{
@@ -80,105 +62,37 @@ var _CPScrollerClassName = nil,
CPUsableScrollerParts _usableParts;
CPArray _partRects;
BOOL _isHorizontal;
BOOL _isVertical @accessors(readonly, getter=isVertical);
float _knobProportion;
CPScrollerPart _hitPart;
CPScrollerPart _trackingPart;
float _trackingFloatValue;
CGPoint _trackingStartPoint;
CPView _knobView;
CPView _knobSlotView;
CPView _decrementArrowView;
CPView _incrementArrowView;
}
/*
@ignore
*/
+ (void)initialize
+ (CPString)themeClass
{
if (self != [CPScroller class])
return;
_CPScrollerClassName = [self className];
var regularIdentifier = _CPControlIdentifierForControlSize(CPRegularControlSize),
smallIdentifier = _CPControlIdentifierForControlSize(CPSmallControlSize),
miniIdentifier = _CPControlIdentifierForControlSize(CPMiniControlSize);
// Horizontal Knob Sizes
var prefix = _CPScrollerClassName + _CPScrollerKnobIdentifier + _CPScrollerHorizontalIdentifier;
_CPScrollerPartSizes[prefix + regularIdentifier] = [_CGSizeMake(9.0, _CPScrollerWidths[CPRegularControlSize]), _CGSizeMake(1.0, _CPScrollerWidths[CPRegularControlSize]), _CGSizeMake(9.0, _CPScrollerWidths[CPRegularControlSize])];
_CPScrollerPartSizes[prefix + smallIdentifier] = [_CGSizeMake(6.0, _CPScrollerWidths[CPSmallControlSize]), _CGSizeMake(1.0, _CPScrollerWidths[CPSmallControlSize]), _CGSizeMake(6.0, _CPScrollerWidths[CPSmallControlSize])];
_CPScrollerPartSizes[prefix + miniIdentifier] = [_CGSizeMake(6.0, _CPScrollerWidths[CPMiniControlSize]), _CGSizeMake(1.0, _CPScrollerWidths[CPMiniControlSize]), _CGSizeMake(6.0, _CPScrollerWidths[CPMiniControlSize])];
// Vertical Knob Sizes
var prefix = _CPScrollerClassName + _CPScrollerKnobIdentifier + _CPScrollerVerticalIdentifier;
_CPScrollerPartSizes[prefix + regularIdentifier] = [_CGSizeMake(_CPScrollerWidths[CPRegularControlSize], 9.0), _CGSizeMake(_CPScrollerWidths[CPRegularControlSize], 1.0), _CGSizeMake(_CPScrollerWidths[CPRegularControlSize], 9.0)];
_CPScrollerPartSizes[prefix + smallIdentifier] = [_CGSizeMake(_CPScrollerWidths[CPSmallControlSize], 6.0), _CGSizeMake(_CPScrollerWidths[CPSmallControlSize], 1.0), _CGSizeMake(_CPScrollerWidths[CPSmallControlSize], 6.0)];
_CPScrollerPartSizes[prefix + miniIdentifier] = [_CGSizeMake(_CPScrollerWidths[CPMiniControlSize], 6.0), _CGSizeMake(_CPScrollerWidths[CPMiniControlSize], 1.0), _CGSizeMake(_CPScrollerWidths[CPMiniControlSize], 6.0)];
// Horizontal Knob Slot Sizes
var prefix = _CPScrollerClassName + _CPScrollerKnobSlotIdentifier + _CPScrollerHorizontalIdentifier;
_CPScrollerPartSizes[prefix + regularIdentifier] = _CGSizeMake(1.0, _CPScrollerWidths[CPRegularControlSize]);
_CPScrollerPartSizes[prefix + smallIdentifier] = _CGSizeMake(1.0, _CPScrollerWidths[CPSmallControlSize]);
_CPScrollerPartSizes[prefix + miniIdentifier] = _CGSizeMake(1.0, _CPScrollerWidths[CPMiniControlSize]);
// Vertical Knob Slot Sizes
var prefix = _CPScrollerClassName + _CPScrollerKnobSlotIdentifier + _CPScrollerVerticalIdentifier;
_CPScrollerPartSizes[prefix + regularIdentifier] = _CGSizeMake(_CPScrollerWidths[CPRegularControlSize], 1.0);
_CPScrollerPartSizes[prefix + smallIdentifier] = _CGSizeMake(_CPScrollerWidths[CPSmallControlSize], 1.0);
_CPScrollerPartSizes[prefix + miniIdentifier] = _CGSizeMake(_CPScrollerWidths[CPMiniControlSize], 1.0);
// Horizontal Decrement Arrows Sizes
var prefix = _CPScrollerClassName + _CPScrollerDecrementArrowIdentifier + _CPScrollerHorizontalIdentifier;
_CPScrollerPartSizes[prefix + regularIdentifier] = _CGSizeMake(_CPScrollerArrowHeights[CPRegularControlSize], _CPScrollerWidths[CPRegularControlSize]);
_CPScrollerPartSizes[prefix + regularIdentifier + _CPScrollerHighlightedIdentifier] = _CGSizeMake(_CPScrollerArrowHeights[CPRegularControlSize], _CPScrollerWidths[CPRegularControlSize]);
_CPScrollerPartSizes[prefix + smallIdentifier] = _CGSizeMake(_CPScrollerArrowHeights[CPSmallControlSize] , _CPScrollerWidths[CPSmallControlSize]);
_CPScrollerPartSizes[prefix + smallIdentifier + _CPScrollerHighlightedIdentifier] = _CGSizeMake(_CPScrollerArrowHeights[CPSmallControlSize] , _CPScrollerWidths[CPSmallControlSize]);
_CPScrollerPartSizes[prefix + miniIdentifier] = _CGSizeMake(_CPScrollerArrowHeights[CPMiniControlSize], _CPScrollerWidths[CPMiniControlSize]);
_CPScrollerPartSizes[prefix + miniIdentifier + _CPScrollerHighlightedIdentifier] = _CGSizeMake(_CPScrollerArrowHeights[CPMiniControlSize], _CPScrollerWidths[CPMiniControlSize]);
// Vertical Decrement Arrows Sizes
var prefix = _CPScrollerClassName + _CPScrollerDecrementArrowIdentifier + _CPScrollerVerticalIdentifier;
_CPScrollerPartSizes[prefix + regularIdentifier] = _CGSizeMake(_CPScrollerWidths[CPRegularControlSize], _CPScrollerArrowHeights[CPRegularControlSize]);
_CPScrollerPartSizes[prefix + regularIdentifier + _CPScrollerHighlightedIdentifier] = _CGSizeMake(_CPScrollerWidths[CPRegularControlSize], _CPScrollerArrowHeights[CPRegularControlSize]);
_CPScrollerPartSizes[prefix + smallIdentifier] = _CGSizeMake(_CPScrollerWidths[CPSmallControlSize], _CPScrollerArrowHeights[CPSmallControlSize]);
_CPScrollerPartSizes[prefix + smallIdentifier + _CPScrollerHighlightedIdentifier] = _CGSizeMake(_CPScrollerWidths[CPSmallControlSize], _CPScrollerArrowHeights[CPSmallControlSize]);
_CPScrollerPartSizes[prefix + miniIdentifier] = _CGSizeMake(_CPScrollerWidths[CPMiniControlSize], _CPScrollerArrowHeights[CPMiniControlSize]);
_CPScrollerPartSizes[prefix + miniIdentifier + _CPScrollerHighlightedIdentifier] = _CGSizeMake(_CPScrollerWidths[CPMiniControlSize], _CPScrollerArrowHeights[CPMiniControlSize]);
// Horizontal Increment Arrows Sizes
var prefix = _CPScrollerClassName + _CPScrollerIncrementArrowIdentifier + _CPScrollerHorizontalIdentifier;
_CPScrollerPartSizes[prefix + regularIdentifier] = _CGSizeMake(_CPScrollerArrowHeights[CPRegularControlSize], _CPScrollerWidths[CPRegularControlSize]);
_CPScrollerPartSizes[prefix + regularIdentifier + _CPScrollerHighlightedIdentifier] = _CGSizeMake(_CPScrollerArrowHeights[CPRegularControlSize], _CPScrollerWidths[CPRegularControlSize]);
_CPScrollerPartSizes[prefix + smallIdentifier] = _CGSizeMake(_CPScrollerArrowHeights[CPSmallControlSize], _CPScrollerWidths[CPSmallControlSize]);
_CPScrollerPartSizes[prefix + smallIdentifier + _CPScrollerHighlightedIdentifier] = _CGSizeMake(_CPScrollerArrowHeights[CPSmallControlSize], _CPScrollerWidths[CPSmallControlSize]);
_CPScrollerPartSizes[prefix + miniIdentifier] = _CGSizeMake(_CPScrollerArrowHeights[CPMiniControlSize], _CPScrollerWidths[CPMiniControlSize]);
_CPScrollerPartSizes[prefix + miniIdentifier + _CPScrollerHighlightedIdentifier] = _CGSizeMake(_CPScrollerArrowHeights[CPMiniControlSize], _CPScrollerWidths[CPMiniControlSize]);
// Vertical Increment Arrows Sizes
var prefix = _CPScrollerClassName + _CPScrollerIncrementArrowIdentifier + _CPScrollerVerticalIdentifier;
_CPScrollerPartSizes[prefix + regularIdentifier] = _CGSizeMake(_CPScrollerWidths[CPRegularControlSize], _CPScrollerArrowHeights[CPRegularControlSize]);
_CPScrollerPartSizes[prefix + regularIdentifier + _CPScrollerHighlightedIdentifier] = _CGSizeMake(_CPScrollerWidths[CPRegularControlSize], _CPScrollerArrowHeights[CPRegularControlSize]);
_CPScrollerPartSizes[prefix + smallIdentifier] = _CGSizeMake(_CPScrollerWidths[CPSmallControlSize], _CPScrollerArrowHeights[CPSmallControlSize]);
_CPScrollerPartSizes[prefix + smallIdentifier + _CPScrollerHighlightedIdentifier] = _CGSizeMake(_CPScrollerWidths[CPSmallControlSize], _CPScrollerArrowHeights[CPSmallControlSize]);
_CPScrollerPartSizes[prefix + miniIdentifier] = _CGSizeMake(_CPScrollerWidths[CPMiniControlSize], _CPScrollerArrowHeights[CPMiniControlSize]);
_CPScrollerPartSizes[prefix + miniIdentifier + _CPScrollerHighlightedIdentifier] = _CGSizeMake(_CPScrollerWidths[CPMiniControlSize], _CPScrollerArrowHeights[CPMiniControlSize]);
return "scroller";
}
+ (id)themeAttributes
{
return [CPDictionary dictionaryWithObjects:[ [CPNull null], [CPNull null], [CPNull null], [CPNull null],
_CGSizeMakeZero(), _CGSizeMakeZero(), _CGInsetMakeZero(), _CGInsetMakeZero(), _CGSizeMakeZero()]
forKeys:[ @"knob-slot-color",
@"decrement-line-color",
@"increment-line-color",
@"knob-color",
@"decrement-line-size",
@"increment-line-size",
@"track-inset",
@"knob-inset",
@"minimum-knob-length"]];
}
// Calculating Layout
- (id)initWithFrame:(CGRect)aFrame
@@ -190,40 +104,36 @@ var _CPScrollerClassName = nil,
_controlSize = CPRegularControlSize;
_partRects = [];
[self setFloatValue:0.0 knobProportion:1.0];
_isHorizontal = CPRectGetWidth(aFrame) > CPRectGetHeight(aFrame);
[self setFloatValue:0.0];
[self setKnobProportion:1.0];
_hitPart = CPScrollerNoPart;
[self checkSpaceForParts];
[self drawParts];
[self layoutSubviews];
[self _calculateIsVertical];
}
return self;
}
// Determining CPScroller Size
/*
Returns the <objj>CPScroller</objj>'s width for a <objj>CPRegularControlSize</objj>.
/*!
Returns the CPScroller's width for a CPRegularControlSize.
*/
+ (float)scrollerWidth
{
return [self scrollerWidthForControlSize:CPRegularControlSize];
return 15.0;//[self scrollerWidthForControlSize:CPRegularControlSize];
}
/*
Returns the width of a <objj>CPScroller</objj> for the specified <objj>CPControlSize</objj>.
/*!
Returns the width of a CPScroller for the specified CPControlSize.
@param aControlSize the size of a controller to return the width for
*/
+ (float)scrollerWidthForControlSize:(CPControlSize)aControlSize
{
return _CPScrollerWidths[aControlSize];
return 15.0;//_CPScrollerWidths[aControlSize];
}
/*
/*!
Sets the scroller's size.
@param aControlSize the scroller's size
*/
@@ -234,15 +144,11 @@ var _CPScrollerClassName = nil,
_controlSize = aControlSize;
[self drawKnobSlot];
[self drawKnob];
[self drawArrow:CPScrollerDecrementArrow highlight:NO];
[self drawArrow:CPScrollerIncrementArrow highlight:NO];
[self layoutSubviews];
[self setNeedsLayout];
[self setNeedsDisplay:YES];
}
/*
/*!
Returns the scroller's control size
*/
- (CPControlSize)controlSize
@@ -250,32 +156,20 @@ var _CPScrollerClassName = nil,
return _controlSize;
}
// Setting the Knob Position
/*
Sets the scroller's knob position (ranges from 0.0 to 1.0).
@param aValue the knob position (ranges from 0.0 to 1.0)
*/
- (void)setFloatValue:(float)aValue
- (void)setObjectValue:(id)aValue
{
[super setFloatValue:MIN(1.0, MAX(0.0, aValue))];
[self checkSpaceForParts];
[self layoutSubviews];
[super setObjectValue:MIN(1.0, MAX(0.0, +aValue))];
}
/*
Sets the position and proportion of the knob.
@param aValue the knob position (ranges from 0.0 to 1.0)
@param aProportion the knob's proportion (ranges from 0.0 to 1.0)
*/
- (void)setFloatValue:(float)aValue knobProportion:(float)aProportion
- (void)setKnobProportion:(float)aProportion
{
_knobProportion = MIN(1.0, MAX(0.0001, aProportion));
[self setFloatValue:aValue];
[self setNeedsDisplay:YES];
[self setNeedsLayout];
}
/*
/*!
Return's the knob's proportion
*/
- (float)knobProportion
@@ -283,6 +177,16 @@ var _CPScrollerClassName = nil,
return _knobProportion;
}
- (id)currentValueForThemeAttribute:(CPString)anAttributeName
{
var themeState = _themeState;
if (NAMES_FOR_PARTS[_hitPart] + "-color" !== anAttributeName)
themeState &= ~CPThemeStateHighlighted;
return [self valueForThemeAttribute:anAttributeName inState:themeState];
}
// Calculating Layout
- (CGRect)rectForPart:(CPScrollerPart)aPart
@@ -293,8 +197,8 @@ var _CPScrollerClassName = nil,
return _partRects[aPart];
}
/*
Returns the part of the scroller that would be hit by <code>aPoint</code>.
/*!
Returns the part of the scroller that would be hit by \c aPoint.
@param aPoint the simulated point hit
@return the part of the scroller that intersects the point
*/
@@ -326,67 +230,100 @@ var _CPScrollerClassName = nil,
return CPScrollerNoPart;
}
/*
/*!
Check if there's enough space in the scroller to display the knob
*/
- (void)checkSpaceForParts
{
var bounds = [self bounds];
var bounds = [self bounds];
// Assume we won't be needing the arrows.
if (_knobProportion == 1.0)
if (_knobProportion === 1.0)
{
_usableParts = CPNoScrollerParts;
_partRects[CPScrollerDecrementPage] = _CGRectMakeZero();
_partRects[CPScrollerKnob] = _CGRectMakeZero();
_partRects[CPScrollerIncrementPage] = _CGRectMakeZero();
_partRects[CPScrollerDecrementLine] = _CGRectMakeZero();
_partRects[CPScrollerIncrementLine] = _CGRectMakeZero();
_partRects[CPScrollerDecrementPage] = CGRectMakeZero();
_partRects[CPScrollerKnob] = CGRectMakeZero();
_partRects[CPScrollerIncrementPage] = CGRectMakeZero();
_partRects[CPScrollerDecrementLine] = CGRectMakeZero();
_partRects[CPScrollerIncrementLine] = CGRectMakeZero();
// In this case, the slot is the entirety of the scroller.
_partRects[CPScrollerKnobSlot] = _CGRectMakeCopy(bounds);
_partRects[CPScrollerKnobSlot] = CGRectMakeCopy(bounds);
return;
}
var width = _CGRectGetWidth(bounds),
height = _CGRectGetHeight(bounds),
usableArrowHeight = _CPScrollerArrowUsableHeights[_controlSize],
slotWidth = (_isHorizontal ? width : height) - 2.0 * usableArrowHeight,
knobWidth = MAX(_CPScrollerKnobMinimumHeights[_controlSize], (slotWidth * _knobProportion));
_usableParts = CPAllScrollerParts;
var arrowHeight = _CPScrollerArrowHeights[_controlSize],
knobLocation = usableArrowHeight + (slotWidth - knobWidth) * [self floatValue];
// At this point we know we're going to need arrows.
if (_isHorizontal)
_usableParts = CPAllScrollerParts;
var knobInset = [self currentValueForThemeAttribute:@"knob-inset"],
trackInset = [self currentValueForThemeAttribute:@"track-inset"],
width = _CGRectGetWidth(bounds),
height = _CGRectGetHeight(bounds);
if ([self isVertical])
{
// ASSERT(_CPScrollerWidths[_controlSize] == height)
var decrementLineSize = [self currentValueForThemeAttribute:"decrement-line-size"],
incrementLineSize = [self currentValueForThemeAttribute:"increment-line-size"],
effectiveDecrementLineHeight = decrementLineSize.height + trackInset.top,
effectiveIncrementLineHeight = incrementLineSize.height + trackInset.bottom,
slotHeight = height - effectiveDecrementLineHeight - effectiveIncrementLineHeight,
minimumKnobLength = [self currentValueForThemeAttribute:"minimum-knob-length"],
knobWidth = width - knobInset.left - knobInset.right,
knobHeight = MAX(minimumKnobLength, (slotHeight * _knobProportion)),
knobLocation = effectiveDecrementLineHeight + (slotHeight - knobHeight) * [self floatValue];
_partRects[CPScrollerDecrementPage] = _CGRectMake(0.0, effectiveDecrementLineHeight, width, knobLocation - effectiveDecrementLineHeight);
_partRects[CPScrollerKnob] = _CGRectMake(knobInset.left, knobLocation, knobWidth, knobHeight);
_partRects[CPScrollerIncrementPage] = _CGRectMake(0.0, knobLocation + knobHeight, width, height - (knobLocation + knobHeight) - effectiveIncrementLineHeight);
_partRects[CPScrollerKnobSlot] = _CGRectMake(trackInset.left, effectiveDecrementLineHeight, width - trackInset.left - trackInset.right, slotHeight);
_partRects[CPScrollerDecrementLine] = _CGRectMake(0.0, 0.0, decrementLineSize.width, decrementLineSize.height);
_partRects[CPScrollerIncrementLine] = _CGRectMake(0.0, height - incrementLineSize.height, incrementLineSize.width, incrementLineSize.height);
_partRects[CPScrollerDecrementPage] = _CGRectMake(usableArrowHeight, 0.0, knobLocation - usableArrowHeight, height);
_partRects[CPScrollerKnob] = _CGRectMake(knobLocation, 0.0, knobWidth, _CPScrollerWidths[_controlSize]);
_partRects[CPScrollerIncrementPage] = _CGRectMake(knobLocation + knobWidth, 0.0, width - (knobLocation + knobWidth) - usableArrowHeight, height);
_partRects[CPScrollerKnobSlot] = _CGRectMake(usableArrowHeight, 0.0, slotWidth, height);
_partRects[CPScrollerDecrementLine] = _CGRectMake(0.0, 0.0, arrowHeight, height);
_partRects[CPScrollerIncrementLine] = _CGRectMake(width - _CPScrollerArrowHeights[_controlSize], 0.0, arrowHeight, height);
}
if(height < knobHeight + decrementLineSize.height + incrementLineSize.height + trackInset.top + trackInset.bottom)
_partRects[CPScrollerKnob] = _CGRectMakeZero();
if(height < decrementLineSize.height + incrementLineSize.height - 2)
{
_partRects[CPScrollerIncrementLine] = _CGRectMakeZero();
_partRects[CPScrollerDecrementLine] = _CGRectMakeZero();
_partRects[CPScrollerKnobSlot] = _CGRectMake(trackInset.left, 0, width - trackInset.left - trackInset.right, height);
}
}
else
{
// ASSERT(_CPScrollerWidths[_controlSize] == width)
var decrementLineSize = [self currentValueForThemeAttribute:"decrement-line-size"],
incrementLineSize = [self currentValueForThemeAttribute:"increment-line-size"],
effectiveDecrementLineWidth = decrementLineSize.width + trackInset.left,
effectiveIncrementLineWidth = incrementLineSize.width + trackInset.right;
slotWidth = width - effectiveDecrementLineWidth - effectiveIncrementLineWidth,
minimumKnobLength = [self currentValueForThemeAttribute:"minimum-knob-length"],
knobWidth = MAX(minimumKnobLength, (slotWidth * _knobProportion)),
knobHeight = height - knobInset.top - knobInset.bottom,
knobLocation = effectiveDecrementLineWidth + (slotWidth - knobWidth) * [self floatValue];
_partRects[CPScrollerDecrementPage] = _CGRectMake(effectiveDecrementLineWidth, 0.0, knobLocation - effectiveDecrementLineWidth, height);
_partRects[CPScrollerKnob] = _CGRectMake(knobLocation, knobInset.top, knobWidth, knobHeight);
_partRects[CPScrollerIncrementPage] = _CGRectMake(knobLocation + knobWidth, 0.0, width - (knobLocation + knobWidth) - effectiveIncrementLineWidth, height);
_partRects[CPScrollerKnobSlot] = _CGRectMake(effectiveDecrementLineWidth, trackInset.top, slotWidth, height - trackInset.top - trackInset.bottom);
_partRects[CPScrollerDecrementLine] = _CGRectMake(0.0, 0.0, decrementLineSize.width, decrementLineSize.height);
_partRects[CPScrollerIncrementLine] = _CGRectMake(width - incrementLineSize.width, 0.0, incrementLineSize.width, incrementLineSize.height);
_partRects[CPScrollerDecrementPage] = _CGRectMake(0.0, usableArrowHeight, width, knobLocation - usableArrowHeight);
_partRects[CPScrollerKnob] = _CGRectMake(0.0, knobLocation, _CPScrollerWidths[_controlSize], knobWidth);
_partRects[CPScrollerIncrementPage] = _CGRectMake(0.0, knobLocation + knobWidth, width, height - (knobLocation + knobWidth) - usableArrowHeight);
_partRects[CPScrollerKnobSlot] = _CGRectMake(0.0, usableArrowHeight, width, slotWidth);
_partRects[CPScrollerDecrementLine] = _CGRectMake(0.0, 0.0, width, arrowHeight);
_partRects[CPScrollerIncrementLine] = _CGRectMake(0.0, height - _CPScrollerArrowHeights[_controlSize], width, arrowHeight);
if(width < knobWidth + decrementLineSize.width + incrementLineSize.width + trackInset.left + trackInset.right)
_partRects[CPScrollerKnob] = _CGRectMakeZero();
if(width < decrementLineSize.width + incrementLineSize.width - 2)
{
_partRects[CPScrollerIncrementLine] = _CGRectMakeZero();
_partRects[CPScrollerDecrementLine] = _CGRectMakeZero();
_partRects[CPScrollerKnobSlot] = _CGRectMake(0.0, 0.0, width, slotHeight);
}
}
}
/*
/*!
Returns all the parts of the scroller that
are usable for displaying.
*/
@@ -396,107 +333,86 @@ var _CPScrollerClassName = nil,
}
// Drawing the Parts
/*
/*!
Draws the specified arrow and sets the highlight.
@param anArrow the arrow to draw
@param shouldHighlight sets whether the arrow should be highlighted
*/
- (void)drawArrow:(CPScrollerArrow)anArrow highlight:(BOOL)shouldHighlight
{
var identifier = (anArrow == CPScrollerDecrementArrow ? _CPScrollerDecrementArrowIdentifier : _CPScrollerIncrementArrowIdentifier),
arrowView = (anArrow == CPScrollerDecrementArrow ? _decrementArrowView : _incrementArrowView);
[arrowView setBackgroundColor:_CPControlColorWithPatternImage(
_CPScrollerPartSizes,
_CPScrollerClassName,
identifier,
_isHorizontal ? _CPScrollerHorizontalIdentifier : _CPScrollerVerticalIdentifier,
_CPControlIdentifierForControlSize(_controlSize),
shouldHighlight ? _CPScrollerHighlightedIdentifier : @"")];
}
/*
/*!
Draws the knob
*/
- (void)drawKnob
{
[_knobView setBackgroundColor:_CPControlThreePartImagePattern(
!_isHorizontal,
_CPScrollerPartSizes,
_CPScrollerClassName,
_CPScrollerKnobIdentifier,
_isHorizontal ? _CPScrollerHorizontalIdentifier : _CPScrollerVerticalIdentifier,
_CPControlIdentifierForControlSize(_controlSize))];
}
/*
/*!
Draws the knob's slot
*/
- (void)drawKnobSlot
{
[_knobSlotView setBackgroundColor:_CPControlColorWithPatternImage(
_CPScrollerPartSizes,
_CPScrollerClassName,
_CPScrollerKnobSlotIdentifier,
_isHorizontal ? _CPScrollerHorizontalIdentifier : _CPScrollerVerticalIdentifier,
_CPControlIdentifierForControlSize(_controlSize))];
}
/*
- (CPView)createViewForPart:(CPScrollerPart)aPart
{
var view = [[CPView alloc] initWithFrame:_CGRectMakeZero()];
[view setHitTests:NO];
return view;
}
- (CGRect)rectForEphemeralSubviewNamed:(CPString)aName
{
return _partRects[aName];
}
- (CPView)createEphemeralSubviewNamed:(CPString)aName
{
var view = [[CPView alloc] initWithFrame:_CGRectMakeZero()];
[view setHitTests:NO];
return view;
}
- (void)layoutSubviews
{
[self checkSpaceForParts];
var index = 0,
count = PARTS_ARRANGEMENT.length;
for (; index < count; ++index)
{
var part = PARTS_ARRANGEMENT[index];
if (index === 0)
view = [self layoutEphemeralSubviewNamed:part positioned:CPWindowBelow relativeToEphemeralSubviewNamed:PARTS_ARRANGEMENT[index + 1]];
else
view = [self layoutEphemeralSubviewNamed:part positioned:CPWindowAbove relativeToEphemeralSubviewNamed:PARTS_ARRANGEMENT[index - 1]];
if (view)
[view setBackgroundColor:[self currentValueForThemeAttribute:NAMES_FOR_PARTS[part] + "-color"]];
}
}
/*!
Caches images for the scroll arrow and knob.
*/
- (void)drawParts
{
_knobSlotView = [[CPView alloc] initWithFrame:_CGRectMakeZero()];
[_knobSlotView setHitTests:NO];
[self addSubview:_knobSlotView];
{
[self drawKnobSlot];
_knobView = [[CPView alloc] initWithFrame:_CGRectMakeZero()];
[_knobView setHitTests:NO];
[self addSubview:_knobView];
[self drawKnob];
_decrementArrowView = [[CPView alloc] initWithFrame:_CGRectMakeZero()];
[_decrementArrowView setHitTests:NO];
[self addSubview:_decrementArrowView];
[self drawArrow:CPScrollerDecrementArrow highlight:NO];
_incrementArrowView = [[CPView alloc] initWithFrame:_CGRectMakeZero()];
[_incrementArrowView setHitTests:NO];
[self addSubview:_incrementArrowView];
[self drawArrow:CPScrollerIncrementArrow highlight:NO];
}
/*
Draws the scroller's arrow with a possible highlight,
if the user's mouse is over it.
@param shouldHighlight <code>YES</code> will draw the
arrow highlighted if the mouse is hovering over it.
*/
- (void)highlight:(BOOL)shouldHighlight
{
if (_trackingPart == CPScrollerDecrementLine)
[self drawArrow:CPScrollerDecrementArrow highlight:shouldHighlight];
else if (_trackingPart == CPScrollerIncrementLine)
[self drawArrow:CPScrollerIncrementArrow highlight:shouldHighlight];
}
// Event Handling
/*
/*!
Returns the part of the scroller that was hit.
*/
- (CPScrollerPart)hitPart
@@ -504,7 +420,7 @@ var _CPScrollerClassName = nil,
return _hitPart;
}
/*
/*!
Tracks the knob.
@param anEvent the input event
*/
@@ -512,31 +428,31 @@ var _CPScrollerClassName = nil,
{
var type = [anEvent type];
if (type == CPLeftMouseUp)
if (type === CPLeftMouseUp)
{
_hitPart = CPScrollerNoPart;
return;
}
if (type == CPLeftMouseDown)
if (type === CPLeftMouseDown)
{
_trackingFloatValue = [self floatValue];
_trackingStartPoint = [self convertPoint:[anEvent locationInWindow] fromView:nil];
}
else if (type == CPLeftMouseDragged)
else if (type === CPLeftMouseDragged)
{
var knobRect = [self rectForPart:CPScrollerKnob],
knobSlotRect = [self rectForPart:CPScrollerKnobSlot],
remainder = _isHorizontal ? (_CGRectGetWidth(knobSlotRect) - _CGRectGetWidth(knobRect)) : (_CGRectGetHeight(knobSlotRect) - _CGRectGetHeight(knobRect));
remainder = ![self isVertical] ? (_CGRectGetWidth(knobSlotRect) - _CGRectGetWidth(knobRect)) : (_CGRectGetHeight(knobSlotRect) - _CGRectGetHeight(knobRect));
if (remainder <= 0)
[self setFloatValue:0.0];
else
{
var location = [self convertPoint:[anEvent locationInWindow] fromView:nil];
delta = _isHorizontal ? location.x - _trackingStartPoint.x : location.y - _trackingStartPoint.y;
delta = ![self isVertical] ? location.x - _trackingStartPoint.x : location.y - _trackingStartPoint.y;
[self setFloatValue:_trackingFloatValue + delta / remainder];
}
@@ -547,7 +463,7 @@ var _CPScrollerClassName = nil,
[self sendAction:[self action] to:[self target]];
}
/*
/*!
Tracks the scroll button.
@param anEvent the input event
*/
@@ -555,7 +471,7 @@ var _CPScrollerClassName = nil,
{
var type = [anEvent type];
if (type == CPLeftMouseUp)
if (type === CPLeftMouseUp)
{
[self highlight:NO];
[CPEvent stopPeriodicEvents];
@@ -565,7 +481,7 @@ var _CPScrollerClassName = nil,
return;
}
if (type == CPLeftMouseDown)
if (type === CPLeftMouseDown)
{
_trackingPart = [self hitPart];
@@ -575,16 +491,18 @@ var _CPScrollerClassName = nil,
{
if (_trackingPart == CPScrollerDecrementLine)
_hitPart = CPScrollerDecrementPage;
else if (_trackingPart == CPScrollerIncrementLine)
_hitPart = CPScrollerIncrementPage;
else if (_trackingPart == CPScrollerDecrementPage || _trackingPart == CPScrollerIncrementPage)
{
var knobRect = [self rectForPart:CPScrollerKnob],
knobWidth = _isHorizontal ? _CGRectGetWidth(knobRect) : _CGRectGetHeight(knobRect),
knobWidth = ![self isVertical] ? _CGRectGetWidth(knobRect) : _CGRectGetHeight(knobRect),
knobSlotRect = [self rectForPart:CPScrollerKnobSlot],
remainder = (_isHorizontal ? _CGRectGetWidth(knobSlotRect) : _CGRectGetHeight(knobSlotRect)) - knobWidth;
remainder = (![self isVertical] ? _CGRectGetWidth(knobSlotRect) : _CGRectGetHeight(knobSlotRect)) - knobWidth;
[self setFloatValue:((_isHorizontal ? _trackingStartPoint.x - _CGRectGetMinX(knobSlotRect) : _trackingStartPoint.y - _CGRectGetMinY(knobSlotRect)) - knobWidth / 2.0) / remainder];
[self setFloatValue:((![self isVertical] ? _trackingStartPoint.x - _CGRectGetMinX(knobSlotRect) : _trackingStartPoint.y - _CGRectGetMinY(knobSlotRect)) - knobWidth / 2.0) / remainder];
_hitPart = CPScrollerKnob;
@@ -601,7 +519,7 @@ var _CPScrollerClassName = nil,
[CPEvent startPeriodicEventsAfterDelay:0.5 withPeriod:0.04];
}
else if (type == CPLeftMouseDragged)
else if (type === CPLeftMouseDragged)
{
_trackingStartPoint = [self convertPoint:[anEvent locationInWindow] fromView:nil];
@@ -625,52 +543,34 @@ var _CPScrollerClassName = nil,
}
- (void)_calculateIsVertical
{
// Recalculate isVertical.
var bounds = [self bounds],
width = _CGRectGetWidth(bounds),
height = _CGRectGetHeight(bounds);
_isVertical = width < height ? 1 : (width > height ? 0 : -1);
if (_isVertical === 1)
[self setThemeState:CPThemeStateVertical];
else if (_isVertical === 0)
[self unsetThemeState:CPThemeStateVertical];
}
- (void)setFrameSize:(CGSize)aSize
{
[super setFrameSize:aSize];
[self checkSpaceForParts];
var frame = [self frame],
isHorizontal = CPRectGetWidth(frame) > CPRectGetHeight(frame);
if (_isHorizontal != isHorizontal)
{
_isHorizontal = isHorizontal;
[self drawParts];
}
[self layoutSubviews];
}
/*
Lays out the scrollers subviews
*/
- (void)layoutSubviews
{
[_knobSlotView setFrame:[self rectForPart:CPScrollerKnobSlot]];
var usableParts = [self usableParts],
hidden = !(usableParts == CPAllScrollerParts);
if (hidden != [_knobView isHidden])
{
[_knobView setHidden:hidden];
[_decrementArrowView setHidden:hidden];
[_incrementArrowView setHidden:hidden];
}
if (!hidden)
{
[_knobView setFrame:[self rectForPart:CPScrollerKnob]];
[_decrementArrowView setFrame:[self rectForPart:CPScrollerDecrementLine]];
[_incrementArrowView setFrame:[self rectForPart:CPScrollerIncrementLine]];
}
[self setNeedsLayout];
}
- (void)mouseDown:(CPEvent)anEvent
{
if (![self isEnabled])
return;
_hitPart = [self testPart:[anEvent locationInWindow]];
switch (_hitPart)
@@ -684,9 +584,56 @@ var _CPScrollerClassName = nil,
}
}
// FIXME: This is a result of the "dumb" code that just makes things transparent when disabled.
- (void)setEnabled:(BOOL)shouldBeEnabled
@end
var CPScrollerControlSizeKey = "CPScrollerControlSize",
CPScrollerKnobProportionKey = "CPScrollerKnobProportion";
@implementation CPScroller (CPCoding)
- (id)initWithCoder:(CPCoder)aCoder
{
if (self = [super initWithCoder:aCoder])
{
_controlSize = CPRegularControlSize;
if ([aCoder containsValueForKey:CPScrollerControlSizeKey])
_controlSize = [aCoder decodeIntForKey:CPScrollerControlSizeKey];
_knobProportion = 1.0;
if ([aCoder containsValueForKey:CPScrollerKnobProportionKey])
_knobProportion = [aCoder decodeFloatForKey:CPScrollerKnobProportionKey];
_partRects = [];
_hitPart = CPScrollerNoPart;
[self _calculateIsVertical];
}
return self;
}
- (void)encodeWithCoder:(CPCoder)aCoder
{
[super encodeWithCoder:aCoder];
[aCoder encodeInt:_controlSize forKey:CPScrollerControlSizeKey];
[aCoder encodeFloat:_knobProportion forKey:CPScrollerKnobProportionKey];
}
@end
@implementation CPScroller (Deprecated)
/*!
Sets the position and proportion of the knob.
@param aValue the knob position (ranges from 0.0 to 1.0)
@param aProportion the knob's proportion (ranges from 0.0 to 1.0)
*/
- (void)setFloatValue:(float)aValue knobProportion:(float)aProportion
{
[self setFloatValue:aValue];
[self setKnobProportion:aProportion];
}
@end
+742
View File
@@ -0,0 +1,742 @@
/*
* CPSearchField.j
* AppKit
*
* Created by cacaodev.
* Copyright 2009.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
@import "CPTextField.j"
#include "Platform/Platform.h"
/*!
@global
@group Menu tags
*/
CPSearchFieldRecentsTitleMenuItemTag = 1000;
/*!
@global
@group Menu tags
*/
CPSearchFieldRecentsMenuItemTag = 1001;
/*!
@global
@group Menu tags
*/
CPSearchFieldClearRecentsMenuItemTag = 1002;
/*!
@global
@group Menu tags
*/
CPSearchFieldNoRecentsMenuItemTag = 1003;
var CPSearchFieldSearchImage = nil,
CPSearchFieldFindImage = nil,
CPSearchFieldCancelImage = nil,
CPSearchFieldCancelPressedImage = nil;
/*!
@ingroup appkit
@class CPSearchField
The CPSearchField class defines the programmatic interface for text fields that are optimized for text-based searches. A CPSearchField object directly inherits from the CPTextField class. The search field implemented by these classes presents a standard user interface for searches, including a search button, a cancel button, and a pop-up icon menu for listing recent search strings and custom search categories.
When the user types and then pauses, the text field's action message is sent to its target. You can query the text field's string value for the current text to search for. Do not rely on the sender of the action to be an CPMenu object because the menu may change. If you need to change the menu, modify the search menu template and call the setSearchMenuTemplate: method to update.
*/
@implementation CPSearchField : CPTextField
{
CPButton _searchButton;
CPButton _cancelButton;
CPMenu _searchMenuTemplate;
CPMenu _searchMenu;
CPString _recentsAutosaveName;
CPArray _recentSearches;
int _maximumRecents;
BOOL _sendsWholeSearchString;
BOOL _sendsSearchStringImmediately;
CPTimer _partialStringTimer;
}
+ (void)initialize
{
if (self != [CPSearchField class])
return;
var bundle = [CPBundle bundleForClass:self];
CPSearchFieldSearchImage = [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPSearchField/CPSearchFieldSearch.png"]];
CPSearchFieldFindImage = [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPSearchField/CPSearchFieldFind.png"]];
CPSearchFieldCancelImage = [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPSearchField/CPSearchFieldCancel.png"]];
CPSearchFieldCancelPressedImage = [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPSearchField/CPSearchFieldCancelPressed.png"]];
}
- (id)initWithFrame:(CPRect)frame
{
self = [super initWithFrame:frame];
if (self != nil)
{
_recentSearches = [CPArray array];
_maximumRecents = 10;
_sendsWholeSearchString = NO;
_sendsSearchStringImmediately = NO;
_recentsAutosaveName = nil;
[self setBezeled:YES];
[self setBezelStyle:CPTextFieldRoundedBezel];
[self setBordered:YES];
[self setEditable:YES];
[self setDelegate:self];
_cancelButton = [[CPButton alloc] initWithFrame:CPMakeRect(frame.size.width - 27,(frame.size.height-22)/2,22,22)];
[self resetCancelButton];
[_cancelButton setHidden:YES];
[_cancelButton setAutoresizingMask:CPViewMinXMargin];
[self addSubview:_cancelButton];
_searchButton = [[CPButton alloc] initWithFrame:CPMakeRect(5,(frame.size.height-25)/2,25,25)];
[self resetSearchButton];
[self addSubview:_searchButton];
#if PLATFORM(DOM)
_cancelButton._DOMElement.style.cursor = "default";
_searchButton._DOMElement.style.cursor = "default";
#endif
}
return self;
}
- (id)copy
{
var copy = [super copy];
[copy setCancelButton:[_cancelButton copy]];
[copy setSearchButton:[_searchButton copy]];
[copy setSendsWholeSearchString:[_sendsWholeSearchString copy]];
[copy setSendsSearchStringImmediately:[_sendsSearchStringImmediately copy]];
[copy setMaximumRecents:_maximumRecents];
if (_recentsAutosaveName)
[copy setrecentsAutosaveName:[_recentsAutosaveName copy]];
if (_searchMenuTemplate)
[copy setSearchMenutemplate:[_searchMenuTemplate copy]];
return copy;
}
// Managing Buttons
/*!
Sets the button used to display the search-button image
@param button The search button.
*/
- (void)setSearchButton:(CPButton)button
{
_searchButton = button;
}
/*!
Returns the button used to display the search-button image.
@return The search button.
*/
- (CPButton)searchButton
{
return _searchButton;
}
/*!
Resets the search button to its default attributes.
This method resets the target, action, regular image, and pressed image. By default, when users click the search button or press the Return key, the action defined for the receiver is sent to its designated target. This method gives you a way to customize the search button for specific situations and then reset the button defaults without having to undo changes individually.
*/
- (void)resetSearchButton
{
var searchButtonImage,
action,
target,
button = [self searchButton];
if (_searchMenuTemplate === nil)
{
searchButtonImage = CPSearchFieldSearchImage;
action = @selector(_sendAction:);
target = self;
}
else
{
searchButtonImage = CPSearchFieldFindImage;
action = @selector(_showMenu:);
target = self;
}
[button setBordered:NO];
[button setImageScaling:CPScaleToFit];
[button setImage:searchButtonImage];
[button setAutoresizingMask:CPViewMaxXMargin];
[button setTarget:target];
[button setAction:action];
}
/*!
Sets the button object used to display the cancel-button image.
@param button The cancel button.
*/
- (void)setCancelButton:(CPButton)button
{
_cancelButton = button;
}
/*!
Returns the button object used to display the cancel-button image.
@return The cancel button.
*/
- (CPButton)cancelButton
{
return _cancelButton;
}
/*!
Resets the cancel button to its default attributes.
This method resets the target, action, regular image, and pressed image. By default, when users click the cancel button, the delete: action message is sent up the responder chain. This method gives you a way to customize the cancel button for specific situations and then reset the button defaults without having to undo changes individually.
*/
- (void)resetCancelButton
{
var button = [self cancelButton];
[button setBordered:NO];
[button setImageScaling:CPScaleToFit];
[button setImage:CPSearchFieldCancelImage];
[button setAlternateImage:CPSearchFieldCancelPressedImage];
[button setAutoresizingMask:CPViewMinXMargin];
[button setTarget:self];
[button setAction:@selector(_searchFieldCancel:)];
}
// Custom Layout
/*!
Modifies the bounding rectangle for the search-text field.
@param rect The current bounding rectangle for the search text field.
@return The updated bounding rectangle to use for the search text field. The default value is the value passed into the rect parameter.
Subclasses can override this method to return a new bounding rectangle for the text-field object. You might use this method to provide a custom layout for the search field control.
*/
- (CPRect)searchTextRectForBounds:(CPRect)rect
{
var leftOffset = 0, width = rect.size.width;
if (_searchButton)
{
var searchRect = [_searchButton frame];
leftOffset = searchRect.origin.x + searchRect.size.width;
}
if (_cancelButton)
{
var cancelRect = [_cancelButton frame];
width = cancelRect.origin.x - leftOffset;
}
return CPMakeRect(leftOffset,rect.origin.y,width,rect.size.height);
}
/*!
Modifies the bounding rectangle for the search button.
@param rect The current bounding rectangle for the search button.
Subclasses can override this method to return a new bounding rectangle for the search button. You might use this method to provide a custom layout for the search field control.
*/
- (CPRect)searchButtonRectForBounds:(CPRect)rect
{
return [_searchButton frame];
}
/*!
Modifies the bounding rectangle for the cancel button.
@param rect The updated bounding rectangle to use for the cancel button. The default value is the value passed into the rect parameter.
Subclasses can override this method to return a new bounding rectangle for the cancel button. You might use this method to provide a custom layout for the search field control.
*/
- (CPRect)cancelButtonRectForBounds:(CPRect)rect
{
return [_cancelButton frame];
}
// Managing Menu Templates
/*!
Returns the menu template object used to dynamically construct the search pop-up icon menu.
@return The current menu template.
*/
- (CPMenu)searchMenuTemplate
{
return _searchMenuTemplate;
}
/*!
Sets the menu template object used to dynamically construct the receiver's pop-up icon menu.
@param menu The menu template to use.
The receiver looks for the tag constants described in ŇMenu tagsÓ to determine how to populate the menu with items related to recent searches. See ŇConfiguring a Search MenuÓ for a sample of how you might set up the search menu template.
*/
- (void)setSearchMenuTemplate:(CPMenu)menu
{
_searchMenuTemplate = menu;
[self resetSearchButton];
[self _loadRecentSearchList];
[self _updateSearchMenu];
}
// Managing Search Modes
/*!
Returns a Boolean value indicating whether the receiver sends the search action message when the user clicks the search button (or presses return) or after each keystroke.
@return \c YES if the action message is sent all at once when the user clicks the search button or presses return; otherwise, NO if the search string is sent after each keystroke. The default value is NO.
*/
- (BOOL)sendsWholeSearchString
{
return _sendsWholeSearchString;
}
/*!
Sets whether the receiver sends the search action message when the user clicks the search button (or presses return) or after each keystroke.
@param flag \c YES to send the action message all at once when the user clicks the search button or presses return; otherwise, NO to send the search string after each keystroke.
*/
- (void)setSendsWholeSearchString:(BOOL)flag
{
_sendsWholeSearchString = flag;
}
/*!
Returns a Boolean value indicating whether the receiver sends its action immediately upon being notified of changes to the search field text or after a brief pause.
@return \c YES if the text field sends its action immediately upon notification of any changes to the search field; otherwise, NO.
*/
- (BOOL)sendsSearchStringImmediately
{
return _sendsSearchStringImmediately;
}
/*!
Sets whether the text field sends its action message to the target immediately upon notification of any changes to the search field text or after a brief pause.
@param flag \c YES to send the text field's action immediately upon notification of any changes to the search field; otherwise, NO if you want the text field to pause briefly before sending its action message. Pausing gives the user the opportunity to type more text into the search field before initiating the search.
*/
- (void)setSendsSearchStringImmediately:(BOOL)flag
{
_sendsSearchStringImmediately = flag;
}
// Managing Recent Search Strings
/*!
Returns the maximum number of recent search strings to display in the custom search menu.
@return The maximum number of search strings that can appear in the menu. This value is between 0 and 254.
*/
- (int)maximumRecents
{
return _maximumRecents;
}
/*!
Sets the maximum number of search strings that can appear in the search menu.
@param maxRecents The maximum number of search strings that can appear in the menu. This value can be between 0 and 254. Specifying a value less than 0 sets the value to the default, which is 10. Specifying a value greater than 254 sets the maximum to 254.
*/
- (void)setMaximumRecents:(int)max
{
if (max > 254)
max = 254;
else if (max < 0)
max = 10;
_maximumRecents = max;
}
/*!
Returns the list of recent search strings for the control.
@return An array of \c CPString objects, each of which contains a search string either displayed in the search menu or from a recent autosave archive. If there have been no recent searches and no prior searches saved under an autosave name, this array may be empty.
*/
- (CPArray)recentSearches
{
return _recentSearches;
}
/*!
Sets the list of recent search strings to list in the pop-up icon menu of the receiver.
@param searches An array of CPString objects containing the search strings.
You might use this method to set the recent list of searches from an archived copy.
*/
- (void)setRecentSearches:(CPArray)searches
{
var max = MIN([self maximumRecents], [searches count]),
searches = [searches subarrayWithRange:CPMakeRange(0, max)];
_recentSearches = searches;
[self _autosaveRecentSearchList];
}
/*!
Returns the key under which the prior list of recent search strings has been archived.
@return The autosave name, which is used as a key in the standard user defaults to save the recent searches. The default value is nil, which causes searches not to be autosaved.
*/
- (CPString)recentsAutosaveName
{
return _recentsAutosaveName;
}
/*!
Sets the autosave name under which the receiver automatically archives the list of recent search strings.
@param name The autosave name, which is used as a key in the standard user defaults to save the recent searches. If you specify nil or an empty string for this parameter, no autosave name is set and searches are not autosaved.
*/
- (void)setRecentsAutosaveName:(CPString)name
{
if (_recentsAutosaveName != nil)
[self _deregisterForAutosaveNotification];
_recentsAutosaveName = name;
if (_recentsAutosaveName != nil)
[self _registerForAutosaveNotification];
}
// Private methods and subclassing
- (CPRect)contentRectForBounds:(CPRect)bounds
{
var superbounds = [super contentRectForBounds:bounds];
return [self searchTextRectForBounds:superbounds];
}
+ (double)_keyboardDelayForPartialSearchString:(CPString)string
{
return (6 - MIN([string length],4))/10;
}
- (CPMenu)menu
{
return _searchMenu;
}
- (BOOL)isOpaque
{
return [super isOpaque] && [_cancelButton isOpaque] && [_searchButton isOpaque];
}
- (void)_updateCancelButtonVisibility
{
[_cancelButton setHidden:([[self stringValue] length] === 0)];
}
- (void)controlTextDidChange:(CPNotification)aNotification
{
if (![self sendsWholeSearchString])
{
if ([self sendsSearchStringImmediately])
[self _sendPartialString];
else
{
[_partialStringTimer invalidate];
var timeInterval = [CPSearchField _keyboardDelayForPartialSearchString:[self stringValue]];
_partialStringTimer = [CPTimer scheduledTimerWithTimeInterval:timeInterval
target:self
selector:@selector(_sendPartialString)
userInfo:nil
repeats:NO];
}
}
[self _updateCancelButtonVisibility];
}
- (void)_sendAction:(id)sender
{
[self sendAction:[self action] to:[self target]];
}
- (void)sendAction:(SEL)anAction to:(id)anObject
{
[super sendAction:anAction to:anObject];
[_partialStringTimer invalidate];
[self _addStringToRecentSearches:[self stringValue]];
[self _updateCancelButtonVisibility];
}
- (void)_addStringToRecentSearches:(CPString)string
{
if (string === nil || string === @"" || [_recentSearches containsObject:string])
return;
var searches = [CPMutableArray arrayWithArray:_recentSearches];
[searches addObject:string];
[self setRecentSearches:searches];
[self _updateSearchMenu];
}
- (BOOL)trackMouse:(CPEvent)event
{
var rect,
point,
location = [event locationInWindow];
point = [self convertPoint:location fromView:nil];
rect = [self searchButtonRectForBounds:[self frame]];
if (CPRectContainsPoint(rect,point))
{
return [[self searchButton] trackMouse:event];
}
rect = [self cancelButtonRectForBounds:[self frame]];
if (CPRectContainsPoint(rect,point))
{
return [[self cancelButton] trackMouse:event];
}
return [super trackMouse:event];
}
- (CPMenu)_defaultSearchMenuTemplate
{
var template, item;
template = [[CPMenu alloc] init];
item = [[CPMenuItem alloc] initWithTitle:@"Recent searches"
action:NULL
keyEquivalent:@""];
[item setTag:CPSearchFieldRecentsTitleMenuItemTag];
[item setEnabled:NO];
[template addItem:item];
item = [[CPMenuItem alloc] initWithTitle:@"Recent search item"
action:@selector(_searchFieldSearch:)
keyEquivalent:@""];
[item setTag:CPSearchFieldRecentsMenuItemTag];
[item setTarget:self];
[template addItem:item];
item = [[CPMenuItem alloc] initWithTitle:@"Clear recent searches"
action:@selector(_searchFieldClearRecents:)
keyEquivalent:@""];
[item setTag:CPSearchFieldClearRecentsMenuItemTag];
[item setTarget:self];
[template addItem:item];
item = [[CPMenuItem alloc] initWithTitle:@"No recent searches"
action:NULL
keyEquivalent:@""];
[item setTag:CPSearchFieldNoRecentsMenuItemTag];
[item setEnabled:NO];
[template addItem:item];
return template;
}
- (void)_updateSearchMenu
{
if (_searchMenuTemplate === nil)
return;
var i, menu = [[CPMenu alloc] init],
countOfRecents = [_recentSearches count],
numberOfItems = [_searchMenuTemplate numberOfItems];
for (i = 0; i < numberOfItems; i++)
{
var item = [_searchMenuTemplate itemAtIndex:i],
tag = [item tag];
if (!(tag === CPSearchFieldRecentsTitleMenuItemTag && countOfRecents === 0) &&
!(tag === CPSearchFieldClearRecentsMenuItemTag && countOfRecents === 0) &&
!(tag === CPSearchFieldNoRecentsMenuItemTag && countOfRecents != 0) &&
!(tag === CPSearchFieldRecentsMenuItemTag))
{
var itemAction, itemTarget;
switch (tag)
{
case CPSearchFieldRecentsTitleMenuItemTag : itemAction = NULL; itemTarget = NULL; break;
case CPSearchFieldClearRecentsMenuItemTag : itemAction = @selector(_searchFieldClearRecents:); itemTarget = self; break;
case CPSearchFieldNoRecentsMenuItemTag : itemAction = NULL; itemTarget = NULL; break;
default: itemAction = [item action]; itemTarget = [item target]; break;
}
if (tag === CPSearchFieldClearRecentsMenuItemTag || tag === CPSearchFieldRecentsTitleMenuItemTag)
{
var separator = [CPMenuItem separatorItem];
[separator setEnabled:NO];
[menu addItem:separator];
}
var templateItem = [[CPMenuItem alloc] initWithTitle:[item title]
action:itemAction
keyEquivalent:[item keyEquivalent]];
[templateItem setTarget:itemTarget];
[templateItem setEnabled:([item isEnabled] && itemAction != NULL)];
[templateItem setTag:tag];
[menu addItem:templateItem];
}
else if (tag === CPSearchFieldRecentsMenuItemTag)
{
var j;
for (j = 0; j < countOfRecents; j++)
{
var rencentItem = [[CPMenuItem alloc] initWithTitle:[_recentSearches objectAtIndex:j]
action:@selector(_searchFieldSearch:)
keyEquivalent:[item keyEquivalent]];
[rencentItem setTarget:self];
[menu addItem:rencentItem];
}
}
}
_searchMenu = menu;
}
- (void)_showMenu:(id)sender
{
if (_searchMenu === nil || [_searchMenu numberOfItems] === 0 || ![self isEnabled])
return;
var aFrame = [[self superview] convertRect:[self frame] toView:nil],
location = CPMakePoint(aFrame.origin.x + 10, aFrame.origin.y + aFrame.size.height - 4);
var anEvent = [CPEvent mouseEventWithType:CPRightMouseDown location:location modifierFlags:0 timestamp:[[CPApp currentEvent] timestamp] windowNumber:[[self window] windowNumber] context:nil eventNumber:1 clickCount:1 pressure:0];
[CPMenu popUpContextMenu:_searchMenu withEvent:anEvent forView:sender];
}
- (void)_sendPartialString
{
[[self target] performSelector:[self action] withObject:self];
}
- (void)_searchFieldCancel:(id)sender
{
[self setObjectValue:@""];
[self _sendPartialString];
[self _updateCancelButtonVisibility];
}
- (void)_searchFieldSearch:(id)sender
{
var searchString = [sender title];
if ([sender tag] != CPSearchFieldRecentsMenuItemTag)
[self _addStringToRecentSearches:searchString];
[self setObjectValue:searchString];
[self _sendPartialString];
[self _updateCancelButtonVisibility];
}
- (void)_searchFieldClearRecents:(id)sender
{
[self setRecentSearches:[CPArray array]];
[self _updateSearchMenu];
}
- (void)_registerForAutosaveNotification
{
[[CPNotificationCenter defaultCenter] addObserver:self selector:@selector(_updateAutosavedRecents:) name:@"CPAutosavedRecentsChangedNotification" object:nil];
}
- (void)_deregisterForAutosaveNotification
{
[[CPNotificationCenter defaultCenter] removeObserver:self name:@"CPAutosavedRecentsChangedNotification" object:nil];
}
- (void)_autosaveRecentSearchList
{
if (_recentsAutosaveName != nil)
[[CPNotificationCenter defaultCenter] postNotificationName:@"CPAutosavedRecentsChangedNotification" object:_recentsAutosaveName];
}
- (void)_updateAutosavedRecents:(id)notification
{
var list = [self recentSearches],
name = [notification object],
bundle_name = [[[CPBundle mainBundle] infoDictionary] objectForKey:"CPBundleName"],
cookie_name = [bundle_name lowercaseString] + "." + [notification object],
cookie = [[CPCookie alloc] initWithName:cookie_name],
cookie_value = [list componentsJoinedByString:@","];
[cookie setValue:cookie_value
expires:[[CPDate alloc] initWithTimeIntervalSinceNow:3600*24*365]
domain:(window.location.href.hostname)];
}
- (void)_loadRecentSearchList
{
var list,
name = [self recentsAutosaveName];
if (name === nil)
return;
var bundle_name = [[[CPBundle mainBundle] infoDictionary] objectForKey:"CPBundleName"],
cookie_name = [bundle_name lowercaseString] + "." + name,
cookie = [[CPCookie alloc] initWithName:cookie_name];
if (cookie != nil)
{
var cookie_value = [cookie value];
list = (cookie_value != @"") ? [cookie_value componentsSeparatedByString:@","] : [CPArray array];
_recentSearches = list;
}
}
@end
var CPSearchButtonKey = @"CPSearchButtonKey",
CPCancelButtonKey = @"CPCancelButtonKey",
CPRecentsAutosaveNameKey = @"CPRecentsAutosaveNameKey",
CPSendsWholeSearchStringKey = @"CPSendsWholeSearchStringKey",
CPSendsSearchStringImmediatelyKey = @"CPSendsSearchStringImmediatelyKey",
CPMaximumRecentsKey = @"CPMaximumRecentsKey",
CPSearchMenuTemplateKey = @"CPSearchMenuTemplateKey";
@implementation CPSearchField (CPCoding)
- (void)encodeWithCoder:(CPCoder)coder
{
[super encodeWithCoder:coder];
[coder encodeObject:_searchButton forKey:CPSearchButtonKey];
[coder encodeObject:_cancelButton forKey:CPCancelButtonKey];
[coder encodeBool:_sendsWholeSearchString forKey:CPSendsWholeSearchStringKey];
[coder encodeBool:_sendsSearchStringImmediately forKey:CPSendsSearchStringImmediatelyKey];
[coder encodeInt:_maximumRecents forKey:CPMaximumRecentsKey];
if (_recentsAutosaveName)
[coder encodeObject:_recentsAutosaveName forKey:CPRecentsAutosaveNameKey];
if (_searchMenuTemplate)
[coder encodeObject:_searchMenuTemplate forKey:CPSearchMenuTemplateKey];
}
- (id)initWithCoder:(CPCoder)coder
{
self = [super initWithCoder:coder];
_searchButton = [coder decodeObjectForKey:CPSearchButtonKey];
_cancelButton = [coder decodeObjectForKey:CPCancelButtonKey];
_recentsAutosaveName = [coder decodeObjectForKey:CPRecentsAutosaveNameKey];
_sendsWholeSearchString = [coder decodeBoolForKey:CPSendsWholeSearchStringKey];
_sendsSearchStringImmediately = [coder decodeBoolForKey:CPSendsSearchStringImmediatelyKey];
_maximumRecents = [coder decodeIntForKey:CPMaximumRecentsKey];
var template = [coder decodeObjectForKey:CPSearchMenuTemplateKey];
if (template)
[self setSearchMenuTemplate:template];
[self setDelegate:self];
return self;
}
@end
+7 -94
View File
@@ -1,103 +1,16 @@
import "CPTextField.j"
#include "Platform/Platform.h"
var TOP_PADDING = 4.0,
BOTTOM_PADDING = 3.0;
HORIZONTAL_PADDING = 3.0;
var CPSecureTextFieldDOMInputElement = nil;
@import "CPTextField.j"
/*!
@ingroup appkit
*/
@implementation CPSecureTextField : CPTextField
{
}
#if PLATFORM(DOM)
+ (DOMElement)_inputElement
- (BOOL)isSecure
{
if (!CPSecureTextFieldDOMInputElement)
{
CPSecureTextFieldDOMInputElement = document.createElement("input");
CPSecureTextFieldDOMInputElement.type = "password";
CPSecureTextFieldDOMInputElement.style.position = "absolute";
CPSecureTextFieldDOMInputElement.style.top = "0px";
CPSecureTextFieldDOMInputElement.style.left = "0px";
CPSecureTextFieldDOMInputElement.style.width = "100%"
CPSecureTextFieldDOMInputElement.style.height = "100%";
CPSecureTextFieldDOMInputElement.style.border = "0px";
CPSecureTextFieldDOMInputElement.style.padding = "0px";
CPSecureTextFieldDOMInputElement.style.whiteSpace = "pre";
CPSecureTextFieldDOMInputElement.style.background = "transparent";
CPSecureTextFieldDOMInputElement.style.outline = "none";
CPSecureTextFieldDOMInputElement.style.paddingLeft = HORIZONTAL_PADDING + "px";
CPSecureTextFieldDOMInputElement.style.paddingTop = TOP_PADDING - 2.0 + "px";
CPSecureTextFieldDOMInputElement.style.margin = "0px";
}
return CPSecureTextFieldDOMInputElement;
}
#endif
- (id)initWithFrame:(CGRect)aFrame
{
self = [super initWithFrame:aFrame];
if (self)
{
#if PLATFORM(DOM)
_DOMElement.removeChild(_DOMTextElement);
_DOMTextElement = document.createElement("input");
_DOMTextElement.type = "password";
_DOMTextElement.style.position = "absolute";
_DOMTextElement.style.top = TOP_PADDING + "px";
_DOMTextElement.style.left = HORIZONTAL_PADDING + "px";
_DOMTextElement.style.width = MAX(0.0, CGRectGetWidth(aFrame) - 2.0 * HORIZONTAL_PADDING) + "px";
_DOMTextElement.style.height = MAX(0.0, CGRectGetHeight(aFrame) - TOP_PADDING - BOTTOM_PADDING) + "px";
_DOMTextElement.style.whiteSpace = "pre";
_DOMTextElement.style.cursor = "default";
_DOMTextElement.style.zIndex = 100;
_DOMTextElement.style.border = "0";
_DOMTextElement.style.font = _DOMElement.style.font;
_DOMTextElement.style.padding = "0px";
_DOMTextElement.style.margin = "0px";
_DOMElement.appendChild(_DOMTextElement);
#endif
}
return self;
return YES;
}
- (void)setFont:(CPFont)aFont
{
[super setFont:aFont];
#if PLATFORM(DOM)
if (_DOMTextElement)
_DOMTextElement.style.font = _DOMElement.style.font;
#endif
}
- (CPString)stringValue
{
// All of this needs to be better.
#if PLATFORM(DOM)
if ([[self window] firstResponder] == self)
return [[self class] _inputElement].value;
#endif
return _DOMTextElement.value;
}
- (void)setStringValue:(CPString)aStringValue
{
_value = aStringValue;
#if PLATFORM(DOM)
_DOMTextElement.value = _value;
#endif
}
@end
@end
File diff suppressed because it is too large Load Diff
+11 -7
View File
@@ -20,9 +20,13 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
import <Foundation/CPObject.j>
@import <Foundation/CPObject.j>
/*!
@deprecated
@class CPShadow
/*
Instances of this class contain the attributes of a drop shadow used in Cappuccino.
*/
@implementation CPShadow : CPObject
@@ -34,7 +38,7 @@ import <Foundation/CPObject.j>
CPString _cssString;
}
/*
/*!
Creates a shadow with the specified attributes.
@param anOffset the shadow's offset
@param aBlurRadius the shadow's blur radius
@@ -63,7 +67,7 @@ import <Foundation/CPObject.j>
return self;
}
/*
/*!
Returns the shadow's offset.
*/
- (CGSize)shadowOffset
@@ -71,7 +75,7 @@ import <Foundation/CPObject.j>
return _offset;
}
/*
/*!
Returns the shadow's blur radius
*/
- (float)shadowBlurRadius
@@ -79,7 +83,7 @@ import <Foundation/CPObject.j>
return _blurRadius;
}
/*
/*!
Returns the shadow's color.
*/
- (CPColor)shadowColor
@@ -87,7 +91,7 @@ import <Foundation/CPObject.j>
return _color;
}
/*
/*!
Returns a CSS string representation of the shadow.
*/
- (CPString)cssString
+10 -5
View File
@@ -20,12 +20,13 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
import <Foundation/CPBundle.j>
@import <Foundation/CPBundle.j>
@import "CGGeometry.j"
@import "CPImage.j"
@import "CPImageView.j"
@import "CPView.j"
import "CGGeometry.j"
import "CPImage.j"
import "CPImageView.j"
import "CPView.j"
#include "CoreGraphics/CGGeometry.h"
@@ -45,6 +46,10 @@ var LIGHT_LEFT_INSET = 3.0,
HEAVY_TOP_INSET = 5.0,
HEAVY_BOTTOM_INSET = 5.0;
/*!
@ingroup appkit
*/
@implementation CPShadowView : CPView
{
CPShadowWeight _weight;
+350 -306
View File
@@ -3,7 +3,7 @@
* AppKit
*
* Created by Francisco Tolmasky.
* Copyright 2008, 280 North, Inc.
* Copyright 2009, 280 North, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -20,393 +20,437 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
import "CPControl.j"
@import "CPControl.j"
var CPSliderHorizontalKnobImage = nil,
CPSliderHorizontalBarLeftImage = nil,
CPSliderHorizontalBarRightImage = nil,
CPSliderHorizontalBarCenterImage = nil;
#include "CoreGraphics/CGGeometry.h"
/*
An <objj>CPSlider</objj> displays, and allows control of, some value in the application. It represents a continuous stream of values of type <code>float</code>, which can be retrieved by the method <code>floatValue</code> and set by the method <code>setFloatValue:</code>.
/*! SLIDER STATES */
CPLinearSlider = 0;
CPCircularSlider = 1;
/*!
@ingroup appkit
*/
@implementation CPSlider : CPControl
{
double _value;
double _minValue;
double _maxValue;
double _altIncrementValue;
CPView _bar;
CPView _knob;
double _minValue;
double _maxValue;
double _altIncrementValue;
BOOL _isVertical;
CPImageView _standardKnob;
CPView _standardVerticalBar;
CPView _standardHorizontalBar;
BOOL _isVertical;
}
/*
@ignore
*/
+ (void)initialize
+ (CPString)themeClass
{
if (self != [CPSlider class])
return;
return "slider";
}
var bundle = [CPBundle bundleForClass:self];
CPSliderKnobImage = [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPSlider/CPSliderKnobRegular.png"] size:CPSizeMake(11.0, 11.0)],
CPSliderKnobPushedImage = [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPSlider/CPSliderKnobRegularPushed.png"] size:CPSizeMake(11.0, 11.0)],
CPSliderHorizontalBarLeftImage = [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPSlider/CPSliderTrackHorizontalLeft.png"] size:CPSizeMake(2.0, 4.0)],
CPSliderHorizontalBarRightImage = [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPSlider/CPSliderTrackHorizontalRight.png"] size:CPSizeMake(2.0, 4.0)],
CPSliderHorizontalBarCenterImage = [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPSlider/CPSliderTrackHorizontalCenter.png"] size:CPSizeMake(1.0, 4.0)];
+ (id)themeAttributes
{
return [CPDictionary dictionaryWithObjects:[[CPNull null], _CGSizeMakeZero(), 0.0, [CPNull null]]
forKeys:[@"knob-color", @"knob-size", @"track-width", @"track-color"]];
}
- (id)initWithFrame:(CGRect)aFrame
{
self = [super initWithFrame:aFrame];
if (self)
{
_value = 50.0;
_minValue = 0.0;
_maxValue = 100.0;
_bar = [self bar];
_knob = [self knob];
_knobSize = [[self knobImage] size];
_isVertical = [self isVertical];
[_knob setFrameOrigin:[self knobPosition]];
[self setObjectValue:50.0];
[self addSubview:_bar];
[self addSubview:_knob];
[self setContinuous:YES];
[self _recalculateIsVertical];
}
return self;
}
- (void)setMinValue:(float)aMinimumValue
{
if (_minValue === aMinimumValue)
return;
- (void)setFrameSize:(CGSize)aSize
{
if(aSize.height > 21.0)
aSize.height = 21.0;
_minValue = aMinimumValue;
var doubleValue = [self doubleValue];
if (_isVertical != [self isVertical])
{
_isVertical = [self isVertical];
var bar = [self bar],
knob = [self knob];
if (_bar != bar)
[self replaceSubview:_bar = bar withView:_bar];
if (_knob != knob)
{
[self replaceSubview:knob withView:_knob];
_knob = knob;
[_knob setFrameOrigin:[self knobPosition]];
}
}
[super setFrameSize:aSize];
[_knob setFrameOrigin:[self knobPosition]];
if (doubleValue < _minValue)
[self setDoubleValue:_minValue];
// The relative position may have (did) change.
[self setNeedsLayout];
[self setNeedsDisplay:YES];
}
/*
Returns the value by which the slider will be
incremented if the user holds down the <code>ALT</code>s key.
*/
- (double)altIncrementValue
{
return _altIncrementValue;
}
/*
Returns the thickness of the slider's knob. This value is in pixels,
and is the size of the knob along the slider's track.
*/
- (float)knobThickness
{
return CPRectGetWidth([_knob frame]);
}
/*
@ignore
*/
- (CPImage)leftTrackImage
{
return CPSliderHorizontalBarLeftImage;
}
/*
@ignore
*/
- (CPImage)rightTrackImage
{
return CPSliderHorizontalBarRightImage;
}
/*
@ignore
*/
- (CPImage)centerTrackImage
{
return CPSliderHorizontalBarCenterImage
}
/*
@ignore
*/
- (CPImage)knobImage
{
return CPSliderKnobImage;
}
/*
@ignore
*/
- (CPImage)pushedKnobImage
{
return CPSliderKnobPushedImage;
}
/*
Returns the slider's knob.
*/
- (CPView)knob
{
if (!_standardKnob)
{
var knobImage = [self knobImage],
knobSize = [knobImage size];
_standardKnob = [[CPImageView alloc] initWithFrame:CPRectMake(0.0, 0.0, knobSize.width, knobSize.height)];
[_standardKnob setImage:knobImage];
}
return _standardKnob;
}
/*
Returns the slider's bar.
*/
- (CPView)bar
{
// FIXME: veritcal.
if ([self isVertical])
return nil;
else
{
if (!_standardHorizontalBar)
{
var frame = [self frame],
barFrame = CPRectMake(0.0, 0.0, CPRectGetWidth(frame), 4.0);
_standardHorizontalBar = [[CPView alloc] initWithFrame:barFrame];
[_standardHorizontalBar setBackgroundColor:[CPColor colorWithPatternImage:[[CPThreePartImage alloc] initWithImageSlices:
[[self leftTrackImage], [self centerTrackImage], [self rightTrackImage]] isVertical:NO]]];
[_standardHorizontalBar setFrame:CPRectMake(0.0, (CPRectGetHeight(frame) - CPRectGetHeight(barFrame)) / 2.0, CPRectGetWidth(_isVertical ? barFrame : frame), CPRectGetHeight(_isVertical ? frame : barFrame))];
[_standardHorizontalBar setAutoresizingMask:_isVertical ? CPViewHeightSizable : CPViewWidthSizable];
}
return _standardHorizontalBar;
}
}
/*
Sets the value the slider will be incremented if the user holds the <code>ALT</code> key.
*/
- (void)setAltIncrementValue:(double)anIncrementValue
{
_altIncrementValue = anIncrementValue;
}
/*
Returns <code>YES</code> if the slider is vertical.
*/
- (BOOL)isVertical
{
var frame = [self frame];
if (CPRectGetWidth(frame) == CPRectGetHeight(frame))
return -1;
return CPRectGetWidth(frame) < CPRectGetHeight(frame);
}
/*
Returns the slider's maximum value
*/
- (double)maxValue
{
return _maxValue;
}
/*
Returns the slider's minimum value
*/
- (double)minValue
- (float)minValue
{
return _minValue;
}
/*
Sets the slider's maximum value
@param aMaxValue the new maximum value
*/
- (void)setMaxValue:(double)aMaxValue
- (void)setMaxValue:(float)aMaximumValue
{
_maxValue = aMaxValue;
if (_maxValue === aMaximumValue)
return;
_maxValue = aMaximumValue;
var doubleValue = [self doubleValue];
if (doubleValue > _maxValue)
[self setDoubleValue:_maxValue];
// The relative position may have (did) change.
[self setNeedsLayout];
[self setNeedsDisplay:YES];
}
/*
Sets the slider's minimum value
@param aMinValue the new minimum value
*/
- (void)setMinValue:(double)aMinValue
- (float)maxValue
{
_minValue = aMinValue;
return _maxValue;
}
/*
Sets the slider's value
@param aValue the new slider value
*/
- (void)setValue:(double)aValue
- (void)setObjectValue:(id)aValue
{
_value = aValue;
[super setObjectValue:MIN(MAX(aValue, _minValue), _maxValue)];
[_knob setFrameOrigin:[self knobPosition]];
[self setNeedsLayout];
[self setNeedsDisplay:YES];
}
/*
Returns the slider's value
*/
- (double)value
- (void)setSliderType:(CPSliderType)aSliderType
{
return _value;
}
/*
Returns the knob's position
@ignore
*/
- (CGPoint)knobPosition
{
if ([self isVertical])
return CPPointMake(0.0, 0.0);
if (aSliderType === CPCircularSlider)
[self setThemeState:CPThemeStateCircular];
else
return CPPointMake(
((_value - _minValue) / (_maxValue - _minValue)) * (CPRectGetWidth([self frame]) - CPRectGetWidth([_knob frame])),
(CPRectGetHeight([self frame]) - CPRectGetHeight([_knob frame])) / 2.0);
[self unsetThemeState:CPThemeStateCircular];
}
/*
@ignore
*/
- (float)valueForKnobPosition:(CGPoint)aPoint
- (CPSliderType)sliderType
{
if ([self isVertical])
return 0.0;
return [self hasThemeState:CPThemeStateCircular] ? CPCircularSlider : CPLinearSlider;
}
- (CGRect)trackRectForBounds:(CGRect)bounds
{
if ([self hasThemeState:CPThemeStateCircular])
{
var originalBounds = CGRectCreateCopy(bounds);
bounds.size.width = MIN(bounds.size.width, bounds.size.height);
bounds.size.height = bounds.size.width;
if (bounds.size.width < originalBounds.size.width)
bounds.origin.x += (originalBounds.size.width - bounds.size.width) / 2.0;
else
bounds.origin.y += (originalBounds.size.height - bounds.size.height) / 2.0;
}
else
return MAX(MIN((aPoint.x) * (_maxValue - _minValue) / ( CPRectGetWidth([self frame]) - CPRectGetWidth([_knob frame]) ) + _minValue, _maxValue), _minValue);
{
var trackWidth = [self currentValueForThemeAttribute:@"track-width"];
if (trackWidth <= 0)
return _CGRectMakeZero();
if ([self isVertical])
{
bounds.origin.x = (_CGRectGetWidth(bounds) - trackWidth) / 2.0;
bounds.size.width = trackWidth;
}
else
{
bounds.origin.y = (_CGRectGetHeight(bounds) - trackWidth) / 2.0;
bounds.size.height = trackWidth;
}
}
return bounds;
}
- (CGPoint)constrainKnobPosition:(CGPoint)aPoint
- (CGRect)knobRectForBounds:(CGRect)bounds
{
//FIXME
aPoint.x -= _knobSize.width / 2.0;
return CPPointMake(MAX(MIN(CPRectGetWidth([self bounds]) - _knobSize.width, aPoint.x), 0.0), (CPRectGetHeight([self bounds]) - CPRectGetHeight([_knob frame])) / 2.0);
var knobSize = [self currentValueForThemeAttribute:@"knob-size"];
if (knobSize.width <= 0 || knobSize.height <= 0)
return _CGRectMakeZero();
var knobRect = _CGRectMake(0.0, 0.0, knobSize.width, knobSize.height),
trackRect = [self trackRectForBounds:bounds];
// No track, do our best to approximate a place for this thing.
if (!trackRect || _CGRectIsEmpty(trackRect))
trackRect = bounds;
if ([self hasThemeState:CPThemeStateCircular])
{
var angle = 3*PI_2 - (1.0 - [self doubleValue] - _minValue) / (_maxValue - _minValue) * PI2,
radius = CGRectGetWidth(trackRect) / 2.0 - 8.0;
knobRect.origin.x = radius * COS(angle) + CGRectGetMidX(trackRect) - 3.0;
knobRect.origin.y = radius * SIN(angle) + CGRectGetMidY(trackRect) - 2.0;
}
else if ([self isVertical])
{
knobRect.origin.x = _CGRectGetMidX(trackRect) - knobSize.width / 2.0;
knobRect.origin.y = (([self doubleValue] - _minValue) / (_maxValue - _minValue)) * (_CGRectGetHeight(trackRect) - knobSize.height);
}
else
{
knobRect.origin.x = (([self doubleValue] - _minValue) / (_maxValue - _minValue)) * (_CGRectGetWidth(trackRect) - knobSize.width);
knobRect.origin.y = _CGRectGetMidY(trackRect) - knobSize.height / 2.0;
}
return knobRect;
}
- (void)mouseUp:(CPEvent)anEvent
- (CGRect)rectForEphemeralSubviewNamed:(CPString)aName
{
[[self knob] setImage: [self knobImage]];
if (aName === "track-view")
return [self trackRectForBounds:[self bounds]];
else if (aName === "knob-view")
return [self knobRectForBounds:[self bounds]];
return [super rectForEphemeralSubviewNamed:aName];
}
- (CPView)createEphemeralSubviewNamed:(CPString)aName
{
if (aName === "track-view" || aName === "knob-view")
{
var view = [[CPView alloc] init];
[view setHitTests:NO];
return view;
}
return [super createEphemeralSubviewNamed:aName];
}
- (void)setAltIncrementValue:(float)anAltIncrementValue
{
_altIncrementValue = anAltIncrementValue;
}
- (float)altIncrementValue
{
return _altIncrementValue;
}
- (void)setFrameSize:(CGSize)aSize
{
[super setFrameSize:aSize];
[self _recalculateIsVertical];
}
- (void)_recalculateIsVertical
{
// Recalculate isVertical.
var bounds = [self bounds],
width = _CGRectGetWidth(bounds),
height = _CGRectGetHeight(bounds);
_isVertical = width < height ? 1 : (width > height ? 0 : -1);
if (_isVertical === 1)
[self setThemeState:CPThemeStateVertical];
else if (_isVertical === 0)
[self unsetThemeState:CPThemeStateVertical];
}
- (int)isVertical
{
return _isVertical;
}
- (void)layoutSubviews
{
var trackView = [self layoutEphemeralSubviewNamed:@"track-view"
positioned:CPWindowBelow
relativeToEphemeralSubviewNamed:@"knob-view"];
if (trackView)
[trackView setBackgroundColor:[self currentValueForThemeAttribute:@"track-color"]];
var knobView = [self layoutEphemeralSubviewNamed:@"knob-view"
positioned:CPWindowAbove
relativeToEphemeralSubviewNamed:@"track-view"];
if (knobView)
[knobView setBackgroundColor:[self currentValueForThemeAttribute:"knob-color"]];
}
- (BOOL)tracksMouseOutsideOfFrame
{
return YES;
}
- (float)_valueAtPoint:(CGPoint)aPoint
{
var bounds = [self bounds],
knobRect = [self knobRectForBounds:bounds],
trackRect = [self trackRectForBounds:bounds];
if ([self hasThemeState:CPThemeStateCircular])
{
var knobWidth = _CGRectGetWidth(knobRect);
trackRect.origin.x += knobWidth / 2;
trackRect.size.width -= knobWidth;
var minValue = [self minValue],
dx = aPoint.x - _CGRectGetMidX(trackRect),
dy = aPoint.y - _CGRectGetMidY(trackRect);
return MAX(0.0, MIN(1.0, 1.0 - (3 * PI_2 - ATAN2(dy, dx)) % PI2 / PI2)) * ([self maxValue] - minValue) + minValue;
}
else if ([self isVertical])
{
var knobHeight = _CGRectGetHeight(knobRect);
trackRect.origin.y += knobHeight / 2;
trackRect.size.height -= knobHeight;
var minValue = [self minValue];
return MAX(0.0, MIN(1.0, (aPoint.y - _CGRectGetMinY(trackRect)) / _CGRectGetHeight(trackRect))) * ([self maxValue] - minValue) + minValue;
}
else
{
var knobWidth = _CGRectGetWidth(knobRect);
trackRect.origin.x += knobWidth / 2;
trackRect.size.width -= knobWidth;
var minValue = [self minValue];
return MAX(0.0, MIN(1.0, (aPoint.x - _CGRectGetMinX(trackRect)) / _CGRectGetWidth(trackRect))) * ([self maxValue] - minValue) + minValue;
}
}
- (BOOL)startTrackingAt:(CGPoint)aPoint
{
var bounds = [self bounds],
knobRect = [self knobRectForBounds:_CGRectMakeCopy(bounds)];
if (_CGRectContainsPoint(knobRect, aPoint))
_dragOffset = _CGSizeMake(_CGRectGetMidX(knobRect) - aPoint.x, _CGRectGetMidY(knobRect) - aPoint.y);
else
{
var trackRect = [self trackRectForBounds:bounds];
if (trackRect && _CGRectContainsPoint(trackRect, aPoint))
{
_dragOffset = _CGSizeMakeZero();
[self setObjectValue:[self _valueAtPoint:aPoint]];
}
else
return NO;
}
[self setHighlighted:YES];
[self setNeedsLayout];
[self setNeedsDisplay:YES];
return YES;
}
- (BOOL)continueTracking:(CGPoint)lastPoint at:(CGPoint)aPoint
{
[self setObjectValue:[self _valueAtPoint:_CGPointMake(aPoint.x + _dragOffset.width, aPoint.y + _dragOffset.height)]];
return YES;
}
- (void)stopTracking:(CGPoint)lastPoint at:(CGPoint)aPoint mouseIsUp:(BOOL)mouseIsUp
{
[self setHighlighted:NO];
if ([_target respondsToSelector:@selector(sliderDidFinish:)])
[_target sliderDidFinish:self];
[self setNeedsLayout];
[self setNeedsDisplay:YES];
}
- (void)mouseDown:(CPEvent)anEvent
/*!
@ignore
shoudl we have _continuous?
*/
- (void)setContinuous:(BOOL)flag
{
[_knob setFrameOrigin:[self constrainKnobPosition:[self convertPoint:[anEvent locationInWindow] fromView:nil]]];
_value = [self valueForKnobPosition:[_knob frame].origin];
[[self knob] setImage: [self pushedKnobImage]];
[self sendAction:_action to:_target];
}
- (void)mouseDragged:(CPEvent)anEvent
{
[_knob setFrameOrigin:[self constrainKnobPosition:[self convertPoint:[anEvent locationInWindow] fromView:nil]]];
_value = [self valueForKnobPosition:[_knob frame].origin];
[self sendAction:_action to:_target];
if (flag)
_sendActionOn |= CPLeftMouseDraggedMask;
else
_sendActionOn &= ~CPLeftMouseDraggedMask;
}
@end
var CPSliderMinValueKey = @"CPSliderMinValueKey",
CPSliderMaxValueKey = @"CPSliderMaxValueKey",
CPSliderValueKey = @"CPSliderValueKey";
var CPSliderMinValueKey = "CPSliderMinValueKey",
CPSliderMaxValueKey = "CPSliderMaxValueKey",
CPSliderAltIncrValueKey = "CPSliderAltIncrValueKey";
@implementation CPSlider (CPCoding)
/*
Initializes the slider from the data in a coder.
@param aCoder the coder from which to read the data
@return the initialized slider
*/
- (id)initWithCoder:(CPCoder)aCoder
{
_minValue = [aCoder decodeDoubleForKey:CPSliderMinValueKey];
_maxValue = [aCoder decodeDoubleForKey:CPSliderMaxValueKey];
self = [super initWithCoder:aCoder];
if (self)
{
_value = [aCoder decodeDoubleForKey:CPSliderValueKey];
_minValue = [aCoder decodeDoubleForKey:CPSliderMinValueKey];
_maxValue = [aCoder decodeDoubleForKey:CPSliderMaxValueKey];
_bar = [self bar];
_knob = [self knob];
_knobSize = [[self knobImage] size];
_isVertical = [self isVertical];
[_knob setFrameOrigin:[self knobPosition]];
[self addSubview:_bar];
[self addSubview:_knob];
_altIncrementValue = [aCoder decodeDoubleForKey:CPSliderAltIncrValueKey];
[self setContinuous:YES];
[self _recalculateIsVertical];
[self setNeedsLayout];
[self setNeedsDisplay:YES];
}
return self;
}
/*
Writes out the slider's instance information to a coder.
@param aCoder the coder to which to write the data
*/
- (void)encodeWithCoder:(CPCoder)aCoder
{
var subviews = _subviews;
_subviews = [];
[super encodeWithCoder:aCoder];
_subviews = subviews;
[aCoder encodeDouble:_value forKey:CPSliderValueKey];
[aCoder encodeDouble:_minValue forKey:CPSliderMinValueKey];
[aCoder encodeDouble:_maxValue forKey:CPSliderMaxValueKey];
[aCoder encodeDouble:_altIncrementValue forKey:CPSliderAltIncrValueKey];
}
@end
@implementation CPSlider (Deprecated)
- (id)value
{
CPLog.warn("[CPSlider value] is deprecated, use doubleValue or objectValue instead.");
return [self doubleValue];
}
- (void)setValue:(id)aValue
{
CPLog.warn("[CPSlider setValue:] is deprecated, use setDoubleValue: or setObjectValue: instead.");
[self setObjectValue:aValue];
}
@end
+91 -66
View File
@@ -20,12 +20,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
import <Foundation/Foundation.j>
import <AppKit/CPView.j>
import <AppKit/CPSlider.j>
import <AppKit/CPColorPicker.j>
import <AppKit/CPColorPanel.j>
@import "CPColorPicker.j"
/*
@ignore
@@ -50,14 +45,16 @@ import <AppKit/CPColorPanel.j>
CPTextField _saturationLabel;
CPTextField _brightnessLabel;
CPTextField _hexLabel;
#if PLATFORM(DOM)
DOMElement _redValue;
DOMElement _greenValue;
DOMElement _blueValue;
DOMElement _hueValue;
DOMElement _saturationValue;
DOMElement _brightnessValue;
DOMElement _hexValue;
DOMElement _hexValue;
#endif
}
- (id)initWithPickerMask:(int)mask colorPanel:(CPColorPanel)owningColorPanel
@@ -68,15 +65,17 @@ import <AppKit/CPColorPanel.j>
-(id)initView
{
aFrame = CPRectMake(0, 0, CPColorPickerViewWidth, CPColorPickerViewHeight);
_contentView = [[CPView alloc] initWithFrame:aFrame];
[_contentView setAutoresizingMask:CPViewWidthSizable|CPViewHeightSizable];
_rgbLabel = [[CPTextField alloc] initWithFrame: CPRectMake(0, 10, 100, 20)];
[_rgbLabel setStringValue: "RGB"];
[_rgbLabel setTextColor:[CPColor whiteColor]];
[_rgbLabel setStringValue: "Red, Green, Blue"];
[_rgbLabel setTextColor:[CPColor blackColor]];
_redLabel = [[CPTextField alloc] initWithFrame: CPRectMake(0, 35, 15, 20)];
[_redLabel setStringValue: "R"];
[_redLabel setTextColor:[CPColor whiteColor]];
[_redLabel setTextColor:[CPColor blackColor]];
_redSlider = [[CPSlider alloc] initWithFrame: CPRectMake(15, 35, aFrame.size.width - 70, 20)];
[_redSlider setMaxValue: 1.0];
@@ -84,7 +83,8 @@ import <AppKit/CPColorPanel.j>
[_redSlider setTarget: self];
[_redSlider setAction: @selector(sliderChanged:)];
[_redSlider setAutoresizingMask: CPViewWidthSizable];
#if PLATFORM(DOM)
var updateFunction = function(aDOMEvent)
{
if(isNaN(this.value))
@@ -92,28 +92,28 @@ import <AppKit/CPColorPanel.j>
switch(this)
{
case _redValue: [_redSlider setValue: MAX(MIN(ROUND(this.value), 255) / 255.0, 0)];
[self sliderChanged: _redSlider];
case _redValue: [_redSlider setFloatValue:MAX(MIN(ROUND(this.value), 255) / 255.0, 0)];
//[self sliderChanged: _redSlider];
break;
case _greenValue: [_greenSlider setValue: MAX(MIN(ROUND(this.value), 255) / 255.0, 0)];
[self sliderChanged: _greenSlider];
case _greenValue: [_greenSlider setFloatValue:MAX(MIN(ROUND(this.value), 255) / 255.0, 0)];
//[self sliderChanged: _greenSlider];
break;
case _blueValue: [_blueSlider setValue: MAX(MIN(ROUND(this.value), 255) / 255.0, 0)];
[self sliderChanged: _blueSlider];
case _blueValue: [_blueSlider setFloatValue:MAX(MIN(ROUND(this.value), 255) / 255.0, 0)];
//[self sliderChanged: _blueSlider];
break;
case _hueValue: [_hueSlider setValue: MAX(MIN(ROUND(this.value), 360), 0)];
[self sliderChanged: _hueSlider];
case _hueValue: [_hueSlider setFloatValue:MAX(MIN(ROUND(this.value), 360), 0)];
//[self sliderChanged: _hueSlider];
break;
case _saturationValue: [_saturationSlider setValue: MAX(MIN(ROUND(this.value), 100), 0)];
[self sliderChanged: _saturationSlider];
case _saturationValue: [_saturationSlider setFloatValue:MAX(MIN(ROUND(this.value), 100), 0)];
//[self sliderChanged: _saturationSlider];
break;
case _brightnessValue: [_brightnessSlider setValue: MAX(MIN(ROUND(this.value), 100), 0)];
[self sliderChanged: _brightnessSlider];
case _brightnessValue: [_brightnessSlider setFloatValue:MAX(MIN(ROUND(this.value), 100), 0)];
//[self sliderChanged: _brightnessSlider];
break;
}
@@ -141,8 +141,8 @@ import <AppKit/CPColorPanel.j>
_redValue = document.createElement("input");
_redValue.style.width = "40px";
_redValue.style.backgroundColor = "transparent";
_redValue.style.border = "1px solid white";
_redValue.style.color = "white";
_redValue.style.border = "1px solid black";
_redValue.style.color = "black";
_redValue.style.position = "absolute";
_redValue.style.top = "0px";
_redValue.style.left = "0px";
@@ -150,10 +150,11 @@ import <AppKit/CPColorPanel.j>
redValue._DOMElement.appendChild(_redValue);
[_contentView addSubview: redValue];
#endif
_greenLabel = [[CPTextField alloc] initWithFrame: CPRectMake(0, 58, 15, 20)];
[_greenLabel setStringValue: "G"];
[_greenLabel setTextColor:[CPColor whiteColor]];
[_greenLabel setTextColor:[CPColor blackColor]];
_greenSlider = [[CPSlider alloc] initWithFrame: CPRectMake(15, 58, aFrame.size.width - 70, 20)];
[_greenSlider setMaxValue: 1.0];
@@ -162,6 +163,7 @@ import <AppKit/CPColorPanel.j>
[_greenSlider setAction: @selector(sliderChanged:)];
[_greenSlider setAutoresizingMask: CPViewWidthSizable];
#if PLATFORM(DOM)
//green value input box
var greenValue = [[CPView alloc] initWithFrame: CPRectMake(aFrame.size.width - 45, 58, 45, 20)];
[greenValue setAutoresizingMask: CPViewMinXMargin];
@@ -171,10 +173,11 @@ import <AppKit/CPColorPanel.j>
greenValue._DOMElement.appendChild(_greenValue);
[_contentView addSubview: greenValue];
#endif
_blueLabel = [[CPTextField alloc] initWithFrame: CPRectMake(0, 81, 15, 20)];
[_blueLabel setStringValue: "B"];
[_blueLabel setTextColor:[CPColor whiteColor]];
[_blueLabel setTextColor:[CPColor blackColor]];
_blueSlider = [[CPSlider alloc] initWithFrame: CPRectMake(15, 81, aFrame.size.width - 70, 20)];
[_blueSlider setMaxValue: 1.0];
@@ -183,6 +186,7 @@ import <AppKit/CPColorPanel.j>
[_blueSlider setAction: @selector(sliderChanged:)];
[_blueSlider setAutoresizingMask: CPViewWidthSizable];
#if PLATFORM(DOM)
//blue value input box
var blueValue = [[CPView alloc] initWithFrame: CPRectMake(aFrame.size.width - 45, 81, 45, 20)];
[blueValue setAutoresizingMask: CPViewMinXMargin];
@@ -192,14 +196,14 @@ import <AppKit/CPColorPanel.j>
blueValue._DOMElement.appendChild(_blueValue);
[_contentView addSubview: blueValue];
_hsbLabel = [[CPTextField alloc] initWithFrame: CPRectMake(0, 120, 100, 20)];
[_hsbLabel setStringValue: "HSB"];
[_hsbLabel setTextColor:[CPColor whiteColor]];
#endif
_hsbLabel = [[CPTextField alloc] initWithFrame: CPRectMake(0, 120, 190, 20)];
[_hsbLabel setStringValue: "Hue, Saturation, Brightness"];
[_hsbLabel setTextColor:[CPColor blackColor]];
_hueLabel = [[CPTextField alloc] initWithFrame: CPRectMake(0, 145, 15, 20)];
[_hueLabel setStringValue: "H"];
[_hueLabel setTextColor:[CPColor whiteColor]];
[_hueLabel setTextColor:[CPColor blackColor]];
_hueSlider = [[CPSlider alloc] initWithFrame: CPRectMake(15, 145, aFrame.size.width - 70, 20)];
[_hueSlider setMaxValue: 359.0];
@@ -208,6 +212,7 @@ import <AppKit/CPColorPanel.j>
[_hueSlider setAction: @selector(sliderChanged:)];
[_hueSlider setAutoresizingMask: CPViewWidthSizable];
#if PLATFORM(DOM)
//red value input box
var hueValue = [[CPView alloc] initWithFrame: CPRectMake(aFrame.size.width - 45, 145, 45, 20)];
[hueValue setAutoresizingMask: CPViewMinXMargin];
@@ -217,10 +222,10 @@ import <AppKit/CPColorPanel.j>
hueValue._DOMElement.appendChild(_hueValue);
[_contentView addSubview: hueValue];
#endif
_saturationLabel = [[CPTextField alloc] initWithFrame: CPRectMake(0, 168, 15, 20)];
[_saturationLabel setStringValue: "S"];
[_saturationLabel setTextColor:[CPColor whiteColor]];
[_saturationLabel setTextColor:[CPColor blackColor]];
_saturationSlider = [[CPSlider alloc] initWithFrame: CPRectMake(15, 168, aFrame.size.width - 70, 20)];
[_saturationSlider setMaxValue: 100.0];
@@ -229,6 +234,7 @@ import <AppKit/CPColorPanel.j>
[_saturationSlider setAction: @selector(sliderChanged:)];
[_saturationSlider setAutoresizingMask: CPViewWidthSizable];
#if PLATFORM(DOM)
//green value input box
var saturationValue = [[CPView alloc] initWithFrame: CPRectMake(aFrame.size.width - 45, 168, 45, 20)];
[saturationValue setAutoresizingMask: CPViewMinXMargin];
@@ -238,10 +244,10 @@ import <AppKit/CPColorPanel.j>
saturationValue._DOMElement.appendChild(_saturationValue);
[_contentView addSubview: saturationValue];
#endif
_brightnessLabel = [[CPTextField alloc] initWithFrame: CPRectMake(0, 191, 15, 20)];
[_brightnessLabel setStringValue: "B"];
[_brightnessLabel setTextColor:[CPColor whiteColor]];
[_brightnessLabel setTextColor:[CPColor blackColor]];
_brightnessSlider = [[CPSlider alloc] initWithFrame: CPRectMake(15, 191, aFrame.size.width - 70, 20)];
[_brightnessSlider setMaxValue: 100.0];
@@ -250,6 +256,7 @@ import <AppKit/CPColorPanel.j>
[_brightnessSlider setAction: @selector(sliderChanged:)];
[_brightnessSlider setAutoresizingMask: CPViewWidthSizable];
#if PLATFORM(DOM)
//blue value input box
var brightnessValue = [[CPView alloc] initWithFrame: CPRectMake(aFrame.size.width - 45, 191, 45, 20)];
[brightnessValue setAutoresizingMask: CPViewMinXMargin];
@@ -259,16 +266,17 @@ import <AppKit/CPColorPanel.j>
brightnessValue._DOMElement.appendChild(_brightnessValue);
[_contentView addSubview: brightnessValue];
_hexLabel = [[CPTextField alloc] initWithFrame: CPRectMake(0, 230, 100, 20)];
#endif
_hexLabel = [[CPTextField alloc] initWithFrame: CPRectMake(0, 230, 30, 20)];
[_hexLabel setStringValue: "Hex"];
[_hexLabel setTextColor:[CPColor whiteColor]];
[_hexLabel setTextColor:[CPColor blackColor]];
#if PLATFORM(DOM)
//hex input box
_hexValue = _redValue.cloneNode(false);
_hexValue.style.top = "255px";
_hexValue.style.top = "228px";
_hexValue.style.width = "80px";
_hexValue.style.left = "0px";
_hexValue.style.left = "35px";
_hexValue.onkeypress = function(aDOMEvent)
{
aDOMEvent = aDOMEvent || window.event;
@@ -292,7 +300,8 @@ import <AppKit/CPColorPanel.j>
};
_contentView._DOMElement.appendChild(_hexValue);
#endif
[_contentView addSubview: _rgbLabel];
[_contentView addSubview: _redLabel];
[_contentView addSubview: _greenLabel];
@@ -332,25 +341,28 @@ import <AppKit/CPColorPanel.j>
-(void)sliderChanged:(id)sender
{
var newColor;
var newColor,
colorPanel = [self colorPanel],
alpha = [colorPanel opacity];
switch(sender)
{
case _hueSlider:
case _saturationSlider:
case _brightnessSlider: newColor = [CPColor colorWithHue: [_hueSlider value]
saturation: [_saturationSlider value]
brightness: [_brightnessSlider value]];
case _brightnessSlider: newColor = [CPColor colorWithHue: [_hueSlider floatValue]
saturation: [_saturationSlider floatValue]
brightness: [_brightnessSlider floatValue]
alpha: alpha];
[self updateRGBSliders: newColor];
break;
case _redSlider:
case _greenSlider:
case _blueSlider: newColor = [CPColor colorWithCalibratedRed: [_redSlider value]
green: [_greenSlider value]
blue: [_blueSlider value]
alpha: 1.0];
case _blueSlider: newColor = [CPColor colorWithCalibratedRed: [_redSlider floatValue]
green: [_greenSlider floatValue]
blue: [_blueSlider floatValue]
alpha: alpha];
[self updateHSBSliders: newColor];
break;
@@ -358,7 +370,7 @@ import <AppKit/CPColorPanel.j>
[self updateLabels];
[self updateHex: newColor];
[[self colorPanel] setColor: newColor];
[colorPanel setColor: newColor];
}
-(void)setColor:(CPColor)aColor
@@ -373,35 +385,48 @@ import <AppKit/CPColorPanel.j>
{
var hsb = [aColor hsbComponents];
[_hueSlider setValue: hsb[0]];
[_saturationSlider setValue: hsb[1]];
[_brightnessSlider setValue: hsb[2]];
[_hueSlider setFloatValue:hsb[0]];
[_saturationSlider setFloatValue:hsb[1]];
[_brightnessSlider setFloatValue:hsb[2]];
}
- (void)updateHex:(CPColor)aColor
{
#if PLATFORM(DOM)
_hexValue.value = [aColor hexString];
#endif
}
- (void)updateRGBSliders:(CPColor)aColor
{
var rgb = [aColor components];
[_redSlider setValue: rgb[0]];
[_greenSlider setValue: rgb[1]];
[_blueSlider setValue: rgb[2]];
[_redSlider setFloatValue:rgb[0]];
[_greenSlider setFloatValue:rgb[1]];
[_blueSlider setFloatValue:rgb[2]];
}
- (void)updateLabels
{
_hueValue.value = ROUND([_hueSlider value]);
_saturationValue.value = ROUND([_saturationSlider value]);
_brightnessValue.value = ROUND([_brightnessSlider value]);
#if PLATFORM(DOM)
_hueValue.value = ROUND([_hueSlider floatValue]);
_saturationValue.value = ROUND([_saturationSlider floatValue]);
_brightnessValue.value = ROUND([_brightnessSlider floatValue]);
_redValue.value = ROUND([_redSlider value] * 255);
_greenValue.value = ROUND([_greenSlider value] * 255);
_blueValue.value = ROUND([_blueSlider value] * 255);
_redValue.value = ROUND([_redSlider floatValue] * 255);
_greenValue.value = ROUND([_greenSlider floatValue] * 255);
_blueValue.value = ROUND([_blueSlider floatValue] * 255);
#endif
}
- (CPImage)provideNewButtonImage
{
return [[CPImage alloc] initWithContentsOfFile:[[CPBundle bundleForClass:CPColorPicker] pathForResource:"slider_button.png"] size:CGSizeMake(32, 32)];
}
- (CPImage)provideNewAlternateButtonImage
{
return [[CPImage alloc] initWithContentsOfFile:[[CPBundle bundleForClass:CPColorPicker] pathForResource:"slider_button_h.png"] size:CGSizeMake(32, 32)];
}
@end
+121 -64
View File
@@ -20,8 +20,8 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
import "CPImage.j"
import "CPView.j"
@import "CPImage.j"
@import "CPView.j"
#include "CoreGraphics/CGGeometry.h"
#include "Platform/Platform.h"
@@ -34,6 +34,10 @@ CPSplitViewWillResizeSubviewsNotification = @"CPSplitViewWillResizeSubviewsNotif
var CPSplitViewHorizontalImage = nil,
CPSplitViewVerticalImage = nil;
/*!
@ingroup appkit
*/
@implementation CPSplitView : CPView
{
id _delegate;
@@ -71,9 +75,9 @@ var CPSplitViewHorizontalImage = nil,
if (self = [super initWithFrame:aFrame])
{
_currentDivider = CPNotFound;
_DOMDividerElements = [];
[self _setVertical:YES];
}
@@ -98,9 +102,9 @@ var CPSplitViewHorizontalImage = nil,
// Just re-adjust evenly.
var frame = [self frame],
dividerThickness = [self dividerThickness];
[self _postNotificationWillResize];
var eachSize = ROUND((frame.size[_sizeComponent] - dividerThickness * (_subviews.length - 1)) / _subviews.length),
index = 0,
count = _subviews.length;
@@ -111,9 +115,9 @@ var CPSplitViewHorizontalImage = nil,
else
for (; index < count; ++index)
[_subviews[index] setFrame:CGRectMake(0, ROUND((eachSize + dividerThickness) * index), frame.size.width, eachSize)];
[self setNeedsDisplay:YES];
[self _postNotificationDidResize];
}
@@ -140,20 +144,21 @@ var CPSplitViewHorizontalImage = nil,
{
if (_isPaneSplitter == shouldBePaneSplitter)
return;
_isPaneSplitter = shouldBePaneSplitter;
#if PLATFORM(DOM)
_DOMDividerElements = [];
#endif
if(_DOMDividerElements[_drawingDivider])
[self _setupDOMDivider]
// The divider changes size when pane splitter mode is toggled, so the
// subviews need to change size too.
_needsResizeSubviews = YES;
[self setNeedsDisplay:YES];
}
- (void)didAddSubview:(CPView)aSubview
{
_needsResizeSubviews = YES;
// [self adjustSubviews];
}
- (BOOL)isSubviewCollapsed:(CPView)subview
@@ -165,9 +170,9 @@ var CPSplitViewHorizontalImage = nil,
{
var frame = [_subviews[aDivider] frame],
rect = CGRectMakeZero();
rect.size = [self frame].size;
rect.size[_sizeComponent] = [self dividerThickness];
rect.origin[_originComponent] = frame.origin[_originComponent] + frame.size[_sizeComponent];
@@ -177,22 +182,24 @@ var CPSplitViewHorizontalImage = nil,
- (CGRect)effectiveRectOfDividerAtIndex:(int)aDivider
{
var realRect = [self rectOfDividerAtIndex:aDivider];
var padding = 2;
realRect.size[_sizeComponent] += padding * 2;
realRect.origin[_originComponent] -= padding;
return realRect;
}
- (void)drawRect:(CGRect)rect
{
var count = [_subviews count] - 1;
if (count > 0)
while (count--)
[self drawDividerInRect:[self rectOfDividerAtIndex:count]];
while ((count--) > 0)
{
_drawingDivider = count;
[self drawDividerInRect:[self rectOfDividerAtIndex:count]];
}
}
- (void)drawDividerInRect:(CGRect)aRect
@@ -201,29 +208,39 @@ var CPSplitViewHorizontalImage = nil,
if (!_DOMDividerElements[_drawingDivider])
{
_DOMDividerElements[_drawingDivider] = document.createElement("div");
_DOMDividerElements[_drawingDivider].style.cursor = "move";
if(_isVertical)
_DOMDividerElements[_drawingDivider].style.cursor = [[CPCursor resizeLeftRightCursor] _cssString];
else
_DOMDividerElements[_drawingDivider].style.cursor = [[CPCursor resizeUpDownCursor] _cssString];
_DOMDividerElements[_drawingDivider].style.position = "absolute";
_DOMDividerElements[_drawingDivider].style.backgroundRepeat = "repeat";
CPDOMDisplayServerAppendChild(_DOMElement, _DOMDividerElements[_drawingDivider]);
if (_isPaneSplitter)
{
_DOMDividerElements[_drawingDivider].style.backgroundColor = "#A5A5A5";
_DOMDividerElements[_drawingDivider].style.backgroundImage = "";
}
else
{
_DOMDividerElements[_drawingDivider].style.backgroundColor = "";
_DOMDividerElements[_drawingDivider].style.backgroundImage = "url('"+_dividerImagePath+"')";
}
[self _setupDOMDivider];
}
CPDOMDisplayServerSetStyleLeftTop(_DOMDividerElements[_drawingDivider], NULL, _CGRectGetMinX(aRect), _CGRectGetMinY(aRect));
CPDOMDisplayServerSetStyleSize(_DOMDividerElements[_drawingDivider], _CGRectGetWidth(aRect), _CGRectGetHeight(aRect));
#endif
}
- (void)_setupDOMDivider
{
if (_isPaneSplitter)
{
_DOMDividerElements[_drawingDivider].style.backgroundColor = "#A5A5A5";
_DOMDividerElements[_drawingDivider].style.backgroundImage = "";
}
else
{
_DOMDividerElements[_drawingDivider].style.backgroundColor = "";
_DOMDividerElements[_drawingDivider].style.backgroundImage = "url('"+_dividerImagePath+"')";
}
}
- (void)viewWillDraw
{
[self _adjustSubviewsWithCalculatedSize];
@@ -233,9 +250,9 @@ var CPSplitViewHorizontalImage = nil,
{
if (!_needsResizeSubviews)
return;
_needsResizeSubviews = NO;
var subviews = [self subviews],
count = subviews.length,
oldSize = CGSizeMakeZero();
@@ -250,10 +267,10 @@ var CPSplitViewHorizontalImage = nil,
oldSize.width = CGRectGetWidth([self frame]);
oldSize.height += [self dividerThickness] * (count - 1);
}
while (count--)
oldSize[_sizeComponent] += [subviews[count] frame].size[_sizeComponent];
[self resizeSubviewsWithOldSize:oldSize];
}
@@ -266,7 +283,7 @@ var CPSplitViewHorizontalImage = nil,
if ([_delegate respondsToSelector:@selector(splitView:effectiveRect:forDrawnRect:ofDividerAtIndex:)])
effectiveRect = [_delegate splitView:self effectiveRect:effectiveRect forDrawnRect:effectiveRect ofDividerAtIndex:anIndex];
if ([_delegate respondsToSelector:@selector(splitView:additionalEffectiveRectOfDividerAtIndex:)])
additionalRect = [_delegate splitView:self additionalEffectiveRectOfDividerAtIndex:anIndex];
@@ -277,9 +294,9 @@ var CPSplitViewHorizontalImage = nil,
{
if ([self isHidden] || ![self hitTests] || !CGRectContainsPoint([self frame], aPoint))
return nil;
var point = [self convertPoint:aPoint fromView:[self superview]];
var count = [_subviews count] - 1;
for (var i = 0; i < count; i++)
{
@@ -297,7 +314,7 @@ var CPSplitViewHorizontalImage = nil,
- (void)trackDivider:(CPEvent)anEvent
{
var type = [anEvent type];
if (type == CPLeftMouseUp)
{
if (_currentDivider != CPNotFound)
@@ -353,6 +370,9 @@ var CPSplitViewHorizontalImage = nil,
}
}
}
if (_currentDivider === CPNotFound)
return;
}
else if (type == CPLeftMouseDragged && _currentDivider != CPNotFound)
@@ -367,6 +387,7 @@ var CPSplitViewHorizontalImage = nil,
- (void)mouseDown:(CPEvent)anEvent
{
// FIXME: This should not trap events if not on a divider!
[self trackDivider:anEvent];
}
@@ -382,10 +403,12 @@ var CPSplitViewHorizontalImage = nil,
- (float)minPossiblePositionOfDividerAtIndex:(int)dividerIndex
{
var frame = [_subviews[dividerIndex - 1] frame];
if (dividerIndex > 0)
{
var frame = [_subviews[dividerIndex - 1] frame];
return frame.origin[_originComponent] + frame.size[_sizeComponent] + [self dividerThickness];
}
else
return 0;
}
@@ -412,9 +435,9 @@ var CPSplitViewHorizontalImage = nil,
var frame = [self frame],
viewA = _subviews[dividerIndex],
frameA = [viewA frame],
viewB = _subviews[dividerIndex+1],
viewB = _subviews[dividerIndex + 1],
frameB = [viewB frame];
var realPosition = MAX(MIN(position, actualMax), actualMin);
if (position < proposedMin + (actualMin - proposedMin) / 2)
@@ -451,25 +474,59 @@ var CPSplitViewHorizontalImage = nil,
[self _postNotificationWillResize];
var frame = [self frame];
var index = 0,
count = [_subviews count],
dividerThickness = [self dividerThickness];
for (; index < count; ++index)
bounds = [self bounds],
dividerThickness = [self dividerThickness],
totalDividers = count - 1,
totalSizableSpace = 0,
nonSizableSpace = 0,
lastSizableIndex = -1,
totalSizablePanes = 0,
isVertical = [self isVertical];
for (index = 0; index < count; ++index)
{
var view = _subviews[index],
newFrame = CGRectCreateCopy(frame);
if (index + 1 == count)
newFrame.size[_sizeComponent] = frame.size[_sizeComponent] - newFrame.origin[_originComponent];
else
newFrame.size[_sizeComponent] = frame.size[_sizeComponent] * ([view frame].size[_sizeComponent] / oldSize[_sizeComponent]);
frame.origin[_originComponent] += newFrame.size[_sizeComponent] + dividerThickness;
[view setFrame:newFrame];
isSizable = isVertical ? [view autoresizingMask] & CPViewWidthSizable : [view autoresizingMask] & CPViewHeightSizable;
if (isSizable)
{
totalSizableSpace += [view frame].size[_sizeComponent];
lastSizableIndex = index;
totalSizablePanes++;
}
}
if (totalSizablePanes === count)
totalSizableSpace = 0;
var nonSizableSpace = totalSizableSpace ? bounds.size[_sizeComponent] - totalSizableSpace : 0,
remainingFlexibleSpace = bounds.size[_sizeComponent] - oldSize[_sizeComponent],
oldDimension = (oldSize[_sizeComponent]- totalDividers*dividerThickness - nonSizableSpace),
ratio = oldDimension <= 0 ? 0 : (bounds.size[_sizeComponent] - totalDividers*dividerThickness - nonSizableSpace) / oldDimension;
for (index = 0; index < count; ++index)
{
var view = _subviews[index],
viewFrame = CGRectMakeCopy(bounds),
isSizable = isVertical ? [view autoresizingMask] & CPViewWidthSizable : [view autoresizingMask] & CPViewHeightSizable;
if (index + 1 == count)
viewFrame.size[_sizeComponent] = bounds.size[_sizeComponent] - viewFrame.origin[_originComponent];
else if (totalSizableSpace && isSizable && lastSizableIndex === index)
viewFrame.size[_sizeComponent] = MAX(0, ROUND([view frame].size[_sizeComponent] + remainingFlexibleSpace))
else if (isSizable || !totalSizableSpace)
{
viewFrame.size[_sizeComponent] = MAX(0, ROUND(ratio * [view frame].size[_sizeComponent]));
remainingFlexibleSpace -= (viewFrame.size[_sizeComponent] - [view frame].size[_sizeComponent]);
}
else if (totalSizableSpace && !isSizable)
viewFrame.size[_sizeComponent] = [view frame].size[_sizeComponent];
bounds.origin[_originComponent] += viewFrame.size[_sizeComponent] + dividerThickness;
[view setFrame:viewFrame];
}
[self _postNotificationDidResize];
@@ -515,8 +572,8 @@ var CPSplitViewDelegateKey = "CPSplitViewDelegateKey",
@implementation CPSplitView (CPCoding)
/*
Initializes the split view by unarchiving data from <code>aCoder</code>.
@param aCoder the coder containing the archived <objj>CPSplitView</objj>.
Initializes the split view by unarchiving data from \c aCoder.
@param aCoder the coder containing the archived CPSplitView.
*/
- (id)initWithCoder:(CPCoder)aCoder
{
+8 -30
View File
@@ -20,14 +20,14 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
import <Foundation/CPString.j>
@import <Foundation/CPString.j>
@import "CPPlatformString.j"
var CPStringReferenceElement = nil;
@implementation CPString (CPStringDrawing)
/*
/*!
Returns the string
*/
- (CPString)cssString
@@ -37,34 +37,12 @@ var CPStringReferenceElement = nil;
- (CGSize)sizeWithFont:(CPFont)aFont
{
if (!CPStringReferenceElement)
{
CPStringReferenceElement = document.createElement("span");
var style = CPStringReferenceElement.style;
style.position = "absolute";
style.whiteSpace = "pre";
style.visibility = "visible";
style.padding = "0px";
style.margin = "0px";
style.left = "-100000px";
style.top = "-100000px";
style.zIndex = "10000";
style.background = "red";
document.getElementsByTagName("body")[0].appendChild(CPStringReferenceElement);
}
CPStringReferenceElement.style.font = [aFont ? aFont : [CPFont systemFontOfSize:12.0] cssString];
return [self sizeWithFont:aFont inWidth:NULL];
}
if (CPFeatureIsCompatible(CPJavascriptInnerTextFeature))
CPStringReferenceElement.innerText = self;
else if (CPFeatureIsCompatible(CPJavascriptTextContentFeature))
CPStringReferenceElement.textContent = self;
return CGSizeMake(CPStringReferenceElement.clientWidth, CPStringReferenceElement.clientHeight);
- (CGSize)sizeWithFont:(CPFont)aFont inWidth:(float)aWidth
{
return [CPPlatformString sizeOfString:self withFont:aFont forWidth:aWidth];
}
@end
+108 -39
View File
@@ -20,12 +20,13 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
import "CPImageView.j"
import "CPTabViewItem.j"
import "CPView.j"
@import "CPImageView.j"
@import "CPTabViewItem.j"
@import "CPView.j"
#include "CoreGraphics/CGGeometry.h"
/*
Places tabs on top with a bezeled border.
@global
@@ -68,15 +69,18 @@ var CPTabViewDidSelectTabViewItemSelector = 1,
CPTabViewWillSelectTabViewItemSelector = 4,
CPTabViewDidChangeNumberOfTabViewItemsSelector = 8;
/*
This class represents a view that has multiple subviews (<objj>CPTabViewItem</objj>) presented as individual tabs.
Only one <objj>CPTabViewItem</objj> is shown at a time, and other <objj>CPTabViewItem</objj>s can be made visible
(one at a time) by clicking on the <objj>CPTabViewItem</objj>'s tab at the top of the tab view.
/*!
@ingroup appkit
@class CPTabView
This class represents a view that has multiple subviews (CPTabViewItem) presented as individual tabs.
Only one CPTabViewItem is shown at a time, and other CPTabViewItems can be made visible
(one at a time) by clicking on the CPTabViewItem's tab at the top of the tab view.
THe currently selected <objj>CPTabViewItem</objj> is the view that is displayed.
THe currently selected CPTabViewItem is the view that is displayed.
*/
@implementation CPTabView : CPView
{
{
CPView _labelsView;
CPView _backgroundView;
CPView _separatorView;
@@ -219,8 +223,8 @@ var CPTabViewDidSelectTabViewItemSelector = 1,
}
// Adding and Removing Tabs
/*
Adds a <objj>CPTabViewItem</objj> to the tab view.
/*!
Adds a CPTabViewItem to the tab view.
@param aTabViewItem the item to add
*/
- (void)addTabViewItem:(CPTabViewItem)aTabViewItem
@@ -228,18 +232,23 @@ var CPTabViewDidSelectTabViewItemSelector = 1,
[self insertTabViewItem:aTabViewItem atIndex:[_tabViewItems count]];
}
/*
Inserts a <objj>CPTabViewItem</objj> into the tab view
/*!
Inserts a CPTabViewItem into the tab view
at the specified index.
@param aTabViewItem the item to insert
@param anIndex the index for the item
*/
- (void)insertTabViewItem:(CPTabViewItem)aTabViewItem atIndex:(unsigned)anIndex
{
if (!_labelsView && _tabViewType == CPTopTabsBezelBorder)
[self _createBezelBorder];
[_tabViewItems insertObject:aTabViewItem atIndex:anIndex];
[_labelsView tabView:self didAddTabViewItem:aTabViewItem];
[aTabViewItem _setTabView:self];
if ([_tabViewItems count] == 1)
[self selectFirstTabViewItem:self];
@@ -247,22 +256,26 @@ var CPTabViewDidSelectTabViewItemSelector = 1,
[_delegate tabViewDidChangeNumberOfTabViewItems:self];
}
/*
/*!
Removes the specified tab view item from the tab view.
@param aTabViewItem the item to remove
*/
- (void)removeTabViewItem:(CPTabViewItem)aTabViewItem
{
[_tabViewItems removeObjectIdenticalTo:aTabViewItem];
var index = [self indexOfTabViewItem:aTabViewItem];
[_labelsView tabView:self didRemoveTabViewItem:aTabViewItem];
[_tabViewItems removeObjectIdenticalTo:aTabViewItem];
[_labelsView tabView:self didRemoveTabViewItemAtIndex:index];
[aTabViewItem _setTabView:nil];
if (_delegateSelectors & CPTabViewDidChangeNumberOfTabViewItemsSelector)
[_delegate tabViewDidChangeNumberOfTabViewItems:self];
}
// Accessing Tabs
/*
/*!
Returns the index of the specified item
@param aTabViewItem the item to find the index for
*/
@@ -271,8 +284,8 @@ var CPTabViewDidSelectTabViewItemSelector = 1,
return [_tabViewItems indexOfObjectIdenticalTo:aTabViewItem];
}
/*
Returns the index of the <objj>CPTabViewItem</objj> with the specified identifier.
/*!
Returns the index of the CPTabViewItem with the specified identifier.
@param anIdentifier the identifier of the item
*/
- (int)indexOfTabViewItemWithIdentifier:(CPString)anIdentifier
@@ -281,13 +294,13 @@ var CPTabViewDidSelectTabViewItemSelector = 1,
count = [_tabViewItems count];
for (; index < count; ++index)
if ([[_tabViewItems[index] identifier] isEqualTo:anIdentifier])
if ([[_tabViewItems[index] identifier] isEqual:anIdentifier])
return index;
return index;
}
/*
/*!
Returns the number of items in the tab view.
*/
- (unsigned)numberOfTabViewItems
@@ -295,15 +308,15 @@ var CPTabViewDidSelectTabViewItemSelector = 1,
return [_tabViewItems count];
}
/*
Returns the <objj>CPTabViewItem</objj> at the specified index.
/*!
Returns the CPTabViewItem at the specified index.
*/
- (CPTabViewItem)tabViewItemAtIndex:(unsigned)anIndex
{
return _tabViewItems[anIndex];
}
/*
/*!
Returns the array of items that backs this tab view.
*/
- (CPArray)tabViewItems
@@ -312,7 +325,7 @@ var CPTabViewDidSelectTabViewItemSelector = 1,
}
// Selecting a Tab
/*
/*!
Sets the first tab view item in the array to be displayed to the user.
@param aSender the object making this request
*/
@@ -324,7 +337,7 @@ var CPTabViewDidSelectTabViewItemSelector = 1,
[self selectTabViewItemAtIndex:0];
}
/*
/*!
Sets the last tab view item in the array to be displayed to the user.
@param aSender the object making this request
*/
@@ -336,7 +349,7 @@ var CPTabViewDidSelectTabViewItemSelector = 1,
[self selectTabViewItemAtIndex:count - 1];
}
/*
/*!
Sets the next tab item in the array to be displayed.
@param aSender the object making this request
*/
@@ -351,7 +364,7 @@ var CPTabViewDidSelectTabViewItemSelector = 1,
[self selectTabViewItemAtIndex:index + 1 % count];
}
/*
/*!
Selects the previous item in the array for display.
@param aSender the object making this request
*/
@@ -366,7 +379,7 @@ var CPTabViewDidSelectTabViewItemSelector = 1,
[self selectTabViewItemAtIndex:index == 0 ? count : index - 1];
}
/*
/*!
Displays the specified item in the tab view.
@param aTabViewItem the item to display
*/
@@ -409,7 +422,7 @@ var CPTabViewDidSelectTabViewItemSelector = 1,
[_delegate tabView:self didSelectTabViewItem:aTabViewItem];
}
/*
/*!
Selects the item at the specified index.
@param anIndex the index of the item to display.
*/
@@ -418,7 +431,7 @@ var CPTabViewDidSelectTabViewItemSelector = 1,
[self selectTabViewItem:_tabViewItems[anIndex]];
}
/*
/*!
Returns the current item being displayed.
*/
- (CPTabViewItem)selectedTabViewItem
@@ -427,7 +440,7 @@ var CPTabViewDidSelectTabViewItemSelector = 1,
}
//
/*
/*!
Sets the tab view type.
@param aTabViewType the view type
*/
@@ -441,7 +454,7 @@ var CPTabViewDidSelectTabViewItemSelector = 1,
if (_tabViewType == CPNoTabsBezelBorder || _tabViewType == CPNoTabsLineBorder || _tabViewType == CPNoTabsNoBorder)
[_labelsView removeFromSuperview];
else if (![_labelsView superview])
[self addSubview:_lablesView];
[self addSubview:_labelsView];
if (_tabViewType == CPNoTabsLineBorder || _tabViewType == CPNoTabsNoBorder)
[_backgroundView removeFromSuperview];
@@ -451,7 +464,7 @@ var CPTabViewDidSelectTabViewItemSelector = 1,
[self layoutSubviews];
}
/*
/*!
Returns the tab view type.
*/
- (CPTabViewType)tabViewType
@@ -460,7 +473,7 @@ var CPTabViewDidSelectTabViewItemSelector = 1,
}
// Determining the Size
/*
/*!
Returns the content rectangle.
*/
- (CGRect)contentRect
@@ -483,7 +496,15 @@ var CPTabViewDidSelectTabViewItemSelector = 1,
return contentRect;
}
/*
/*!
Returns the receiver's delegate.
*/
- (id)delegate
{
return _delegate;
}
/*!
Sets the delegate for this tab view.
@param aDelegate the tab view's delegate
*/
@@ -522,6 +543,55 @@ var CPTabViewDidSelectTabViewItemSelector = 1,
@end
var CPTabViewItemsKey = "CPTabViewItemsKey",
CPTabViewSelectedItemKey = "CPTabViewSelectedItemKey",
CPTabViewTypeKey = "CPTabViewTypeKey",
CPTabViewDelegateKey = "CPTabViewDelegateKey";
@implementation CPTabView (CPCoding)
- (id)initWithCoder:(CPCoder)aCoder
{
if (self = [super initWithCoder:aCoder])
{
_tabViewType = [aCoder decodeIntForKey:CPTabViewTypeKey];
_tabViewItems = [];
// FIXME: this is somewhat hacky
[self _createBezelBorder];
var items = [aCoder decodeObjectForKey:CPTabViewItemsKey];
for (var i = 0; items && i < items.length; i++)
[self insertTabViewItem:items[i] atIndex:i];
var selected = [aCoder decodeObjectForKey:CPTabViewSelectedItemKey];
if (selected)
[self selectTabViewItem:selected];
[self setDelegate:[aCoder decodeObjectForKey:CPTabViewDelegateKey]];
}
return self;
}
- (void)encodeWithCoder:(CPCoder)aCoder
{
var actualSubviews = _subviews;
_subviews = [];
[super encodeWithCoder:aCoder];
_subviews = actualSubviews;
[aCoder encodeObject:_tabViewItems forKey:CPTabViewItemsKey];;
[aCoder encodeObject:_selectedTabViewItem forKey:CPTabViewSelectedItemKey];
[aCoder encodeInt:_tabViewType forKey:CPTabViewTypeKey];
[aCoder encodeConditionalObject:_delegate forKey:CPTabViewDelegateKey];
}
@end
var _CPTabLabelsViewBackgroundColor = nil,
_CPTabLabelsViewInsideMargin = 10.0,
_CPTabLabelsViewOutsideMargin = 15.0;
@@ -592,10 +662,9 @@ var _CPTabLabelsViewBackgroundColor = nil,
[self layoutSubviews];
}
- (void)tabView:(CPTabView)aTabView didRemoveTabViewItem:(CPTabViewItem)aTabViewItem
- (void)tabView:(CPTabView)aTabView didRemoveTabViewItemAtIndex:(unsigned)index
{
var index = [aTabView indexOfTabViewItem:aTabViewItem],
label = _tabLabels[index];
var label = _tabLabels[index];
[_tabLabels removeObjectAtIndex:index];
+73 -19
View File
@@ -20,9 +20,10 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
import <Foundation/CPObject.j>
@import <Foundation/CPObject.j>
@import <AppKit/CPView.j>
import <AppKit/CPView.j>
/*
The tab is currently selected.
@@ -43,9 +44,12 @@ CPBackgroundTab = 1;
*/
CPPressedTab = 2;
/*
The class representation of an item in a <objj>CPTabView</objj>. One tab view item
can be shown at a time in a <objj>CPTabView</objj>.
/*!
@ingroup appkit
@class CPTabViewItem
The class representation of an item in a CPTabView. One tab view item
can be shown at a time in a CPTabView.
*/
@implementation CPTabViewItem : CPObject
{
@@ -54,11 +58,18 @@ CPPressedTab = 2;
CPView _view;
CPView _auxiliaryView;
CPTabView _tabView;
}
/*
- (id)init
{
return [self initWithIdentifier:@""];
}
/*!
Initializes the tab view item with the specified identifier.
@return the initialized <objj>CPTabViewItem</objj>
@return the initialized CPTabViewItem
*/
- (id)initWithIdentifier:(id)anIdentifier
{
@@ -71,8 +82,8 @@ CPPressedTab = 2;
}
// Working With Labels
/*
Sets the <objj>CPTabViewItem</objj>'s label.
/*!
Sets the CPTabViewItem's label.
@param aLabel the label for the item
*/
- (void)setLabel:(CPString)aLabel
@@ -80,8 +91,8 @@ CPPressedTab = 2;
_label = aLabel;
}
/*
Returns the <objj>CPTabViewItem</objj>'s label
/*!
Returns the CPTabViewItem's label
*/
- (CPString)label
{
@@ -89,7 +100,7 @@ CPPressedTab = 2;
}
// Checking the Tab Display State
/*
/*!
Returns the tab's current state.
*/
- (CPTabState)tabState
@@ -98,7 +109,7 @@ CPPressedTab = 2;
}
// Assigning an Identifier Object
/*
/*!
Sets the item's identifier.
@param anIdentifier the new identifier for the item
*/
@@ -107,7 +118,7 @@ CPPressedTab = 2;
_identifier = anIdentifier;
}
/*
/*!
Returns the tab's identifier.
*/
- (id)identifier
@@ -116,7 +127,7 @@ CPPressedTab = 2;
}
// Assigning a View
/*
/*!
Sets the view that gets displayed in this tab.
*/
- (void)setView:(CPView)aView
@@ -124,7 +135,7 @@ CPPressedTab = 2;
_view = aView;
}
/*
/*!
Returns the tab's view.
*/
- (CPView)view
@@ -133,7 +144,7 @@ CPPressedTab = 2;
}
// Assigning an Auxiliary View
/*
/*!
Sets the tab's auxillary view.
@param anAuxillaryView the new auxillary view
*/
@@ -142,7 +153,7 @@ CPPressedTab = 2;
_auxiliaryView = anAuxiliaryView;
}
/*
/*!
Returns the tab's auxillary view
*/
- (CPView)auxiliaryView
@@ -151,7 +162,7 @@ CPPressedTab = 2;
}
// Accessing the Parent Tab View
/*
/*!
Returns the tab view that contains this item.
*/
- (CPTabView)tabView
@@ -159,4 +170,47 @@ CPPressedTab = 2;
return _tabView;
}
/*!
@ignore
*/
- (void)_setTabView:(CPTabView)aView
{
_tabView = aView;
}
@end
var CPTabViewItemIdentifierKey = "CPTabViewItemIdentifierKey",
CPTabViewItemLabelKey = "CPTabViewItemLabelKey",
CPTabViewItemViewKey = "CPTabViewItemViewKey",
CPTabViewItemAuxViewKey = "CPTabViewItemAuxViewKey";
@implementation CPTabViewItem (CPCoding)
- (id)initWithCoder:(CPCoder)aCoder
{
self = [super init];
if (self)
{
_identifier = [aCoder decodeObjectForKey:CPTabViewItemIdentifierKey];
_label = [aCoder decodeObjectForKey:CPTabViewItemLabelKey];
_view = [aCoder decodeObjectForKey:CPTabViewItemViewKey];
_auxiliaryView = [aCoder decodeObjectForKey:CPTabViewItemAuxViewKey];
}
return self;
}
- (void)encodeWithCoder:(CPCoder)aCoder
{
[aCoder encodeObject:_identifier forKey:CPTabViewItemIdentifierKey];
[aCoder encodeObject:_label forKey:CPTabViewItemLabelKey];
[aCoder encodeObject:_view forKey:CPTabViewItemViewKey];
[aCoder encodeObject:_auxiliaryView forKey:CPTabViewItemAuxViewKey];
}
@end
+350 -159
View File
@@ -3,7 +3,7 @@
* AppKit
*
* Created by Francisco Tolmasky.
* Copyright 2008, 280 North, Inc.
* Copyright 2009, 280 North, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -20,256 +20,447 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
@import <Foundation/CPDictionary.j>
@import <Foundation/CPObject.j>
@import <Foundation/CPSortDescriptor.j>
@import <Foundation/CPString.j>
import <Foundation/Foundation.j>
@import "CPTableHeaderView.j"
/*
@ignore
*/
#include "CoreGraphics/CGGeometry.h"
/*
@global
@class CPTableColumn
*/
CPTableColumnNoResizing = 0;
/*
@global
@class CPTableColumn
*/
CPTableColumnAutoresizingMask = 1;
/*
@global
@class CPTableColumn
*/
CPTableColumnUserResizingMask = 2;
CPTableColumnAutoresizingMask = 1 << 0;
CPTableColumnUserResizingMask = 1 << 1;
/*
An <objj>CPTableColumn</objj> object mainly keeps information about the width of the column, its minimum and maximum width; whether the column can be edited or resized; and the cells used to draw the column header and the data in the column. You can change all these attributes of the column by calling the appropriate methods. Please note that the table column does not hold nor has access to the data to be displayed in the column; this data is maintained in the table view's data source.</p>
<p>Each <objj>CPTableColumn</objj> object is identified by a <objj>CPString</objj>, called the column identifier. The reason is that, after a column has been added to a table view, the user might move the columns around, so there is a need to identify the columns regardless of its position in the table.
@ignore
*/
@implementation CPTableColumn : CPObject
{
CPString _identifier;
CPTableView _tableView;
CPView _headerView;
CPView _dataView;
Object _dataViewData;
float _width;
float _minWidth;
float _maxWidth;
unsigned _resizingMask;
id _identifier;
BOOL _isEditable;
CPSortDescriptor _sortDescriptorPrototype;
BOOL _isHidden;
CPString _headerToolTip;
CPTableView _tableView;
float _width;
float _minWidth;
float _maxWidth;
unsigned _resizingMask;
BOOL _disableResizingPosting @accessors(property=disableResizingPosting);
}
/*
Initializes the table column with the specified identifier.
@param anIdentifier the identifier
@return the initialized table column
*/
- (id)initWithIdentifier:(CPString)anIdentifier
- (id)init
{
return [self initWithIdentifier:@""];
}
- (id)initWithIdentifier:(id)anIdentifier
{
self = [super init];
if (self)
{
_identifier = anIdentifier;
_dataViewData = { };
_width = 100.0;
_minWidth = 10.0;
_maxWidth = 1000000.0;
_resizingMask = CPTableColumnAutoresizingMask | CPTableColumnUserResizingMask;
_disableResizingPosting = NO;
_width = 40.0;
_minWidth = 8.0;
_maxWidth = 1000.0;
[self setIdentifier:anIdentifier];
var header = [[_CPTableColumnHeaderView alloc] initWithFrame:CGRectMakeZero()];
[self setHeaderView:header];
// FIXME
_dataCell = [[CPTextField alloc] initWithFrame:CPRectMakeZero()];
var textDataView = [CPTextField new];
[textDataView setLineBreakMode:CPLineBreakByTruncatingTail];
[textDataView setValue:[CPColor colorWithHexString:@"333333"] forThemeAttribute:@"text-color"];
[textDataView setValue:[CPColor whiteColor] forThemeAttribute:@"text-color" inState:CPThemeStateHighlighted];
[textDataView setValue:[CPFont boldSystemFontOfSize:12] forThemeAttribute:@"font" inState:CPThemeStateHighlighted];
[textDataView setValue:CPCenterVerticalTextAlignment forThemeAttribute:@"vertical-alignment"];
[self setDataView:textDataView];
}
return self;
}
/*
Sets the table column's identifier
@param anIdentifier the new identifier
*/
- (void)setIdentifier:(CPString)anIdentifier
{
_identifier = anIdentifier;
}
/*
Returns the table column's identifier
*/
- (CPString)identifier
{
return _identifier;
}
// Setting the CPTableView
/*
Sets the table's view. This is called automatically by Cappuccino.
@param aTableView the new table view
*/
- (void)setTableView:(CPTableView)aTableView
{
_tableView = aTableView;
}
/*
Returns the column's table view.
*/
- (CPTableView)tableView
{
return _tableView;
}
// Controlling size
/*
Sets the column's width.
@param aWidth the new column width
*/
- (void)setWidth:(float)aWidth
{
_width = aWidth;
aWidth = +aWidth;
if (_width === aWidth)
return;
var newWidth = MIN(MAX(aWidth, [self minWidth]), [self maxWidth]);
if (_width === newWidth)
return;
var oldWidth = _width;
_width = newWidth;
var tableView = [self tableView];
if (tableView)
{
var index = [[tableView tableColumns] indexOfObjectIdenticalTo:self],
dirtyTableColumnRangeIndex = tableView._dirtyTableColumnRangeIndex;
if (dirtyTableColumnRangeIndex < 0)
tableView._dirtyTableColumnRangeIndex = index;
else
tableView._dirtyTableColumnRangeIndex = MIN(index, tableView._dirtyTableColumnRangeIndex);
var rows = tableView._exposedRows,
columns = [CPIndexSet indexSetWithIndexesInRange:CPMakeRange(index, [tableView._exposedColumns lastIndex] - index + 1)];
// FIXME: Would be faster with some sort of -setNeedsDisplayInColumns: that updates a dirtyTableColumnForDisplay cache; then marked columns would relayout their data views at display time.
[tableView _layoutDataViewsInRows:rows columns:columns];
[tableView tile];
if (!_disableResizingPosting)
[self _postDidResizeNotificationWithOldWidth:oldWidth];
}
}
/*
Returns the column's width
*/
- (float)width
{
return _width;
}
/*
Sets column's minimum width.
@param aWidth the new minimum column width
*/
- (void)setMinWidth:(float)aWidth
- (void)setMinWidth:(float)aMinWidth
{
if (_width < (_minWidth = aWidth))
[self setWidth:_minWidth];
aMinWidth = +aMinWidth;
if (_minWidth === aMinWidth)
return;
_minWidth = aMinWidth;
var width = [self width],
newWidth = MAX(width, [self minWidth]);
if (width !== newWidth)
[self setWidth:newWidth];
}
/*
The column's minimum width
*/
- (float)minWidth
{
return _minWidth;
}
/*
Sets the column's maximum width.
@param aWidth the new maximum width
*/
- (void)setMaxWidth:(float)aWidth
- (void)setMaxWidth:(float)aMaxWidth
{
if (_width > (_maxmimumWidth = aWidth))
[self setWidth:_maxWidth];
aMaxWidth = +aMaxWidth;
if (_maxWidth === aMaxWidth)
return;
_maxWidth = aMaxWidth;
var width = [self width],
newWidth = MIN(width, [self maxWidth]);
if (width !== newWidth)
[self setWidth:newWidth];
}
/*
Sets the resizing mask. The mask is one of:
<pre>
CPTableColumnNoResizing;
CPTableColumnAutoresizingMask;
CPTableColumnUserResizingMask;
</pre>
@param aMask the new resizing mask
*/
- (void)setResizingMask:(unsigned)aMask
- (float)maxWidth
{
_resizingMask = aMask;
return _maxWidth;
}
- (void)setResizingMask:(unsigned)aResizingMask
{
_resizingMask = aResizingMask;
}
/*
Returns the column's resizing mask. One of:
<pre>
CPTableColumnNoResizing;
CPTableColumnAutoresizingMask;
CPTableColumnUserResizingMask;
</pre>
*/
- (unsigned)resizingMask
{
return _resizingMask;
}
/*
Resizes the column according to the min, max and set width.
*/
- (void)sizeToFit
{
var width = CPRectGetWidth([_headerView frame]);
if (width < _minWidth)
var width = _CGRectGetWidth([_headerView frame]);
if (width < [self minWidth])
[self setMinWidth:width];
else if (width > _maxWidth)
else if (width > [self maxWidth])
[self setMaxWidth:width]
if (_width != width)
if (_width !== width)
[self setWidth:width];
}
/*
Sets whether the column in this data is editable.
@param aFlag <code>YES</code> means the column data is editable
*/
- (void)setEditable:(BOOL)aFlag
//Setting Component Cells
- (void)setHeaderView:(CPView)aView
{
_isEditable = aFlag;
if (!aView)
[CPException raise:CPInvalidArgumentException reason:@"Attempt to set nil header view on " + [self description]];
_headerView = aView;
var tableHeaderView = [_tableView headerView];
[tableHeaderView setNeedsLayout];
[tableHeaderView setNeedsDisplay:YES];
}
- (CPView)headerView
{
return _headerView;
}
/*!
This method set's the "prototype" view which will be used to create all table cells in this column.
It creates a snapshot of aView, using keyed archiving, which is then copied over and over for each
individual cell that is shown. As a result, changes made after calling this method won't be reflected.
Example:
[tableColumn setDataView:someView]; // snapshot taken
[[tableColumn dataView] setSomething:x]; //won't work
This doesn't work because the snapshot is taken before the new property is applied. Instead, do:
[someView setSomething:x];
[tableColumn setDataView:someView];
*/
- (void)setDataView:(CPView)aView
{
if (_dataView === aView)
return;
if (_dataView)
_dataViewData[[_dataView UID]] = nil;
_dataView = aView;
_dataViewData[[aView UID]] = [CPKeyedArchiver archivedDataWithRootObject:aView];
}
- (CPView)dataView
{
return _dataView;
}
/*
Returns <code>YES</code> if the column data is editable.
Returns the CPView object used by the CPTableView to draw values for the receiver.
By default, this method just calls dataView. Subclassers can override if they need to
potentially use different cells for different rows. Subclasses should expect this method
to be invoked with row equal to -1 in cases where no actual row is involved but the table
view needs to get some generic cell info.
*/
- (id)dataViewForRow:(int)aRowIndex
{
return [self dataView];
}
- (id)_newDataViewForRow:(int)aRowIndex
{
var dataView = [self dataViewForRow:aRowIndex],
dataViewUID = [dataView UID];
var x = [self tableView]._cachedDataViews[dataViewUID];
if (x && x.length)
return x.pop();
// if we haven't cached an archive of the data view, do it now
if (!_dataViewData[dataViewUID])
_dataViewData[dataViewUID] = [CPKeyedArchiver archivedDataWithRootObject:dataView];
// unarchive the data view cache
var newDataView = [CPKeyedUnarchiver unarchiveObjectWithData:_dataViewData[dataViewUID]];
newDataView.identifier = dataViewUID;
return newDataView;
}
//Setting the Identifier
/*
Sets the receiver identifier to anIdentifier.
*/
- (void)setIdentifier:(id)anIdentifier
{
_identifier = anIdentifier;
}
/*
Returns the object used by the data source to identify the attribute corresponding to the receiver.
*/
- (id)identifier
{
return _identifier;
}
//Controlling Editability
/*
Controls whether the user can edit cells in the receiver by double-clicking them.
*/
- (void)setEditable:(BOOL)shouldBeEditable
{
_isEditable = shouldBeEditable;
}
/*
Returns YES if the user can edit cells associated with the receiver by double-clicking the
column in the NSTableView, NO otherwise.
*/
- (BOOL)isEditable
{
return _isEditable;
}
/*
Sets the view that draws the column's header.
@param aHeaderView the view that will draws the column header
*/
- (void)setHeaderView:(CPView)aHeaderView
//Sorting
- (void)setSortDescriptorPrototype:(CPSortDescriptor)aSortDescriptor
{
_headerView = aHeaderView;
_sortDescriptorPrototype = aSortDescriptor;
}
/*
Return the view that draws the column's header
*/
- (CPView)headerView
- (CPSortDescriptor)sortDescriptorPrototype
{
return _headerView;
return _sortDescriptorPrototype;
}
/*
Sets the data cell that draws rows in this column.
*/
- (void)setDataCell:(CPCell)aDataCell
//Setting Column Visibility
- (void)setHidden:(BOOL)shouldBeHidden
{
_dataCell = aDataCell;
_isHidden = shouldBeHidden;
}
/*
Returns the data cell that draws rows in this column
*/
- (CPCell)dataCell
- (BOOL)isHidden
{
return _dataCell;
return _isHidden;
}
//Setting Tool Tips
/*
By default returns the value from <code>dataCell</code>. This can
be overridden by a subclass to return different cells for different
rows.
@param aRowIndex the index of the row to obtain the cell for
Sets the tooltip string that is displayed when the cursor pauses over the
header cell of the receiver.
*/
- (CPCell)dataCellForRow:(int)aRowIndex
- (void)setHeaderToolTip:(CPString)aToolTip
{
return [self dataCell];
_headerToolTip = aToolTip;
}
- (CPString)headerToolTip
{
return _headerToolTip;
}
- (void)_postDidResizeNotificationWithOldWidth:(float)oldWidth
{
[[CPNotificationCenter defaultCenter]
postNotificationName:CPTableViewColumnDidResizeNotification
object:[self tableView]
userInfo:[CPDictionary dictionaryWithObjects:[self, oldWidth] forKeys:[@"CPTableColumn", "CPOldWidth"]]];
}
@end
var CPTableColumnIdentifierKey = @"CPTableColumnIdentifierKey",
CPTableColumnHeaderViewKey = @"CPTableColumnHeaderViewKey",
CPTableColumnDataViewKey = @"CPTableColumnDataViewKey",
CPTableColumnWidthKey = @"CPTableColumnWidthKey",
CPTableColumnMinWidthKey = @"CPTableColumnMinWidthKey",
CPTableColumnMaxWidthKey = @"CPTableColumnMaxWidthKey",
CPTableColumnResizingMaskKey = @"CPTableColumnResizingMaskKey";
@implementation CPTableColumn (CPCoding)
- (id)initWithCoder:(CPCoder)aCoder
{
self = [super init];
if (self)
{
_dataViewData = { };
_width = [aCoder decodeFloatForKey:CPTableColumnWidthKey];
_minWidth = [aCoder decodeFloatForKey:CPTableColumnMinWidthKey];
_maxWidth = [aCoder decodeFloatForKey:CPTableColumnMaxWidthKey];
[self setIdentifier:[aCoder decodeObjectForKey:CPTableColumnIdentifierKey]];
[self setHeaderView:[aCoder decodeObjectForKey:CPTableColumnHeaderViewKey]];
[self setDataView:[aCoder decodeObjectForKey:CPTableColumnDataViewKey]];
[self setHeaderView:[aCoder decodeObjectForKey:CPTableColumnHeaderViewKey]];
_resizingMask = [aCoder decodeBoolForKey:CPTableColumnResizingMaskKey];
}
return self;
}
- (void)encodeWithCoder:(CPCoder)aCoder
{
[aCoder encodeObject:_identifier forKey:CPTableColumnIdentifierKey];
[aCoder encodeObject:_width forKey:CPTableColumnWidthKey];
[aCoder encodeObject:_minWidth forKey:CPTableColumnMinWidthKey];
[aCoder encodeObject:_maxWidth forKey:CPTableColumnMaxWidthKey];
[aCoder encodeObject:_headerView forKey:CPTableColumnHeaderViewKey];
[aCoder encodeObject:_dataView forKey:CPTableColumnDataViewKey];
[aCoder encodeObject:_resizingMask forKey:CPTableColumnResizingMaskKey];
}
@end
@implementation CPTableColumn (NSInCompatibility)
- (void)setHeaderCell:(CPView)aView
{
[CPException raise:CPUnsupportedMethodException
reason:@"setHeaderCell: is not supported. -setHeaderCell:aView instead."];
}
- (CPView)headerCell
{
[CPException raise:CPUnsupportedMethodException
reason:@"headCell is not supported. -headerView instead."];
}
- (void)setDataCell:(CPView)aView
{
[CPException raise:CPUnsupportedMethodException
reason:@"setDataCell: is not supported. Use -setHeaderCell:aView instead."];
}
- (CPView)dataCell
{
[CPException raise:CPUnsupportedMethodException
reason:@"dataCell is not supported. Use -dataCell instead."];
}
- (id)dataCellForRow:(int)row
{
[CPException raise:CPUnsupportedMethodException
reason:@"dataCellForRow: is not supported. Use -dataViewForRow:row instead."];
}
@end
+503
View File
@@ -0,0 +1,503 @@
/*
* CPTableHeaderView.j
* AppKit
*
* Created by Ross Boucher.
* Copyright 2009 280 North, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
@import "CPTableColumn.j"
@import "CPTableView.j"
@import "CPView.j"
var CPThemeStatePressed = CPThemeState("pressed");
@implementation _CPTableColumnHeaderView : CPView
{
_CPImageAndTextView _textField;
}
- (void)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self)
{
[self _init];
}
return self;
}
- (void)_init
{
_textField = [[_CPImageAndTextView alloc] initWithFrame:CGRectMake(5, 1, CGRectGetWidth([self bounds]) - 10, CGRectGetHeight([self bounds]) - 1)];
[_textField setAutoresizingMask:CPViewWidthSizable|CPViewHeightSizable];
[_textField setLineBreakMode:CPLineBreakByTruncatingTail];
[_textField setTextColor: [CPColor colorWithHexString: @"333333"]];
[_textField setFont:[CPFont boldSystemFontOfSize:12.0]];
[_textField setAlignment:CPLeftTextAlignment];
[_textField setVerticalAlignment:CPCenterVerticalTextAlignment];
[_textField setTextShadowColor:[CPColor whiteColor]];
[_textField setTextShadowOffset:CGSizeMake(0,1)];
[self addSubview:_textField];
}
- (void)layoutSubviews
{
var themeState = [self themeState];
if(themeState & CPThemeStateHighlighted && themeState & CPThemeStatePressed)
[self setBackgroundColor:[CPColor colorWithPatternImage:CPAppKitImage("tableview-headerview-highlighted-pressed.png", CGSizeMake(1.0, 22.0))]];
else if (themeState & CPThemeStateHighlighted)
[self setBackgroundColor:[CPColor colorWithPatternImage:CPAppKitImage("tableview-headerview-highlighted.png", CGSizeMake(1.0, 22.0))]];
else if (themeState & CPThemeStatePressed)
[self setBackgroundColor:[CPColor colorWithPatternImage:CPAppKitImage("tableview-headerview-pressed.png", CGSizeMake(1.0, 22.0))]];
else
[self setBackgroundColor:[CPColor colorWithPatternImage:CPAppKitImage("tableview-headerview.png", CGSizeMake(1.0, 22.0))]];
}
- (void)setStringValue:(CPString)string
{
[_textField setText:string];
}
- (CPString)stringValue
{
return [_textField text];
}
- (void)textField
{
return _textField;
}
- (void)sizeToFit
{
[_textField sizeToFit];
}
- (void)setFont:(CPFont)aFont
{
[_textField setFont:aFont];
}
- (void)setValue:(id)aValue forThemeAttribute:(id)aKey
{
[_textField setValue:aValue forThemeAttribute:aKey];
}
- (void)_setIndicatorImage:(CPImage)anImage
{
if (anImage)
{
[_textField setImage:anImage];
[_textField setImagePosition:CPImageRight];
}
else
{
[_textField setImagePosition:CPNoImage];
}
}
@end
var _CPTableColumnHeaderViewStringValueKey = @"_CPTableColumnHeaderViewStringValueKey",
_CPTableColumnHeaderViewFontKey = @"_CPTableColumnHeaderViewFontKey",
_CPTableColumnHeaderViewImageKey = @"_CPTableColumnHeaderViewImageKey";
@implementation _CPTableColumnHeaderView (CPCoding)
- (id)initWithCoder:(CPCoder)aCoder
{
if (self = [super initWithCoder:aCoder])
{
[self _init];
[self _setIndicatorImage:[aCoder decodeObjectForKey:_CPTableColumnHeaderViewImageKey]];
[self setStringValue:[aCoder decodeObjectForKey:_CPTableColumnHeaderViewStringValueKey]];
[self setFont:[aCoder decodeObjectForKey:_CPTableColumnHeaderViewFontKey]];
}
return self;
}
- (void)encodeWithCoder:(CPCoder)aCoder
{
[super encodeWithCoder:aCoder];
[aCoder encodeObject:[_textField text] forKey:_CPTableColumnHeaderViewStringValueKey];
[aCoder encodeObject:[_textField image] forKey:_CPTableColumnHeaderViewImageKey];
[aCoder encodeObject:[_textField font] forKey:_CPTableColumnHeaderViewFontKey];
}
@end
@implementation CPTableHeaderView : CPView
{
int _resizedColumn @accessors(readonly, property=resizedColumn);
int _draggedColumn @accessors(readonly, property=draggedColumn);
int _pressedColumn @accessors(readonly, property=pressedColumn);
float _draggedDistance @accessors(readonly, property=draggedDistance);
float _lastLocation;
float _columnOldWidth;
CPTableView _tableView @accessors(property=tableView);
}
- (void)initWithFrame:(CGRect)aFrame
{
self = [super initWithFrame:aFrame];
if (self)
{
_resizedColumn = -1;
_draggedColumn = -1;
_pressedColumn = -1;
_draggedDistance = 0.0;
_lastLocation = nil;
_columnOldWidth = nil;
[self setBackgroundColor:[CPColor colorWithPatternImage:CPAppKitImage("tableview-headerview.png", CGSizeMake(1.0, 22.0))]];
}
return self;
}
- (int)columnAtPoint:(CGPoint)aPoint
{
return [_tableView columnAtPoint:CGPointMake(aPoint.x, 0)];
}
- (CGRect)headerRectOfColumn:(int)aColumnIndex
{
var tableColumns = [_tableView tableColumns];
if (aColumnIndex < 0 || aColumnIndex > [tableColumns count])
[CPException raise:"invalid" reason:"tried to get headerRectOfColumn: on invalid column"];
// UPDATE COLUMN RANGES ?
var tableRange = _tableView._tableColumnRanges[aColumnIndex],
bounds = [self bounds];
var rMinX = ROUND(tableRange.location);
bounds.origin.x = rMinX;
bounds.size.width = FLOOR(tableRange.length + tableRange.location - rMinX);
return bounds;
}
- (CGRect)_cursorRectForColumn:(int)column
{
if (column == -1 || !([_tableView._tableColumns[column] resizingMask] & CPTableColumnUserResizingMask))
return CGRectMakeZero();
var rect = [self headerRectOfColumn:column];
rect.origin.x = CGRectGetMaxX(rect) - 5;
rect.size.width = 20;
return rect;
}
- (void)_setPressedColumn:(CPInteger)column
{
if (_pressedColumn != -1)
{
var headerView = [_tableView._tableColumns[_pressedColumn] headerView];
[headerView unsetThemeState:CPThemeStatePressed];
}
if (column != -1)
{
var headerView = [_tableView._tableColumns[column] headerView];
[headerView setThemeState:CPThemeStatePressed];
}
_pressedColumn = column;
}
- (void)mouseDown:(CPEvent)theEvent
{
var mouseLocation = [self convertPoint:[theEvent locationInWindow] fromView:nil],
clickedColumn = [self columnAtPoint:mouseLocation];
// should we send column -1 ?
[_tableView _sendDelegateDidMouseDownInHeader:clickedColumn];
var resizeLocation = CGPointMake(mouseLocation.x - 5, mouseLocation.y),
resizedColumn = [self columnAtPoint:resizeLocation];
if (resizedColumn == -1)
return;
// 2 different tracking methods: one for resizing/stop-resizing, another one for selection/reordering
if ([_tableView allowsColumnResizing]
&& CGRectContainsPoint([self _cursorRectForColumn:resizedColumn], mouseLocation))
{
_resizedColumn = resizedColumn;
[_tableView._tableColumns[_resizedColumn] setDisableResizingPosting:YES];
[_tableView setDisableAutomaticResizing:YES];
[self trackResizeWithEvent:theEvent];
}
else
{
[self _setPressedColumn:clickedColumn];
[self trackMouseWithEvent:theEvent];
}
}
- (void)trackMouseWithEvent:(CPEvent)theEvent
{
var type = [theEvent type];
if (type == CPLeftMouseUp)
{
var location = [self convertPoint:[theEvent locationInWindow] fromView:nil],
clickedColumn = [self columnAtPoint:location];
[self _setPressedColumn:-1];
if (clickedColumn != -1)
[_tableView _didClickTableColumn:clickedColumn modifierFlags:[theEvent modifierFlags]];
return;
}
[CPApp setTarget:self selector:@selector(trackMouseWithEvent:) forNextEventMatchingMask:CPLeftMouseDraggedMask | CPLeftMouseUpMask | CPLeftMouseDownMask untilDate:nil inMode:nil dequeue:YES];
}
- (void)trackResizeWithEvent:(CPEvent)anEvent
{
var location = [self convertPoint:[anEvent locationInWindow] fromView:nil],
tableColumn = [[_tableView tableColumns] objectAtIndex:_resizedColumn],
type = [anEvent type];
if (_lastLocation == nil)
_lastLocation = location;
if (_columnOldWidth == nil)
_columnOldWidth = [tableColumn width];
if (type === CPLeftMouseUp)
{
[self _updateResizeCursor:anEvent];
[tableColumn _postDidResizeNotificationWithOldWidth:_columnOldWidth];
[tableColumn setDisableResizingPosting:NO];
[_tableView setDisableAutomaticResizing:NO];
_resizedColumn = -1;
_lastLocation = nil;
_columnOldWidth = nil;
return;
}
else if (type === CPLeftMouseDragged)
{
var newWidth = [tableColumn width] + location.x - _lastLocation.x;
if (newWidth < [tableColumn minWidth])
[[CPCursor resizeRightCursor] set];
else if (newWidth > [tableColumn maxWidth])
[[CPCursor resizeLeftCursor] set];
else
{
_tableView._lastColumnShouldSnap = NO;
[tableColumn setWidth:newWidth];
// FIXME: there has to be a better way to do this...
// We should refactor the auto resizing crap.
// We need to figure out the exact cocoa behavior here though.
_lastLocation = location;
[[CPCursor resizeLeftRightCursor] set];
[self setNeedsLayout];
[self setNeedsDisplay:YES];
}
}
[CPApp setTarget:self selector:@selector(trackResizeWithEvent:) forNextEventMatchingMask:CPLeftMouseDraggedMask | CPLeftMouseUpMask untilDate:nil inMode:nil dequeue:YES];
}
- (void)_updateResizeCursor:(CPEvent)theEvent
{
// never get stuck in resize cursor mode (FIXME take out when we turn on tracking rects)
if (![_tableView allowsColumnResizing] || ([theEvent type] === CPLeftMouseUp && ![[self window] acceptsMouseMovedEvents]))
{
[[CPCursor arrowCursor] set];
return;
}
var mouseLocation = [self convertPoint:[theEvent locationInWindow] fromView:nil],
mouseOverLocation = CGPointMake(mouseLocation.x - 5, mouseLocation.y),
overColumn = [self columnAtPoint:mouseOverLocation];
if (overColumn >= 0 && CGRectContainsPoint([self _cursorRectForColumn:overColumn], mouseLocation))
{
var tableColumn = [[_tableView tableColumns] objectAtIndex:overColumn],
width = [tableColumn width];
if (width == [tableColumn minWidth])
[[CPCursor resizeRightCursor] set];
else if (width == [tableColumn maxWidth])
[[CPCursor resizeLeftCursor] set];
else
[[CPCursor resizeLeftRightCursor] set];
}
else
[[CPCursor arrowCursor] set];
}
- (void)viewDidMoveToWindow
{
//if ([_tableView allowsColumnResizing])
// [[self window] setAcceptsMouseMovedEvents:YES];
}
- (void)mouseEntered:(CPEvent)theEvent
{
[self _updateResizeCursor:theEvent];
}
- (void)mouseMoved:(CPEvent)theEvent
{
[self _updateResizeCursor:theEvent];
}
- (void)mouseExited:(CPEvent)theEvent
{
// FIXME: we should use CPCursor push/pop (if previous currentCursor != arrow).
[[CPCursor arrowCursor] set];
}
- (void)layoutSubviews
{
var tableColumns = [_tableView tableColumns],
count = [tableColumns count];
for (var i = 0; i < count; i++)
{
var column = [tableColumns objectAtIndex:i],
headerView = [column headerView];
var frame = [self headerRectOfColumn:i];
frame.size.height -= 0.5;
if (i > 0)
{
frame.origin.x += 0.5;
frame.size.width -= 1;
}
[headerView setFrame:frame];
if([headerView superview] != self)
[self addSubview:headerView];
}
}
- (void)drawRect:(CGRect)aRect
{
if (!_tableView)
return;
var context = [[CPGraphicsContext currentContext] graphicsPort],
exposedColumnIndexes = [_tableView columnIndexesInRect:aRect],
columnsArray = [],
tableColumns = [_tableView tableColumns],
exposedTableColumns = _tableView._exposedColumns,
firstIndex = [exposedTableColumns firstIndex],
exposedRange = CPMakeRange(firstIndex, [exposedTableColumns lastIndex] - firstIndex + 1);
CGContextSetLineWidth(context, 1);
CGContextSetStrokeColor(context, [_tableView gridColor]);
[exposedColumnIndexes getIndexes:columnsArray maxCount:-1 inIndexRange:exposedRange];
var columnArrayIndex = 0,
columnArrayCount = columnsArray.length,
columnMaxX;
CGContextBeginPath(context);
for(; columnArrayIndex < columnArrayCount; columnArrayIndex++)
{
// grab each column rect and add vertical lines
var columnIndex = columnsArray[columnArrayIndex],
columnToStroke = [self headerRectOfColumn:columnIndex];
columnMaxX = CGRectGetMaxX(columnToStroke);
CGContextMoveToPoint(context, ROUND(columnMaxX) + 0.5, ROUND(CGRectGetMinY(columnToStroke)));
CGContextAddLineToPoint(context, ROUND(columnMaxX) + 0.5, ROUND(CGRectGetMaxY(columnToStroke)));
}
CGContextClosePath(context);
CGContextStrokePath(context);
/*
var maxY = CGRectGetMaxY([self bounds]);
// draw normal gradient for remaining space
if (supportsCanvasGradient)
{
aRect.origin.x = columnMaxX - 0.5;
aRect.size.width -= columnMaxX;
CGContextBeginPath(context);
CGContextAddRect(context, CGRectMake(columnMaxX + 1, 0, CGRectGetMaxX([self bounds]) - columnMaxX, CGRectGetHeight([self bounds])));
CGContextClosePath(context);
CGContextDrawLinearGradient(context, [_CPTableColumnHeaderView headerGradient], CGPointMake(0,0), CGPointMake(0, maxY - 1),0);
}
// Draw bottom line
CGContextBeginPath(context);
CGContextMoveToPoint(context, 0, maxY - 0.5);
CGContextAddLineToPoint(context, CGRectGetMaxX([self bounds]), maxY - 0.5);
CGContextClosePath(context);
CGContextStrokePath(context);
*/
}
@end
var CPTableHeaderViewTableViewKey = @"CPTableHeaderViewTableViewKey";
@implementation CPTableHeaderView (CPCoding)
- (id)initWithCoder:(CPCoder)aCoder
{
if (self = [super initWithCoder:aCoder])
{
_resizedColumn = -1;
_draggedColumn = -1;
_pressedColumn = -1;
_draggedDistance = 0.0;
_lastLocation = nil;
_columnOldWidth = nil;
_tableView = [aCoder decodeObjectForKey:CPTableHeaderViewTableViewKey];
}
return self;
}
- (void)encodeWithCoder:(CPCoder)aCoder
{
[super encodeWithCoder:aCoder];
[aCoder encodeObject:_tableView forKey:CPTableHeaderViewTableViewKey];
}
@end
+3329 -352
View File
File diff suppressed because it is too large Load Diff
+909 -330
View File
File diff suppressed because it is too large Load Diff
+588
View File
@@ -0,0 +1,588 @@
/*
* CPTheme.j
* AppKit
*
* Created by Francisco Tolmasky.
* Copyright 2009, 280 North, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
@import <Foundation/CPObject.j>
@import <Foundation/CPString.j>
@import <Foundation/CPKeyedUnarchiver.j>
var CPThemesByName = { },
CPThemeDefaultTheme = nil;
/*!
@ingroup appkit
*/
@implementation CPTheme : CPObject
{
CPString _name;
CPDictionary _attributes;
}
+ (void)setDefaultTheme:(CPTheme)aTheme
{
CPThemeDefaultTheme = aTheme;
}
+ (CPTheme)defaultTheme
{
return CPThemeDefaultTheme;
}
+ (CPTheme)themeNamed:(CPString)aName
{
return CPThemesByName[aName];
}
- (id)initWithName:(CPString)aName
{
self = [super init];
if (self)
{
_name = aName;
_attributes = [CPDictionary dictionary];
CPThemesByName[_name] = self;
}
return self;
}
- (CPString)name
{
return _name;
}
- (_CPThemeAttribute)_attributeWithName:(CPString)aName forClass:(CPString)aClass
{
var attributes = [_attributes objectForKey:aClass];
if (!attributes)
return nil;
return [attributes objectForKey:aName];
}
- (void)takeThemeFromObject:(id)anObject
{
var attributes = [anObject _themeAttributeDictionary],
attributeName = nil,
attributeNames = [attributes keyEnumerator],
objectThemeClass = [[anObject class] themeClass];
while (attributeName = [attributeNames nextObject])
[self _recordAttribute:[attributes objectForKey:attributeName] forClass:objectThemeClass];
}
- (void)_recordAttribute:(_CPThemeAttribute)anAttribute forClass:(CPString)aClass
{
if (![anAttribute hasValues])
return;
var attributes = [_attributes objectForKey:aClass];
if (!attributes)
{
attributes = [CPDictionary dictionary];
[_attributes setObject:attributes forKey:aClass];
}
var name = [anAttribute name],
existingAttribute = [attributes objectForKey:name];
if (existingAttribute)
[attributes setObject:[existingAttribute attributeMergedWithAttribute:anAttribute] forKey:name];
else
[attributes setObject:anAttribute forKey:name];
}
@end
var CPThemeNameKey = @"CPThemeNameKey",
CPThemeAttributesKey = @"CPThemeAttributesKey";
@implementation CPTheme (CPCoding)
- (id)initWithCoder:(CPCoder)aCoder
{
self = [super init];
if (self)
{
_name = [aCoder decodeObjectForKey:CPThemeNameKey];
_attributes = [aCoder decodeObjectForKey:CPThemeAttributesKey];
CPThemesByName[_name] = self;
}
return self;
}
- (void)encodeWithCoder:(CPCoder)aCoder
{
[aCoder encodeObject:_name forKey:CPThemeNameKey];
[aCoder encodeObject:_attributes forKey:CPThemeAttributesKey];
}
@end
@implementation _CPThemeKeyedUnarchiver : CPKeyedUnarchiver
{
CPBundle _bundle;
}
- (id)initForReadingWithData:(CPData)data bundle:(CPBundle)aBundle
{
self = [super initForReadingWithData:data];
if (self)
_bundle = aBundle;
return self;
}
- (CPBundle)bundle
{
return _bundle;
}
- (BOOL)awakenCustomResources
{
return YES;
}
@end
var CPThemeStates = {},
CPThemeStateNames = {},
CPThemeStateCount = 0;
function CPThemeState(aStateName)
{
var state = CPThemeStates[aStateName];
if (state === undefined)
{
if (aStateName.indexOf('+') === -1)
state = 1 << CPThemeStateCount++;
else
{
var state = 0,
states = aStateName.split('+'),
count = states.length;
while (count--)
{
var stateName = states[count],
individualState = CPThemeStates[stateName];
if (individualState === undefined)
{
individualState = 1 << CPThemeStateCount++;
CPThemeStates[stateName] = individualState;
CPThemeStateNames[individualState] = stateName;
}
state |= individualState;
}
}
CPThemeStates[aStateName] = state;
CPThemeStateNames[state] = aStateName;
}
return state;
}
function CPThemeStateName(aState)
{
var name = CPThemeStateNames[aState];
if (name !== undefined)
return name;
if (!(aState & (aState - 1)))
return "";
var state = 1,
name = "";
for (; state < aState; state <<= 1)
if (aState & state)
name += (name.length === 0 ? '' : '+') + CPThemeStateNames[state];
CPThemeStateNames[aState] = name;
return name;
}
CPThemeStateNames[0] = "normal";
CPThemeStateNormal = CPThemeStates["normal"] = 0;
CPThemeStateDisabled = CPThemeState("disabled");
CPThemeStateHighlighted = CPThemeState("highlighted");
CPThemeStateSelected = CPThemeState("selected");
CPThemeStateBezeled = CPThemeState("bezeled");
CPThemeStateBordered = CPThemeState("bordered");
CPThemeStateEditable = CPThemeState("editable");
CPThemeStateEditing = CPThemeState("editing");
CPThemeStateVertical = CPThemeState("vertical");
CPThemeStateDefault = CPThemeState("default");
CPThemeStateCircular = CPThemeState("circular");
@implementation _CPThemeAttribute : CPObject
{
CPString _name;
id _defaultValue;
CPDictionary _values;
JSObject _cache;
CPThemeAttribute _parentAttribute;
}
- (id)initWithName:(CPString)aName defaultValue:(id)aDefaultValue
{
self = [super init];
if (self)
{
_cache = { };
_name = aName;
_defaultValue = aDefaultValue;
_values = [CPDictionary dictionary];
}
return self;
}
- (CPString)name
{
return _name;
}
- (id)defaultValue
{
return _defaultValue;
}
- (BOOL)hasValues
{
return [_values count] > 0;
}
- (BOOL)isTrivial
{
return ([_values count] === 1) && (Number([_values allKeys][0]) === CPThemeStateNormal);
}
- (void)setValue:(id)aValue
{
_cache = {};
if (aValue === undefined || aValue === nil)
_values = [CPDictionary dictionary];
else
_values = [CPDictionary dictionaryWithObject:aValue forKey:String(CPThemeStateNormal)];
}
- (void)setValue:(id)aValue forState:(CPThemeState)aState
{
_cache = { };
if ((aValue === undefined) || (aValue === nil))
[_values removeObjectForKey:String(aState)];
else
[_values setObject:aValue forKey:String(aState)];
}
- (id)value
{
return [self valueForState:CPThemeStateNormal];
}
- (id)valueForState:(CPThemeState)aState
{
var value = _cache[aState];
// This can be nil.
if (value !== undefined)
return value;
value = [_values objectForKey:String(aState)];
// If we don't have a value, and we have a non-normal state...
if ((value === undefined || value === nil) && aState !== CPThemeStateNormal)
{
// If this is a composite state (not a power of 2), find the closest partial subset match.
if (aState & (aState - 1))
{
var highestOneCount = 0,
states = [_values allKeys],
count = states.length;
while (count--)
{
// states[count] is a string!
var state = Number(states[count]);
// A & B = A iff A < B
if ((state & aState) === state)
{
var oneCount = cachedNumberOfOnes[state];
if (oneCount === undefined)
oneCount = numberOfOnes(state);
if (oneCount > highestOneCount)
{
highestOneCount = oneCount;
value = [_values objectForKey:String(state)];
}
}
}
}
// Still don't have a value? OK, let's use the normal value.
if (value === undefined || value === nil)
value = [_values objectForKey:String(CPThemeStateNormal)];
}
if (value === undefined || value === nil)
value = [_parentAttribute valueForState:aState];
if (value === undefined || value === nil)
value = _defaultValue;
_cache[aState] = value;
return value;
}
- (void)setParentAttribute:(CPThemeAttribute)anAttribute
{
if (_parentAttribute === anAttribute)
return;
_cache = { };
_parentAttribute = anAttribute;
}
- (CPThemeAttribute)attributeMergedWithAttribute:(_CPThemeAttribute)anAttribute
{
var mergedAttribute = [[_CPThemeAttribute alloc] initWithName:_name defaultValue:_defaultValue];
mergedAttribute._values = [_values copy];
[mergedAttribute._values addEntriesFromDictionary:anAttribute._values];
return mergedAttribute;
}
@end
@implementation _CPThemeAttribute (CPCoding)
- (id)initWithCoder:(CPCoder)aCoder
{
self = [super init];
if (self)
{
_cache = {};
_name = [aCoder decodeObjectForKey:@"name"];
_values = [CPDictionary dictionary];
if ([aCoder containsValueForKey:@"value"])
{
var state = CPThemeStateNormal;
if ([aCoder containsValueForKey:@"state"])
state = CPThemeState([aCoder decodeObjectForKey:@"state"]);
[_values setObject:[aCoder decodeObjectForKey:"value"] forKey:state];
}
else
{
var encodedValues = [aCoder decodeObjectForKey:@"values"],
keys = [encodedValues allKeys],
count = keys.length;
while (count--)
{
var key = keys[count];
[_values setObject:[encodedValues objectForKey:key] forKey:CPThemeState(key)];
}
}
}
return self;
}
- (void)encodeWithCoder:(CPCoder)aCoder
{
[aCoder encodeObject:_name forKey:@"name"];
var keys = [_values allKeys],
count = keys.length;
if (count === 1)
{
var onlyKey = keys[0];
if (Number(onlyKey) !== CPThemeStateNormal)
[aCoder encodeObject:CPThemeStateName(Number(onlyKey)) forKey:@"state"];
[aCoder encodeObject:[_values objectForKey:onlyKey] forKey:@"value"];
}
else
{
var encodedValues = [CPDictionary dictionary];
while (count--)
{
var key = keys[count];
[encodedValues setObject:[_values objectForKey:key] forKey:CPThemeStateName(Number(key))];
}
[aCoder encodeObject:encodedValues forKey:@"values"];
}
}
@end
var cachedNumberOfOnes = [ 0 /*000000*/, 1 /*000001*/, 1 /*000010*/, 2 /*000011*/, 1 /*000100*/, 2 /*000101*/, 2 /*000110*/,
3 /*000111*/, 1 /*001000*/, 2 /*001001*/, 2 /*001010*/, 3 /*001011*/, 2 /*001100*/, 3 /*001101*/,
3 /*001110*/, 4 /*001111*/, 1 /*010000*/, 2 /*010001*/, 2 /*010010*/, 3 /*010011*/, 2 /*010100*/,
3 /*010101*/, 3 /*010110*/, 4 /*010111*/, 2 /*011000*/, 3 /*011001*/, 3 /*011010*/, 4 /*011011*/,
3 /*011100*/, 4 /*011101*/, 4 /*011110*/, 5 /*011111*/, 1 /*100000*/, 2 /*100001*/, 2 /*100010*/,
3 /*100011*/, 2 /*100100*/, 3 /*100101*/, 3 /*100110*/, 4 /*100111*/, 2 /*101000*/, 3 /*101001*/,
3 /*101010*/, 4 /*101011*/, 3 /*101100*/, 4 /*101101*/, 4 /*101110*/, 5 /*101111*/, 2 /*110000*/,
3 /*110001*/, 3 /*110010*/, 4 /*110011*/, 3 /*110100*/, 4 /*110101*/, 4 /*110110*/, 5 /*110111*/,
3 /*111000*/, 4 /*111001*/, 4 /*111010*/, 5 /*111011*/, 4 /*111100*/, 5 /*111101*/, 5 /*111110*/,
6 /*111111*/ ];
var numberOfOnes = function(aNumber)
{
var count = 0,
slot = aNumber;
while (aNumber)
{
++count;
aNumber &= (aNumber - 1);
}
cachedNumberOfOnes[slot] = count;
return count;
}
numberOfOnes.displayName = "numberOfOnes";
function CPThemeAttributeEncode(aCoder, aThemeAttribute)
{
var values = aThemeAttribute._values,
count = [values count],
key = "$a" + [aThemeAttribute name];
if (count === 1)
{
var state = [values allKeys][0];
if (Number(state) === 0)
{
[aCoder encodeObject:[values objectForKey:state] forKey:key];
return YES;
}
}
if (count >= 1)
{
[aCoder encodeObject:aThemeAttribute forKey:key];
return YES;
}
return NO;
}
function CPThemeAttributeDecode(aCoder, anAttributeName, aDefaultValue, aTheme, aClass)
{
var key = "$a" + anAttributeName;
if (![aCoder containsValueForKey:key])
var attribute = [[_CPThemeAttribute alloc] initWithName:anAttributeName defaultValue:aDefaultValue];
else
{
var attribute = [aCoder decodeObjectForKey:key];
if (!attribute.isa || ![attribute isKindOfClass:[_CPThemeAttribute class]])
{
var themeAttribute = [[_CPThemeAttribute alloc] initWithName:anAttributeName defaultValue:aDefaultValue];
[themeAttribute setValue:attribute];
attribute = themeAttribute;
}
}
if (aTheme && aClass)
[attribute setParentAttribute:[aTheme _attributeWithName:anAttributeName forClass:aClass]];
return attribute;
}
/* TO AUTO CREATE THESE:
function bit_count(bits)
{
var count = 0;
while (bits)
{
++count;
bits &= (bits - 1);
}
return count ;
}
zeros = "000000000";
function pad(string, digits)
{
return zeros.substr(0, digits - string.length) + string;
}
var str = ""
str += '[';
for (i = 0;i < Math.pow(2,6);++i)
{
str += bit_count(i) + " /*" + pad(i.toString(2),6) + "*" + "/, ";
}
print(str+']');
*/
+79
View File
@@ -0,0 +1,79 @@
/*
* CPThemeBlend.j
* AppKit
*
* Created by Francisco Tolmasky.
* Copyright 2009, 280 North, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
@import <Foundation/CPObject.j>
@import <AppKit/CPTheme.j>
@import <AppKit/_CPCibCustomResource.j>
@import <AppKit/_CPCibKeyedUnarchiver.j>
/*!
@ingroup appkit
*/
@implementation CPThemeBlend : CPObject
{
CPBundle _bundle;
CPArray _themes @accessors(readonly, getter=themes);
id _loadDelegate;
}
- (id)initWithContentsOfURL:(CPURL)aURL
{
self = [super init];
if (self)
{
_bundle = [[CPBundle alloc] initWithPath:aURL];
}
return self;
}
- (void)loadWithDelegate:(id)aDelegate
{
_loadDelegate = aDelegate;
[_bundle loadWithDelegate:self];
}
- (void)bundleDidFinishLoading:(CPBundle)aBundle
{
var themes = [_bundle objectForInfoDictionaryKey:@"CPKeyedThemes"],
count = themes.length;
while (count--)
{
var path = [aBundle pathForResource:themes[count]],
unarchiver = [[_CPThemeKeyedUnarchiver alloc]
initForReadingWithData:[[CPURL URLWithString:path] staticResourceData]
bundle:_bundle];
[unarchiver decodeObjectForKey:@"root"];
[unarchiver finishDecoding];
}
[_loadDelegate blendDidFinishLoading:self];
}
@end
+753 -332
View File
File diff suppressed because it is too large Load Diff
+294 -125
View File
@@ -20,45 +20,30 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
import <Foundation/CPObject.j>
import <Foundation/CPString.j>
@import <Foundation/CPObject.j>
@import <Foundation/CPString.j>
import <AppKit/CPImage.j>
import <AppKit/CPView.j>
@import <AppKit/CPImage.j>
@import <AppKit/CPView.j>
/*
@global
@class CPToolbarItem
*/
CPToolbarItemVisibilityPriorityStandard = 0;
/*
@global
@class CPToolbarItem
*/
CPToolbarItemVisibilityPriorityLow = -1000;
/*
@global
@class CPToolbarItem
*/
CPToolbarItemVisibilityPriorityHigh = 1000;
/*
@global
@class CPToolbarItem
*/
CPToolbarItemVisibilityPriorityUser = 2000;
CPToolbarSeparatorItemIdentifier = @"CPToolbarSeparatorItemIdentifier";
CPToolbarSpaceItemIdentifier = @"CPToolbarSpaceItemIdentifier";
CPToolbarFlexibleSpaceItemIdentifier = @"CPToolbarFlexibleSpaceItemIdentifier";
CPToolbarShowColorsItemIdentifier = @"CPToolbarShowColorsItemIdentifier";
CPToolbarShowFontsItemIdentifier = @"CPToolbarShowFontsItemIdentifier";
CPToolbarCustomizeToolbarItemIdentifier = @"CPToolbarCustomizeToolbarItemIdentifier";
CPToolbarPrintItemIdentifier = @"CPToolbarPrintItemIdentifier";
CPToolbarSeparatorItemIdentifier = @"CPToolbarSeparatorItem";
CPToolbarSpaceItemIdentifier = @"CPToolbarSpaceItem";
CPToolbarFlexibleSpaceItemIdentifier = @"CPToolbarFlexibleSpaceItem";
CPToolbarShowColorsItemIdentifier = @"CPToolbarShowColorsItem";
CPToolbarShowFontsItemIdentifier = @"CPToolbarShowFontsItem";
CPToolbarCustomizeToolbarItemIdentifier = @"CPToolbarCustomizeToolbarItem";
CPToolbarPrintItemIdentifier = @"CPToolbarPrintItem";
var _CPToolbarSeparatorItemView = nil;
/*!
@ingroup appkit
@class CPToolbarItem
/*
A representation of an item in a <objj>CPToolbar</objj>.
A representation of an item in a CPToolbar.
*/
@implementation CPToolbarItem : CPObject
{
@@ -75,15 +60,24 @@ var _CPToolbarSeparatorItemView = nil;
BOOL _isEnabled;
CPImage _image;
CPImage _alternateImage;
CPView _view;
CGSize _minSize;
CGSize _maxSize;
int _visibilityPriority;
BOOL _autovalidates;
}
- (id)init
{
return [self initWithItemIdentifier:@""];
}
// Creating a Toolbar Item
/*
/*!
Initializes the toolbar item with a specified identifier.
@param anItemIdentifier the item's identifier
@return the initialized toolbar item
@@ -96,17 +90,21 @@ var _CPToolbarSeparatorItemView = nil;
{
_itemIdentifier = anItemIdentifier;
_tag = 0;
_isEnabled = YES;
_minSize = CGSizeMakeZero();
_maxSize = CGSizeMakeZero();
_visibilityPriority = CPToolbarItemVisibilityPriorityStandard;
_autovalidates = YES;
}
return self;
}
// Managing Attributes
/*
/*!
Returns the item's identifier.
*/
- (CPString)itemIdentifier
@@ -114,7 +112,7 @@ var _CPToolbarSeparatorItemView = nil;
return _itemIdentifier;
}
/*
/*!
Returns the toolbar of which this item is a part.
*/
- (CPToolbar)toolbar
@@ -122,7 +120,13 @@ var _CPToolbarSeparatorItemView = nil;
return _toolbar;
}
/*
/* @ignore */
- (void)_setToolbar:(CPToolbar)aToolbar
{
_toolbar = aToolbar;
}
/*!
Returns the item's label
*/
- (CPString)label
@@ -130,7 +134,7 @@ var _CPToolbarSeparatorItemView = nil;
return _label;
}
/*
/*!
Sets the item's label.
@param aLabel the new label for the item
*/
@@ -139,7 +143,7 @@ var _CPToolbarSeparatorItemView = nil;
_label = aLabel;
}
/*
/*!
Returns the palette label.
*/
- (CPString)paletteLabel
@@ -147,7 +151,7 @@ var _CPToolbarSeparatorItemView = nil;
return _paletteLabel;
}
/*
/*!
Sets the palette label
@param aPaletteLabel the new palette label
*/
@@ -156,148 +160,188 @@ var _CPToolbarSeparatorItemView = nil;
_paletteLabel = aPaletteLabel;
}
/*
/*!
Returns the item's tooltip. A tooltip pops up
next to the cursor when the user hovers over
the item with the mouse.
*/
- (CPString)toolTip
{
if ([_view respondsToSelector:@selector(toolTip)])
return [_view toolTip];
return _toolTip;
}
/*
/*!
Sets the item's tooltip. A tooltip pops up next to the cursor when the user hovers over the item with the mouse.
@param aToolTip the new item tool tip
*/
- (void)setToolTip:(CPString)aToolTip
{
if ([_view respondsToSelector:@selector(setToolTip:)])
[_view setToolTip:aToolTip];
_toolTip = aToolTip;
}
/*
/*!
Returns the item's tag.
*/
- (int)tag
{
if ([_view respondsToSelector:@selector(tag)])
return [_view tag];
return _tag;
}
/*
/*!
Sets the item's tag.
@param aTag the new tag for the item
*/
- (void)setTag:(int)aTag
{
if ([_view respondsToSelector:@selector(setTag:)])
[_view setTag:aTag];
_tag = aTag;
}
/*
/*!
Returns the item's action target.
*/
- (id)target
{
if (_view)
return [_view respondsToSelector:@selector(target)] ? [_view target] : nil;
return _target;
}
/*
Sets the target of the action that is triggered when the user clicks this item. <code>nil</code> will cause
/*!
Sets the target of the action that is triggered when the user clicks this item. \c nil will cause
the action to be passed on to the first responder.
@param aTarget the new target
*/
- (void)setTarget:(id)aTarget
{
_target = aTarget;
if (!_view)
_target = aTarget;
else if ([_view respondsToSelector:@selector(setTarget:)])
[_view setTarget:aTarget];
}
/*
/*!
Returns the action that is triggered when the user clicks this item.
*/
- (SEL)action
{
if (_view)
return [_view respondsToSelector:@selector(action)] ? [_view action] : nil;
return _action;
}
/*
/*!
Sets the action that is triggered when the user clicks this item.
@param anAction the new action
*/
- (void)setAction:(SEL)anAction
{
_action = anAction;
if (!_view)
_action = anAction;
else if ([_view respondsToSelector:@selector(setAction:)])
[_view setAction:anAction];
}
/*
Returns <code>YES</code> if the item is enabled.
/*!
Returns \c YES if the item is enabled.
*/
- (BOOL)isEnabled
{
if ([_view respondsToSelector:@selector(isEnabled)])
return [_view isEnabled];
return _isEnabled;
}
/*
/*!
Sets whether the item is enabled.
@param aFlag <code>YES</code> enables the item
@param aFlag \c YES enables the item
*/
- (void)setEnabled:(BOOL)aFlag
- (void)setEnabled:(BOOL)shouldBeEnabled
{
_isEnabled = aFlag;
if ([_view respondsToSelector:@selector(setEnabled:)])
[_view setEnabled:shouldBeEnabled];
_isEnabled = shouldBeEnabled;
}
/*
/*!
Returns the item's image
*/
- (CPImage)image
{
if ([_view respondsToSelector:@selector(image)])
return [_view image];
return _image;
}
/*
/*!
Sets the item's image.
@param anImage the new item image
*/
- (void)setImage:(CPImage)anImage
{
if ([_view respondsToSelector:@selector(setImage:)])
[_view setImage:anImage];
_image = anImage;
// FIXME: We can't keep assuming this.
[_view setImage:anImage];
if (!_image)
return;
var imageSize = [_image size];
if (_minSize.width == 0 && _minSize.height == 0 &&
_maxSize.width == 0 && _maxSize.height == 0 &&
(imageSize.width > 0 || imageSize.height > 0))
if (_minSize.width === 0 && _minSize.height === 0 &&
_maxSize.width === 0 && _maxSize.height === 0)
{
[self setMinSize:imageSize];
[self setMaxSize:imageSize];
var imageSize = [_image size];
if (imageSize.width > 0 || imageSize.height > 0)
{
[self setMinSize:imageSize];
[self setMaxSize:imageSize];
}
}
}
/*
/*!
Sets the alternate image. This image is displayed on the item when the user is clicking it.
@param anImage the new alternate image
*/
- (void)setAlternateImage:(CPImage)anImage
{
_alternateImage = anImage;
if ([_view respondsToSelector:@selector(setAlternateImage:)])
[_view setAlternateImage:anImage];
// FIXME: We can't keep assuming this.
[_view setAlternateImage:anImage];
_alternateImage = anImage;
}
/*
/*!
Returns the alternate image. This image is displayed on the item when the user is clicking it.
*/
- (CPImage)alternateImage
{
if ([_view respondsToSelector:@selector(alternateIamge)])
return [_view alternateImage];
return _alternateImage;
}
/*
/*!
Returns the item's view.
*/
- (CPView)view
@@ -305,16 +349,29 @@ var _CPToolbarSeparatorItemView = nil;
return _view;
}
/*
/*!
Sets the item's view
@param aView the item's new view
*/
- (void)setView:(CPView)aView
{
if (_view == aView)
return;
_view = aView;
if (_view)
{
// Tags get forwarded.
if (_tag !== 0 && [_view respondsToSelector:@selector(setTag:)])
[_view setTag:_tag];
_target = nil;
_action = nil;
}
}
/*
/*!
Returns the item's minimum size.
*/
- (CGSize)minSize
@@ -322,19 +379,22 @@ var _CPToolbarSeparatorItemView = nil;
return _minSize;
}
/*
/*!
Sets the item's minimum size.
@param aMinSize the new minimum size
*/
- (void)setMinSize:(CGSize)aMinSize
{
if(!aMinSize.height || !aMinSize.width)
return;
_minSize = CGSizeMakeCopy(aMinSize);
// Try to provide some sanity: Make maxSize >= minSize
_maxSize = CGSizeMake(MAX(_minSize.width, _maxSize.width), MAX(_minSize.height, _maxSize.height));
}
/*
/*!
Returns the item's maximum size.
*/
- (CGSize)maxSize
@@ -342,12 +402,15 @@ var _CPToolbarSeparatorItemView = nil;
return _maxSize;
}
/*
/*!
Sets the item's new maximum size.
@param aMaxSize the new maximum size
*/
- (void)setMaxSize:(CGSize)aMaxSize
{
if(!aMaxSize.height || !aMaxSize.width)
return;
_maxSize = CGSizeMakeCopy(aMaxSize);
// Try to provide some sanity: Make minSize <= maxSize
@@ -355,7 +418,7 @@ var _CPToolbarSeparatorItemView = nil;
}
// Visibility Priority
/*
/*!
Returns the item's visibility priority. The value will be one of:
<pre>
CPToolbarItemVisibilityPriorityStandard
@@ -369,7 +432,7 @@ CPToolbarItemVisibilityPriorityUser
return _visibilityPriority;
}
/*
/*!
Sets the item's visibility priority. The value must be one of:
<pre>
CPToolbarItemVisibilityPriorityStandard
@@ -384,6 +447,128 @@ CPToolbarItemVisibilityPriorityUser
_visibilityPriority = aVisibilityPriority;
}
- (void)validate
{
// View items do not do any target-action analysis.
if (_view)
{
if ([target respondsToSelector:@selector(validateToolbarItem:)])
[self setEnabled:[target validateToolbarItem:self]];
return;
}
var action = [self action];
if (!action)
return [self setEnabled:NO];
var target = [self target];
if (target && ![target respondsToSelector:action])
return [self setEnabled:NO];
target = [CPApp targetForAction:action to:target from:self];
if (!target)
return [self setEnabled:NO];
if ([target respondsToSelector:@selector(validateToolbarItem:)])
[self setEnabled:[target validateToolbarItem:self]];
else
[self setEnabled:YES];
}
- (BOOL)autovalidates
{
return _autovalidates;
}
- (void)setAutovalidates:(BOOL)shouldAutovalidate
{
_autovalidates = !!shouldAutovalidate;
}
@end
var CPToolbarItemItemIdentifierKey = @"CPToolbarItemItemIdentifierKey",
CPToolbarItemLabelKey = @"CPToolbarItemLabelKey",
CPToolbarItemPaletteLabelKey = @"CPToolbarItemPaletteLabelKey",
CPToolbarItemToolTipKey = @"CPToolbarItemToolTipKey",
CPToolbarItemTagKey = @"CPToolbarItemTagKey",
CPToolbarItemTargetKey = @"CPToolbarItemTargetKey",
CPToolbarItemActionKey = @"CPToolbarItemActionKey",
CPToolbarItemEnabledKey = @"CPToolbarItemEnabledKey",
CPToolbarItemImageKey = @"CPToolbarItemImageKey",
CPToolbarItemAlternateImageKey = @"CPToolbarItemAlternateImageKey",
CPToolbarItemViewKey = @"CPToolbarItemViewKey",
CPToolbarItemMinSizeKey = @"CPToolbarItemMinSizeKey",
CPToolbarItemMaxSizeKey = @"CPToolbarItemMaxSizeKey",
CPToolbarItemVisibilityPriorityKey = @"CPToolbarItemVisibilityPriorityKey",
CPToolbarItemAutovalidatesKey = @"CPToolbarItemAutovalidatesKey";
@implementation CPToolbarItem (CPCoding)
- (id)initWithCoder:(CPCoder)aCoder
{
self = [super init];
if (self)
{
_itemIdentifier = [aCoder decodeObjectForKey:CPToolbarItemItemIdentifierKey];
_minSize = [aCoder decodeSizeForKey:CPToolbarItemMinSizeKey];
_maxSize = [aCoder decodeSizeForKey:CPToolbarItemMaxSizeKey];
[self setLabel:[aCoder decodeObjectForKey:CPToolbarItemLabelKey]];
[self setPaletteLabel:[aCoder decodeObjectForKey:CPToolbarItemPaletteLabelKey]];
[self setToolTip:[aCoder decodeObjectForKey:CPToolbarItemToolTipKey]];
[self setTag:[aCoder decodeObjectForKey:CPToolbarItemTagKey]];
[self setTarget:[aCoder decodeObjectForKey:CPToolbarItemTargetKey]];
[self setAction:CPSelectorFromString([aCoder decodeObjectForKey:CPToolbarItemActionKey])];
[self setEnabled:[aCoder decodeBoolForKey:CPToolbarItemEnabledKey]];
[self setImage:[aCoder decodeObjectForKey:CPToolbarItemImageKey]];
[self setAlternateImage:[aCoder decodeObjectForKey:CPToolbarItemAlternateImageKey]];
[self setView:[aCoder decodeObjectForKey:CPToolbarItemViewKey]];
[self setVisibilityPriority:[aCoder decodeIntForKey:CPToolbarItemVisibilityPriorityKey]];
[self setAutovalidates:[aCoder decodeBoolForKey:CPToolbarItemAutovalidatesKey]];
}
return self;
}
- (void)encodeWithCoder:(CPCoder)aCoder
{
[aCoder encodeObject:_itemIdentifier forKey:CPToolbarItemItemIdentifierKey];
[aCoder encodeObject:[self label] forKey:CPToolbarItemLabelKey];
[aCoder encodeObject:[self paletteLabel] forKey:CPToolbarItemPaletteLabelKey];
[aCoder encodeObject:[self toolTip] forKey:CPToolbarItemToolTipKey];
[aCoder encodeObject:[self tag] forKey:CPToolbarItemTagKey];
[aCoder encodeObject:[self target] forKey:CPToolbarItemTargetKey];
[aCoder encodeObject:[self action] forKey:CPToolbarItemActionKey];
[aCoder encodeObject:[self isEnabled] forKey:CPToolbarItemEnabledKey];
[aCoder encodeObject:[self image] forKey:CPToolbarItemImageKey];
[aCoder encodeObject:[self alternateImage] forKey:CPToolbarItemAlternateImageKey];
[aCoder encodeObject:[self view] forKey:CPToolbarItemViewKey];
[aCoder encodeSize:[self minSize] forKey:CPToolbarItemMinSizeKey];
[aCoder encodeSize:[self maxSize] forKey:CPToolbarItemMaxSizeKey];
[aCoder encodeObject:[self visibilityPriority] forKey:CPToolbarItemVisibilityPriorityKey];
[aCoder encodeBool:[self autovalidates] forKey:CPToolbarItemAutovalidatesKey];
}
@end
@implementation CPToolbarItem (CPCopying)
@@ -391,27 +576,31 @@ CPToolbarItemVisibilityPriorityUser
- (id)copy
{
var copy = [[[self class] alloc] initWithItemIdentifier:_itemIdentifier];
[copy setLabel:_label];
[copy setPaletteLabel:_paletteLabel];
[copy setToolTip:_toolTip];
[copy setTag:_tag];
[copy setTarget:_target];
[copy setAction:_action];
[copy setEnabled:_isEnabled];
[copy setImage:_image];
[copy setAlternateImage:_alternateImage];
if (_view)
[copy setView:[CPKeyedUnarchiver unarchiveObjectWithData:[CPKeyedArchiver archivedDataWithRootObject:_view]]];
[copy _setToolbar:_toolbar];
[copy setLabel:_label];
[copy setPaletteLabel:_paletteLabel];
[copy setToolTip:[self toolTip]];
[copy setTag:[self tag]];
[copy setTarget:[self target]];
[copy setAction:[self action]];
[copy setEnabled:[self isEnabled]];
[copy setImage:[self image]];
[copy setAlternateImage:[self alternateImage]];
[copy setMinSize:_minSize];
[copy setMaxSize:_maxSize];
[copy setVisibilityPriority:_visibilityPriority];
[copy setVisibilityPriority:[self visibilityPriority]];
[copy setAutovalidates:[self autovalidates]];
return copy;
}
@@ -424,38 +613,12 @@ CPToolbarItemVisibilityPriorityUser
/* @ignore */
+ (CPToolbarItem)_standardItemWithItemIdentifier:(CPString)anItemIdentifier
{
var item = [[CPToolbarItem alloc] initWithItemIdentifier:anItemIdentifier];
switch (anItemIdentifier)
{
case CPToolbarSeparatorItemIdentifier: [item setMinSize:CGSizeMake(2.0, 0.0)];
[item setMaxSize:CGSizeMake(2.0, 100000.0)];
if (!_CPToolbarSeparatorItemView)
{
_CPToolbarSeparatorItemView = [[CPView alloc] initWithFrame:CGRectMake(0.0, 0.0, 2.0, 32.0)];
sizes = {};
sizes[@"CPToolbarItemSeparator"] = [CGSizeMake(2.0, 26.0), CGSizeMake(2.0, 1.0), CGSizeMake(2.0, 26.0)];
[_CPToolbarSeparatorItemView setBackgroundColor:_CPControlThreePartImagePattern(YES, sizes, @"CPToolbarItem", @"Separator")];
}
[item setView:_CPToolbarSeparatorItemView];
return item;
case CPToolbarSpaceItemIdentifier: [item setMinSize:CGSizeMake(32.0, 32.0)];
[item setMaxSize:CGSizeMake(32.0, 32.0)];
return item;
case CPToolbarFlexibleSpaceItemIdentifier: [item setMinSize:CGSizeMake(32.0, 32.0)];
[item setMaxSize:CGSizeMake(10000.0, 32.0)];
return item;
case CPToolbarShowColorsItemIdentifier: return nil;
case CPToolbarSeparatorItemIdentifier: return [_CPToolbarSeparatorItem new];
case CPToolbarSpaceItemIdentifier: return [_CPToolbarSpaceItem new];
case CPToolbarFlexibleSpaceItemIdentifier: return [_CPToolbarFlexibleSpaceItem new];
case CPToolbarShowColorsItemIdentifier: return [_CPToolbarShowColorsItem new];
case CPToolbarShowFontsItemIdentifier: return nil;
case CPToolbarCustomizeToolbarItemIdentifier: return nil;
case CPToolbarPrintItemIdentifier: return nil;
@@ -465,3 +628,9 @@ CPToolbarItemVisibilityPriorityUser
}
@end
@import "_CPToolbarFlexibleSpaceItem.j"
@import "_CPToolbarShowColorsItem.j"
@import "_CPToolbarSeparatorItem.j"
@import "_CPToolbarSpaceItem.j"
+119
View File
@@ -0,0 +1,119 @@
@import <Foundation/CPObject.j>
@implementation CPTreeNode : CPObject
{
id _representedObject @accessors(readonly, property=representedObject);
CPTreeNode _parentNode @accessors(readonly, property=parentNode);
CPMutableArray _childNodes;
}
+ (id)treeNodeWithRepresentedObject:(id)anObject
{
return [[self alloc] initWithRepresentedObject:anObject];
}
- (id)initWithRepresentedObject:(id)anObject
{
self = [super init];
if (self)
{
_representedObject = anObject;
_childNodes = [];
}
return self;
}
- (BOOL)isLeaf
{
return [_childNodes count] <= 0;
}
- (CPArray)childNodes
{
return [_childNodes copy];
}
- (CPMutableArray)mutableChildNodes
{
return [self mutableArrayValueForKey:@"childNodes"];
}
- (void)insertObject:(id)aTreeNode inChildNodesAtIndex:(CPInteger)anIndex
{
[[aTreeNode._parentNode mutableChildNodes] removeObjectIdenticalTo:aTreeNode];
aTreeNode._parentNode = self;
[_childNodes insertObject:aTreeNode atIndex:anIndex];
}
- (void)removeObjectFromChildNodesAtIndex:(CPInteger)anIndex
{
[_childNodes objectAtIndex:anIndex]._parentNode = nil;
[_childNodes removeObjectAtIndex:anIndex];
}
- (void)replaceObjectFromChildNodesAtIndex:(CPInteger)anIndex withObject:(id)aTreeNode
{
var oldTreeNode = [_childNodes objectAtIndex:anIndex];
oldTreeNode._parentNode = nil;
aTreeNode._parentNode = self;
[_childNodes replaceObjectAtIndex:anIndex withObject:aTreeNode];
}
- (id)objectInChildNodesAtIndex:(CPInteger)anIndex
{
return _childNodes[anIndex];
}
- (void)sortWithSortDescriptors:(CPArray)sortDescriptors recursively:(BOOL)shouldSortRecursively
{
[_childNodes sortUsingDescriptors:sortDescriptors];
if (!shouldSortRecursively)
return;
var count = [_childNodes count];
while (count--)
[_childNodes[count] sortWithSortDescriptors:sortDescriptors recursively:YES];
}
@end
var CPTreeNodeRepresentedObjectKey = @"CPTreeNodeRepresentedObjectKey",
CPTreeNodeParentNodeKey = @"CPTreeNodeParentNodeKey",
CPTreeNodeChildNodesKey = @"CPTreeNodeChildNodesKey";
@implementation CPTreeNode (CPCoding)
- (id)initWithCoder:(CPCoder)aCoder
{
self = [super init];
if (self)
{
_representedObject = [aCoder decodeObjectForKey:CPTreeNodeRepresentedObjectKey];
_parentNode = [aCoder decodeObjectForKey:CPTreeNodeParentNodeKey];
_childNodes = [aCoder decodeObjectForKey:CPTreeNodeChildNodesKey];
}
return self;
}
- (void)encodeWithCoder:(CPCoder)aCoder
{
[aCoder encodeObject:_representedObject forKey:CPTreeNodeRepresentedObjectKey];
[aCoder encodeConditionalObject:_parentNode forKey:CPTreeNodeParentNodeKey];
[aCoder encodeObject:_childNodes forKey:CPTreeNodeChildNodesKey];
}
@end
+1062 -319
View File
File diff suppressed because it is too large Load Diff
+179
View File
@@ -0,0 +1,179 @@
/*
* CPFlashView.j
* AppKit
*
* Created by Klaas Pieter Annema on September 3, 2009.
* Copyright 2009, Sofa BV
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
@import <AppKit/CPAnimation.j>
CPViewAnimationTargetKey = @"CPViewAnimationTarget";
CPViewAnimationStartFrameKey = @"CPViewAnimationStartFrame";
CPViewAnimationEndFrameKey = @"CPViewAnimationEndFrame";
CPViewAnimationEffectKey = @"CPViewAnimationEffect";
CPViewAnimationFadeInEffect = @"CPViewAnimationFadeIn";
CPViewAnimationFadeOutEffect = @"CPViewAnimationFadeOut";
@implementation CPViewAnimation : CPAnimation
{
CPArray _viewAnimations;
}
- (id)initWithViewAnimations:(CPArray)viewAnimations
{
if (self = [super initWithDuration:0.5 animationCurve:CPAnimationLinear])
{
[self setViewAnimations:viewAnimations];
}
return self;
}
- (void)startAnimation
{
var animationIndex = [_viewAnimations count];
while (animationIndex--)
{
var dictionary = [_viewAnimations objectAtIndex:animationIndex],
view = [self _targetView:dictionary],
startFrame = [self _startFrame:dictionary];
[view setFrame:startFrame];
var effect = [self _effect:dictionary];
if (effect === CPViewAnimationFadeInEffect)
{
[view setAlphaValue:0.0];
[view setHidden:NO];
}
else if (effect === CPViewAnimationFadeOutEffect)
[view setAlphaValue:1.0];
}
[super startAnimation];
}
- (void)setCurrentProgress:(NSAnimationProgress)progress
{
[super setCurrentProgress:progress];
var animationIndex = [_viewAnimations count];
while (animationIndex--)
{
var dictionary = [_viewAnimations objectAtIndex:animationIndex],
view = [self _targetView:dictionary]
startFrame = [self _startFrame:dictionary]
endFrame = [self _endFrame:dictionary]
differenceFrame = CPRectMakeZero();
differenceFrame.origin.x = endFrame.origin.x - startFrame.origin.x;
differenceFrame.origin.y = endFrame.origin.y - startFrame.origin.y;
differenceFrame.size.width = endFrame.size.width - startFrame.size.width;
differenceFrame.size.height = endFrame.size.height - startFrame.size.height;
var intermediateFrame = CPRectMakeZero();
intermediateFrame.origin.x = startFrame.origin.x + differenceFrame.origin.x * progress;
intermediateFrame.origin.y = startFrame.origin.y + differenceFrame.origin.y * progress;
intermediateFrame.size.width = startFrame.size.width + differenceFrame.size.width * progress;
intermediateFrame.size.height = startFrame.size.height + differenceFrame.size.height * progress;
[view setFrame:intermediateFrame];
// Update the view's alpha value
var effect = [self _effect:dictionary];
if (effect === CPViewAnimationFadeInEffect)
[view setAlphaValue:1.0 * progress];
else if (effect === CPViewAnimationFadeOutEffect)
[view setAlphaValue:1.0 + ( 0.0 - 1.0 ) * progress];
if (progress === 1.0)
[view setHidden:CPRectIsNull(endFrame) || [view alphaValue] === 0.0];
}
}
- (void)stopAnimation
{
var animationIndex = [_viewAnimations count];
while (animationIndex--)
{
var dictionary = [_viewAnimations objectAtIndex:animationIndex],
view = [self _targetView:dictionary],
endFrame = [self _endFrame:dictionary];
[view setFrame:endFrame];
var effect = [self _effect:dictionary];
if (effect === CPViewAnimationFadeInEffect)
[view setAlphaValue:1.0];
else if (effect === CPViewAnimationFadeOutEffect)
[view setAlphaValue:0.0];
[view setHidden:CPRectIsNull(endFrame) || [view alphaValue] === 0.0];
}
[super stopAnimation];
}
- (id)_targetView:(CPDictionary)dictionary
{
var targetView = [dictionary valueForKey:CPViewAnimationTargetKey];
if (!targetView)
[CPException raise:CPInternalInconsistencyException reason:[CPString stringWithFormat:@"view animation: %@ does not have a target view", [dictionary description]]];
return targetView;
}
- (CPRect)_startFrame:(CPDictionary)dictionary
{
var startFrame = [dictionary valueForKey:CPViewAnimationStartFrameKey];
if (!startFrame)
return [[self _targetView:dictionary] frame];
return startFrame;
}
- (CPRect)_endFrame:(CPDictionary)dictionary
{
var endFrame = [dictionary valueForKey:CPViewAnimationEndFrameKey];
if (!endFrame)
return [[self _targetView:dictionary] frame];
return endFrame;
}
- (CPString)_effect:(CPDictionary)dictionary
{
return [dictionary valueForKey:CPViewAnimationEffectKey];
}
- (CPArray)viewAnimations
{
return _viewAnimations;
}
- (void)setViewAnimations:(CPArray)viewAnimations
{
if (viewAnimations != _viewAnimations)
{
[self stopAnimation];
_viewAnimations = [viewAnimations copy];
}
}
@end
+243
View File
@@ -0,0 +1,243 @@
/*
* CPViewController.j
* AppKit
*
* Created by Nicholas Small and Francisco Tolmasky.
* Copyright 2009, 280 North, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
@import <AppKit/CPResponder.j>
var CPViewControllerCachedCibs;
/*! @class CPViewController
The CPViewController class provides the fundamental view-management controller for Cappuccino applications.
The basic view controller class supports the presentation of an associated view in addition to basic support
for managing modal views and, in the future, animations. Subclasses such as CPNavigationController and
CPTabBarController provide additional behavior for managing complex hierarchies of view controllers and views.
You use each instance of CPViewController to manage a single view (and hierarchy). For a simple view controller,
this entails managing the view hierarchy responsible for presenting your application content.
A typical view hierarchy consists of a root viewŃa reference to which is available in the view property of this classŃ
and one or more subviews presenting the actual content. In the case of navigation and tab bar controllers, the view
controller manages not only the high-level view hierarchy (which provides the navigation controls) but also one
or more additional view controllers that handle the presentation of the application content.
Unlike UIViewController in Cocoa Touch, a CPViewController does not represent an entire screen of content. You
will add your root view to an existing view or window's content view. You can manage many view controllers
on screen at once. CPViewController is also the preferred way of working with Cibs.
Subclasses can override -loadView to create their custom view hierarchy, or specify a cib name to be loaded automatically.
It has methods that are called when a view appears or disappears.
This class is also a good place for delegate & datasource methods, and other controller stuff.
*/
@implementation CPViewController : CPResponder
{
CPView _view;
id _representedObject @accessors(property=representedObject);
CPString _title @accessors(property=title);
CPString _cibName @accessors(property=cibName, readonly);
CPBundle _cibBundle @accessors(property=cibBundle, readonly);
CPDictionary _cibExternalNameTable @accessors(property=cibExternalNameTable, readonly);
}
+ (void)initialize
{
if (self === CPViewController)
CPViewControllerCachedCibs = [CPDictionary dictionary];
}
/*!
Convenience initializer calls -initWithCibName:bundle: with nil for both parameters.
*/
- (id)init
{
return [self initWithCibName:nil bundle:nil];
}
- (id)initWithCibName:(CPString)aCibNameOrNil bundle:(CPBundle)aCibBundleOrNil
{
return [self initWithCibName:aCibNameOrNil bundle:aCibBundleOrNil externalNameTable:nil];
}
- (id)initWithCibName:(CPString)aCibNameOrNil bundle:(CPBundle)aCibBundleOrNil owner:(id)anOwner
{
return [self initWithCibName:aCibNameOrNil bundle:aCibBundleOrNil externalNameTable:[CPDictionary dictionaryWithObject:anOwner forKey:CPCibOwner]];
}
/*!
The designated initializer. If you subclass CPViewController, you must call the super implementation of this method, even if you aren't using a Cib.
In the specified Cib, the File's Owner proxy should have its class set to your view controller subclass, with the view outlet connected to the main view.
If you pass in a nil Cib name, then you must either call -setView: before -view is invoked, or override -loadView to set up your views.
@param cibNameOrNil The path to the cib to load for the root view or nil to programmatically create views.
@param cibBundleOrNil The bundle that the cib is located in or nil for the main bundle.
*/
- (id)initWithCibName:(CPString)aCibNameOrNil bundle:(CPBundle)aCibBundleOrNil externalNameTable:(CPDictionary)anExternalNameTable
{
self = [super init];
if (self)
{
// Don't load the cib until someone actually requests the view. The user may just be intending to use setView:.
_cibName = aCibNameOrNil;
_cibBundle = aCibBundleOrNil || [CPBundle mainBundle];
_cibExternalNameTable = anExternalNameTable || [CPDictionary dictionaryWithObject:self forKey:CPCibOwner];
}
return self;
}
/*!
Programmatically creates the view that the controller manages.
You should never call this method directly. The view controller calls this method when the view property is requested but is nil.
If you create your views manually, you must override this method and use it to create your view and assign it to the view property.
The default implementation for programmatic views is to create a plain view. You can invoke super to utilize this view.
If you use Interface Builder to create your views and initialize the view controllerŃthat is, you initialize the view using the
initWithCibName:bundle: methodŃthen you must not override this method. The consequences risk shattering the space-time continuum.
Note: The cib loading system is currently asynchronous.
*/
- (void)loadView
{
if (_view)
return;
// check if a cib is already cached for the current _cibName
var cib = [CPViewControllerCachedCibs objectForKey:_cibName];
if (!cib)
{
// if the cib isn't cached yet : fetch it and cache it
cib = [[CPCib alloc] initWithContentsOfURL:[_cibBundle pathForResource:_cibName + @".cib"]];
[CPViewControllerCachedCibs setObject:cib forKey:_cibName];
}
[cib instantiateCibWithExternalNameTable:_cibExternalNameTable];
}
/*!
Returns the view that the controller manages.
If this property is nil, the controller sends loadView to itself to create the view that it manages.
Subclasses should override the loadView method to create any custom views. The default value is nil.
*/
- (CPView)view
{
if (!_view)
{
var cibOwner = [_cibExternalNameTable objectForKey:CPCibOwner];
if ([cibOwner respondsToSelector:@selector(viewControllerWillLoadCib:)])
[cibOwner viewControllerWillLoadCib:self];
[self loadView];
if (_view === nil && [cibOwner isKindOfClass:[CPDocument class]])
[self setView:[cibOwner valueForKey:@"view"]];
if (!_view)
{
var reason = [CPString stringWithFormat:@"View for %@ could not be loaded from Cib or no view specified. Override loadView to load the view manually.", self];
[CPException raise:CPInternalInconsistencyException reason:reason];
}
if ([cibOwner respondsToSelector:@selector(viewControllerDidLoadCib:)])
[cibOwner viewControllerDidLoadCib:self];
[self viewDidLoad];
}
return _view;
}
/*!
This method is called after the view controller has loaded its associated views into memory.
This method is called regardless of whether the views were stored in a nib file or created programmatically in the loadView method.
This method is most commonly used to perform additional initialization steps on views that are loaded from nib files.
*/
- (void)viewDidLoad
{
}
/*!
Manually sets the view that the controller manages.
Setting to nil will cause -loadView to be called on all subsequent calls of -view.
@param aView The view this controller should represent.
*/
- (void)setView:(CPView)aView
{
_view = aView;
}
@end
var CPViewControllerViewKey = @"CPViewControllerViewKey",
CPViewControllerTitleKey = @"CPViewControllerTitleKey",
CPViewControllerCibNameKey = @"CPViewControllerCibNameKey",
CPViewControllerBundleKey = @"CPViewControllerBundleKey";
@implementation CPViewController (CPCoding)
/*!
Initializes the view controller by unarchiving data from a coder.
@param aCoder the coder from which the data will be unarchived
@return the initialized view controller
*/
- (id)initWithCoder:(CPCoder)aCoder
{
self = [super initWithCoder:aCoder];
if (self)
{
_view = [aCoder decodeObjectForKey:CPViewControllerViewKey];
_title = [aCoder decodeObjectForKey:CPViewControllerTitleKey];
_cibName = [aCoder decodeObjectForKey:CPViewControllerCibNameKey];
var bundlePath = [aCoder decodeObjectForKey:CPViewControllerBundleKey];
_cibBundle = bundlePath ? [CPBundle bundleWithPath:bundlePath] : [CPBundle mainBundle];
_cibExternalNameTable = [CPDictionary dictionaryWithObject:self forKey:CPCibOwner];
}
return self;
}
/*!
Archives the view controller to the provided coder.
@param aCoder the coder to which the view controller should be archived
*/
- (void)encodeWithCoder:(CPCoder)aCoder
{
[super encodeWithCoder:aCoder];
[aCoder encodeObject:_view forKey:CPViewControllerViewKey];
[aCoder encodeObject:_title forKey:CPViewControllerTitleKey];
[aCoder encodeObject:_cibName forKey:CPViewControllerCibNameKey];
[aCoder encodeObject:[_cibBundle bundlePath] forKey:CPViewControllerBundleKey];
}
@end
+329 -87
View File
@@ -20,7 +20,10 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
import "CPView.j"
@import <AppKit/CPView.j>
#include "Platform/Platform.h"
// FIXME: implement these where possible:
/*
@@ -34,16 +37,27 @@ CPWebViewProgressEstimateChangedNotification = "CPWebViewProgressEstimateChan
CPWebViewProgressStartedNotification = "CPWebViewProgressStartedNotification";
CPWebViewProgressFinishedNotification = "CPWebViewProgressFinishedNotification";
CPWebViewScrollAppKit = 1;
CPWebViewScrollNative = 2;
// FIXME: somehow make CPWebView work with CPScrollView instead of native scrollbars (is this even possible?)
/*!
@ingroup appkit
*/
@implementation CPWebView : CPView
{
CPScrollView _scrollView;
CPView _frameView;
IFrame _iframe;
CPString _mainFrameURL;
CPArray _backwardStack;
CPArray _forwardStack;
BOOL _ignoreLoadEvent;
BOOL _ignoreLoadStart;
BOOL _ignoreLoadEnd;
id _downloadDelegate;
id _frameLoadDelegate;
@@ -52,6 +66,14 @@ CPWebViewProgressFinishedNotification = "CPWebViewProgressFinishedNoti
id _UIDelegate;
CPWebScriptObject _wso;
CPString _url;
CPString _html;
Function _loadCallback;
int _scrollMode;
CGSize _scrollSize;
}
- (id)initWithFrame:(CPRect)frameRect frameName:(CPString)frameName groupName:(CPString)groupName
@@ -67,69 +89,219 @@ CPWebViewProgressFinishedNotification = "CPWebViewProgressFinishedNoti
{
if (self = [super initWithFrame:aFrame])
{
_mainFrameURL = nil;
_backwardStack = [];
_forwardStack = [];
_ignoreLoadEvent = NO;
_mainFrameURL = nil;
_backwardStack = [];
_forwardStack = [];
_scrollMode = CPWebViewScrollNative;
_iframe = document.createElement("iframe");
_iframe.name = "iframe_" + Math.floor(Math.random()*10000);
_iframe.style.width = "100%";
_iframe.style.height = "100%";
_iframe.style.borderWidth = "0px";
var loadCallback = function() {
// HACK: this block handles the case where we don't know about loads initiated by the user clicking a link
if (!_ignoreLoadEvent)
{
// post the start load notification
[self _startedLoading];
if (_mainFrameURL)
[_backwardStack addObject:_mainFrameURL];
// FIXME: this doesn't actually get the right URL for different domains. Probably not be possible due to browser security restrictions.
_mainFrameURL = _iframe.src;
[_forwardStack removeAllObjects];
}
_ignoreLoadEvent = NO;
[self _finishedLoading]
}
if (_iframe.addEventListener)
_iframe.addEventListener("load", loadCallback, false);
else if (_iframe.attachEvent)
_iframe.attachEvent("onload", loadCallback);
_DOMElement.appendChild(_iframe);
[self _initDOMWithFrame:aFrame];
}
return self;
}
- (BOOL)drawsBackground
- (id)_initDOMWithFrame:(CPRect)aFrame
{
return _iframe.style.backgroundColor != "";
_ignoreLoadStart = YES;
_ignoreLoadEnd = YES;
_iframe = document.createElement("iframe");
_iframe.name = "iframe_" + Math.floor(Math.random()*10000);
_iframe.style.width = "100%";
_iframe.style.height = "100%";
_iframe.style.borderWidth = "0px";
[self setDrawsBackground:YES];
_loadCallback = function() {
// HACK: this block handles the case where we don't know about loads initiated by the user clicking a link
if (!_ignoreLoadStart)
{
// post the start load notification
[self _startedLoading];
if (_mainFrameURL)
[_backwardStack addObject:_mainFrameURL];
// FIXME: this doesn't actually get the right URL for different domains. Not possible due to browser security restrictions.
_mainFrameURL = _iframe.src;
_mainFrameURL = _iframe.src;
// clear the forward
[_forwardStack removeAllObjects];
}
else
_ignoreLoadStart = NO;
if (!_ignoreLoadEnd)
{
[self _finishedLoading];
}
else
_ignoreLoadEnd = NO;
[[CPRunLoop currentRunLoop] limitDateForMode:CPDefaultRunLoopMode];
}
if (_iframe.addEventListener)
_iframe.addEventListener("load", _loadCallback, false);
else if (_iframe.attachEvent)
_iframe.attachEvent("onload", _loadCallback);
_frameView = [[CPView alloc] initWithFrame:[self bounds]];
[_frameView setAutoresizingMask:CPViewWidthSizable|CPViewHeightSizable];
_scrollView = [[CPScrollView alloc] initWithFrame:[self bounds]];
[_scrollView setAutohidesScrollers:YES];
[_scrollView setAutoresizingMask:CPViewWidthSizable|CPViewHeightSizable];
[_scrollView setDocumentView:_frameView];
_frameView._DOMElement.appendChild(_iframe);
[self _setScrollMode:_scrollMode];
[self addSubview:_scrollView];
}
- (void)setDrawsBackground:(BOOL)drawsBackround
{
_iframe.style.backgroundColor = drawsBackround ? "white" : "";
- (void)setFrameSize:(CPSize)aSize
{
[super setFrameSize:aSize];
[self _resizeWebFrame];
}
- (CPString)mainFrameURL
- (BOOL)_resizeWebFrame
{
return _mainFrameURL;
if (_scrollMode === CPWebViewScrollAppKit)
{
if (_scrollSize)
{
[_frameView setFrameSize:_scrollSize];
}
else
{
[_frameView setFrameSize:[_scrollView contentSize]];
// try to get the document size so we can correctly set the frame
var win = null;
try { win = [self DOMWindow]; } catch (e) {}
if (win && win.document)
{
var width = win.document.body.scrollWidth,
height = win.document.body.scrollHeight;
_iframe.setAttribute("width", width);
_iframe.setAttribute("height", height);
[_frameView setFrameSize:CGSizeMake(width, height)];
}
else
{
CPLog.warn("using default size 800*1600");
[_frameView setFrameSize:CGSizeMake(800, 1600)];
}
}
}
}
- (void)setScrollMode:(int)aScrollMode
{
if (_scrollMode == aScrollMode)
return;
[self _setScrollMode:aScrollMode];
}
- (void)_setScrollMode:(int)aScrollMode
{
_scrollMode = aScrollMode;
_ignoreLoadStart = YES;
_ignoreLoadEnd = YES;
var parent = _iframe.parentNode;
parent.removeChild(_iframe);
if (_scrollMode === CPWebViewScrollAppKit)
{
[_scrollView setHasHorizontalScroller:YES];
[_scrollView setHasVerticalScroller:YES];
_iframe.setAttribute("scrolling", "no");
}
else
{
[_scrollView setHasHorizontalScroller:NO];
[_scrollView setHasVerticalScroller:NO];
_iframe.setAttribute("scrolling", "auto");
[_frameView setFrameSize:[_scrollView bounds].size];
}
parent.appendChild(_iframe);
}
- (void)loadHTMLString:(CPString)aString
{
[self loadHTMLString:aString baseURL:nil];
}
- (void)loadHTMLString:(CPString)aString baseURL:(CPURL)URL
{
// FIXME: do something with baseURL?
[self _setScrollMode:CPWebViewScrollAppKit];
[self _startedLoading];
_ignoreLoadStart = YES;
_ignoreLoadEnd = NO;
_url = null;
_html = aString;
[self _load];
}
- (void)_loadMainFrameURL
{
[self _setScrollMode:CPWebViewScrollNative];
[self _startedLoading];
_ignoreLoadEvent = YES;
_iframe.src = _mainFrameURL;
_ignoreLoadStart = YES;
_ignoreLoadEnd = NO;
_url = _mainFrameURL;
_html = null;
[self _load];
}
- (void)_load
{
if (_url)
{
_iframe.src = _url;
}
else if (_html)
{
// clear the iframe
_iframe.src = "";
// need to give the browser a chance to reset iframe, otherwise we'll be document.write()-ing the previous document
window.setTimeout(function() {
var win = [self DOMWindow];
win.document.write(_html);
window.setTimeout(_loadCallback, 1);
}, 0);
}
}
- (void)_startedLoading
@@ -142,25 +314,27 @@ CPWebViewProgressFinishedNotification = "CPWebViewProgressFinishedNoti
- (void)_finishedLoading
{
[self _resizeWebFrame];
[[CPNotificationCenter defaultCenter] postNotificationName:CPWebViewProgressFinishedNotification object:self];
if ([_frameLoadDelegate respondsToSelector:@selector(webView:didFinishLoadForFrame:)])
[_frameLoadDelegate webView:self didFinishLoadForFrame:nil]; // FIXME: give this a frame somehow?
}
- (CPString)mainFrameURL
{
return _mainFrameURL;
}
- (void)setMainFrameURL:(CPString)URLString
{
if (_mainFrameURL)
[_backwardStack addObject:_mainFrameURL];
_mainFrameURL = URLString;
[_forwardStack removeAllObjects];
[self _loadMainFrameURL];
}
- (IBAction)takeStringURLFrom:(id)sender
{
[self setMainFrameURL:[sender stringValue]];
[self _loadMainFrameURL];
}
- (BOOL)goBack
@@ -195,16 +369,6 @@ CPWebViewProgressFinishedNotification = "CPWebViewProgressFinishedNoti
return NO;
}
- (IBAction)goBack:(id)sender
{
[self goBack];
}
- (IBAction)goForward:(id)sender
{
[self goForward];
}
- (BOOL)canGoBack
{
return (_backwardStack.length > 0);
@@ -223,17 +387,17 @@ CPWebViewProgressFinishedNotification = "CPWebViewProgressFinishedNoti
- (void)close
{
_DOMElement.removeChild(_iframe);
_iframe.parentNode.removeChild(_iframe);
}
- (Window)window
- (DOMWindow)DOMWindow
{
return (_iframe.contentDocument && _iframe.contentDocument.defaultView) || _iframe.contentWindow;
}
- (CPWebScriptObject)windowScriptObject
{
var win = [self window];
var win = [self DOMWindow];
if (!_wso || win != [_wso window])
{
if (win)
@@ -266,6 +430,60 @@ CPWebViewProgressFinishedNotification = "CPWebViewProgressFinishedNoti
return nil;
}
- (BOOL)drawsBackground
{
return _iframe.style.backgroundColor != "";
}
- (void)setDrawsBackground:(BOOL)drawsBackround
{
_iframe.style.backgroundColor = drawsBackround ? "white" : "";
}
// IBActions
- (IBAction)takeStringURLFrom:(id)sender
{
[self setMainFrameURL:[sender stringValue]];
}
- (IBAction)goBack:(id)sender
{
[self goBack];
}
- (IBAction)goForward:(id)sender
{
[self goForward];
}
- (IBAction)stopLoading:(id)sender
{
// FIXME: what to do?
}
- (IBAction)reload:(id)sender
{
[self _loadMainFrameURL];
}
- (IBAction)print:(id)sender
{
try
{
[self DOMWindow].print();
}
catch (e)
{
alert('Please click the webpage and select "Print" from the "File" menu');
}
}
// Delegates:
// FIXME: implement more delegates, though most of these will likely never work with the iframe implementation
@@ -311,26 +529,6 @@ CPWebViewProgressFinishedNotification = "CPWebViewProgressFinishedNoti
_UIDelegate = anObject;
}
- (void)loadHTMLString:(CPString)aString
{
[self loadHTMLString:aString baseURL:nil];
}
- (void)loadHTMLString:(CPString)aString baseURL:(CPURL)URL
{
// FIXME: do something with baseURL?
// clear the iframe
_iframe.src = "";
// need to give the browser a chance to reset iframe, otherwise we'll be document.write()-ing the previous document
window.setTimeout(function() {
var win = [self window];
win.document.write(aString);
}, 0);
}
@end
@@ -343,7 +541,7 @@ CPWebViewProgressFinishedNotification = "CPWebViewProgressFinishedNoti
{
if (self = [super init])
{
_window = aWindow
_window = aWindow;
}
return self;
}
@@ -376,3 +574,47 @@ CPWebViewProgressFinishedNotification = "CPWebViewProgressFinishedNoti
}
@end
@implementation CPWebView (CPCoding)
/*!
Initializes the web view from the data in a coder.
@param aCoder the coder from which to read the data
@return the initialized web view
*/
- (id)initWithCoder:(CPCoder)aCoder
{
self = [super initWithCoder:aCoder];
if (self)
{
// FIXME: encode/decode these?
_mainFrameURL = nil;
_backwardStack = [];
_forwardStack = [];
_scrollMode = CPWebViewScrollNative;
#if PLATFORM(DOM)
[self _initDOMWithFrame:[self frame]];
#endif
[self setBackgroundColor:[CPColor whiteColor]];
}
return self;
}
/*!
Writes out the web view's instance information to a coder.
@param aCoder the coder to which to write the data
*/
- (void)encodeWithCoder:(CPCoder)aCoder
{
var actualSubviews = _subviews;
_subviews = [];
[super encodeWithCoder:aCoder];
_subviews = actualSubviews;
}
@end
-1753
View File
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,82 @@
/*
* _CPBorderlessWindowView.j
* AppKit
*
* Created by Francisco Tolmasky.
* Copyright 2008, 280 North, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
@import "_CPWindowView.j"
var _CPToolbarViewBackgroundColor = nil;
@implementation _CPBorderlessBridgeWindowView : _CPWindowView
{
CPView _toolbarBackgroundView;
}
+ (CPColor)toolbarBackgroundColor
{
if (!_CPToolbarViewBackgroundColor)
_CPToolbarViewBackgroundColor = [CPColor colorWithPatternImage:[[CPImage alloc] initWithContentsOfFile:[[CPBundle bundleForClass:[_CPBorderlessBridgeWindowView class]] pathForResource:@"_CPToolbarView/_CPToolbarViewBackground.png"] size:CGSizeMake(1.0, 59.0)]];
return _CPToolbarViewBackgroundColor;
}
- (void)setShowsResizeIndicator:(BOOL)shouldShowResizeIndicator
{
// We don't ever want to show the resize indicator.
}
- (void)tile
{
[super tile];
var theWindow = [self window],
bounds = [self bounds];
[[theWindow contentView] setFrame:CGRectMake(0.0, [self toolbarMaxY], CGRectGetWidth(bounds), CGRectGetHeight(bounds) - [self toolbarMaxY])];
if (![[theWindow toolbar] isVisible])
{
[_toolbarBackgroundView removeFromSuperview];
_toolbarBackgroundView = nil;
return;
}
if (!_toolbarBackgroundView)
{
_toolbarBackgroundView = [[CPView alloc] initWithFrame:CGRectMakeZero()];
[_toolbarBackgroundView setBackgroundColor:[[self class] toolbarBackgroundColor]];
[_toolbarBackgroundView setAutoresizingMask:CPViewWidthSizable];
[self addSubview:_toolbarBackgroundView positioned:CPWindowBelow relativeTo:nil];
}
var frame = CGRectMakeZero();
frame.origin = CGPointMakeCopy([self toolbarOffset]);
frame.size = [_toolbarView frame].size;
[_toolbarBackgroundView setFrame:frame];
}
@end
@@ -1,6 +1,6 @@
/*
* Object.j
* Objective-J
* _CPBorderlessWindowView.j
* AppKit
*
* Created by Francisco Tolmasky.
* Copyright 2008, 280 North, Inc.
@@ -20,22 +20,10 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
@implementation Object
{
Class isa;
}
@import "_CPWindowView.j"
+ (void)initialize
@implementation _CPBorderlessWindowView : _CPWindowView
{
}
- (void)doesNotRecognizeSelector:(SEL)aSelector
{
}
- (id)forwardSelector:(SEL)selector arguments:(void)args
{
return nil;
}
@end
@end
+50
View File
@@ -0,0 +1,50 @@
@import "_CPWindowView.j"
var _CPStandardWindowViewBodyBackgroundColor = nil;
@implementation _CPDocModalWindowView : _CPWindowView
{
CPView _bodyView;
}
+ (CPColor)bodyBackgroundColor
{
if (!_CPStandardWindowViewBodyBackgroundColor)
_CPStandardWindowViewBodyBackgroundColor = [CPColor colorWithWhite:0.96 alpha:0.9];
return _CPStandardWindowViewBodyBackgroundColor;
}
- (id)initWithFrame:(CPRect)aFrame styleMask:(unsigned)aStyleMask
{
self = [super initWithFrame:aFrame styleMask:aStyleMask];
if (self)
{
var theClass = [self class],
bounds = [self bounds];
_bodyView = [[CPView alloc] initWithFrame:CGRectMake(0.0, 0.0, CGRectGetWidth(bounds), CGRectGetHeight(bounds))];
[_bodyView setAutoresizingMask:CPViewWidthSizable | CPViewHeightSizable];
[_bodyView setBackgroundColor:[theClass bodyBackgroundColor]];
[_bodyView setHitTests:NO];
[self addSubview:_bodyView];
}
return self;
}
- (CGRect)contentRectForFrameRect:(CGRect)aFrameRect
{
return aFrameRect;
}
- (CGRect)frameRectForContentRect:(CGRect)aContentRect
{
return aContentRect;
}
@end
+214
View File
@@ -0,0 +1,214 @@
/*
* _CPHUDWindowView.j
* AppKit
*
* Created by Francisco Tolmasky.
* Copyright 2008, 280 North, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
var _CPHUDWindowViewBackgroundColor = nil,
CPHUDCloseButtonImage = nil;
var HUD_TITLEBAR_HEIGHT = 26.0;
@implementation _CPHUDWindowView : _CPWindowView
{
CPView _toolbarView;
CPTextField _titleField;
CPButton _closeButton;
}
+ (void)initialize
{
if (self != [_CPHUDWindowView class])
return;
var bundle = [CPBundle bundleForClass:self];
_CPHUDWindowViewBackgroundColor = [CPColor colorWithPatternImage:[[CPNinePartImage alloc] initWithImageSlices:
[
[[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPWindow/HUD/CPWindowHUDBackground0.png"] size:CPSizeMake(6.0, 78.0)],
[[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPWindow/HUD/CPWindowHUDBackground1.png"] size:CPSizeMake(1.0, 78.0)],
[[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPWindow/HUD/CPWindowHUDBackground2.png"] size:CPSizeMake(6.0, 78.0)],
[[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPWindow/HUD/CPWindowHUDBackground3.png"] size:CPSizeMake(6.0, 1.0)],
[[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPWindow/HUD/CPWindowHUDBackground4.png"] size:CPSizeMake(5.0, 5.0)],
[[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPWindow/HUD/CPWindowHUDBackground5.png"] size:CPSizeMake(6.0, 1.0)],
[[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPWindow/HUD/CPWindowHUDBackground6.png"] size:CPSizeMake(6.0, 6.0)],
[[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPWindow/HUD/CPWindowHUDBackground7.png"] size:CPSizeMake(6.0, 6.0)],
[[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPWindow/HUD/CPWindowHUDBackground8.png"] size:CPSizeMake(6.0, 6.0)]
]]];
_CPHUDWindowViewCloseImage = [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"HUDTheme/WindowClose.png"] size:CPSizeMake(20.0, 20.0)];
_CPHUDWindowViewCloseActiveImage = [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"HUDTheme/WindowCloseActive.png"] size:CPSizeMake(20.0, 20.0)];
}
+ (CGRect)contentRectForFrameRect:(CGRect)aFrameRect
{
var contentRect = CGRectMakeCopy(aFrameRect),
titleBarHeight = HUD_TITLEBAR_HEIGHT;
contentRect.origin.y += titleBarHeight;
contentRect.size.height -= titleBarHeight;
return contentRect;
}
+ (CGRect)frameRectForContentRect:(CGRect)aContentRect
{
var frameRect = CGRectMakeCopy(aContentRect),
titleBarHeight = HUD_TITLEBAR_HEIGHT;
frameRect.origin.y -= titleBarHeight;
frameRect.size.height += titleBarHeight;
return frameRect;
}
- (CGRect)contentRectForFrameRect:(CGRect)aFrameRect
{
var contentRect = [[self class] contentRectForFrameRect:aFrameRect];
if ([[[self window] toolbar] isVisible])
{
toolbarHeight = CGRectGetHeight([[self toolbarView] frame]);
contentRect.origin.y += toolbarHeight;
contentRect.size.height -= toolbarHeight;
}
return contentRect;
}
- (CGRect)frameRectForContentRect:(CGRect)aContentRect
{
var frameRect = [[self class] frameRectForContentRect:aContentRect];
if ([[[self window] toolbar] isVisible])
{
toolbarHeight = CGRectGetHeight([[self toolbarView] frame]);
frameRect.origin.y -= toolbarHeight;
frameRect.size.height += toolbarHeight;
}
return frameRect;
}
- (id)initWithFrame:(CPRect)aFrame styleMask:(unsigned)aStyleMask
{
self = [super initWithFrame:aFrame styleMask:aStyleMask];
if (self)
{
var bounds = [self bounds];
[self setBackgroundColor:_CPHUDWindowViewBackgroundColor];
_titleField = [[CPTextField alloc] initWithFrame:CGRectMakeZero()];
[_titleField setHitTests:NO];
[_titleField setFont:[CPFont systemFontOfSize:11.0]];
[_titleField setTextColor:[CPColor whiteColor]];
[_titleField setTextShadowColor:[CPColor blackColor]];
[_titleField setTextShadowOffset:CGSizeMake(0.0, 1.0)];
[_titleField setAutoresizingMask:CPViewWidthSizable];
// FIXME: Make this to CPLineBreakByTruncatingMiddle once it's implemented.
[_titleField setLineBreakMode:CPLineBreakByTruncatingTail];
[_titleField setAlignment:CPCenterTextAlignment];
[_titleField setStringValue:@"Untitled"];
[_titleField sizeToFit];
[_titleField setAutoresizingMask:CPViewWidthSizable];
[_titleField setStringValue:@""];
[_titleField setFrame:CGRectMake(20.0, 3.0, CGRectGetWidth([self bounds]) - 40.0, CGRectGetHeight([_titleField frame]))];
[self addSubview:_titleField];
if (_styleMask & CPClosableWindowMask)
{
var closeSize = [_CPHUDWindowViewCloseImage size];
_closeButton = [[CPButton alloc] initWithFrame:CGRectMake(4.0, 4.0, closeSize.width, closeSize.height)];
[_closeButton setBordered:NO];
[_closeButton setImage:_CPHUDWindowViewCloseImage];
[_closeButton setAlternateImage:_CPHUDWindowViewCloseActiveImage];
[self addSubview:_closeButton];
}
[self setResizeIndicatorOffset:CGSizeMake(5.0, 5.0)];
}
return self;
}
- (void)viewDidMoveToWindow
{
[_closeButton setTarget:[self window]];
[_closeButton setAction:@selector(performClose:)];
}
- (void)setTitle:(CPString)aTitle
{
[_titleField setStringValue:aTitle];
}
- (_CPToolbarView)toolbarView
{
return _toolbarView;
}
- (CPColor)toolbarLabelColor
{
return [CPColor whiteColor];
}
- (CPColor)toolbarLabelShadowColor
{
return [CPColor blackColor];
}
- (CGSize)toolbarOffset
{
return CGSizeMake(0.0, HUD_TITLEBAR_HEIGHT);
}
- (void)tile
{
[super tile];
var theWindow = [self window],
bounds = [self bounds],
width = CGRectGetWidth(bounds);
[_titleField setFrame:CGRectMake(20.0, 3.0, width - 40.0, CGRectGetHeight([_titleField frame]))];
var maxY = [self toolbarMaxY];
[[theWindow contentView] setFrameOrigin:CGPointMake(0.0, maxY, width, CGRectGetHeight(bounds) - maxY)];
}
@end
+408
View File
@@ -0,0 +1,408 @@
/*
* _CPStandardWindowView.j
* AppKit
*
* Created by Francisco Tolmasky.
* Copyright 2008, 280 North, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
@import "_CPWindowView.j"
var GRADIENT_HEIGHT = 41.0;
var _CPTexturedWindowHeadGradientColor = nil,
_CPTexturedWindowHeadSolidColor = nil;
@implementation _CPTexturedWindowHeadView : CPView
{
CPView _gradientView;
CPView _solidView;
CPView _dividerView;
}
+ (CPColor)gradientColor
{
if (!_CPTexturedWindowHeadGradientColor)
{
var bundle = [CPBundle bundleForClass:[_CPWindowView class]];
_CPTexturedWindowHeadGradientColor = [CPColor colorWithPatternImage:[[CPThreePartImage alloc] initWithImageSlices:
[
[[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPWindow/Standard/CPWindowStandardTop0.png"] size:CGSizeMake(6.0, 41.0)],
[[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPWindow/Standard/CPWindowStandardTop1.png"] size:CGSizeMake(1.0, 41.0)],
[[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPWindow/Standard/CPWindowStandardTop2.png"] size:CGSizeMake(6.0, 41.0)]
]
isVertical:NO
]];
}
return _CPTexturedWindowHeadGradientColor;
}
+ (CPColor)solidColor
{
if (!_CPTexturedWindowHeadSolidColor)
_CPTexturedWindowHeadSolidColor = [CPColor colorWithCalibratedRed:195.0 / 255.0 green:195.0 / 255.0 blue:195.0 / 255.0 alpha:1.0];
return _CPTexturedWindowHeadSolidColor;
}
- (id)initWithFrame:(CGRect)aFrame
{
self = [super initWithFrame:aFrame];
if (self)
{
var theClass = [self class],
bounds = [self bounds];
_gradientView = [[CPView alloc] initWithFrame:CGRectMake(0.0, 0.0, CGRectGetWidth(bounds), GRADIENT_HEIGHT)];
[_gradientView setBackgroundColor:[theClass gradientColor]];
[self addSubview:_gradientView];
_solidView = [[CPView alloc] initWithFrame:CGRectMake(0.0, GRADIENT_HEIGHT, CGRectGetWidth(bounds), CGRectGetHeight(bounds) - GRADIENT_HEIGHT)];
[_solidView setBackgroundColor:[theClass solidColor]];
[self addSubview:_solidView];
}
return self;
}
- (void)resizeSubviewsWithOldSize:(CGSize)aSize
{
var bounds = [self bounds];
[_gradientView setFrameSize:CGSizeMake(CGRectGetWidth(bounds), GRADIENT_HEIGHT)];
[_solidView setFrameSize:CGSizeMake(CGRectGetWidth(bounds), CGRectGetHeight(bounds) - GRADIENT_HEIGHT)];
}
@end
var _CPStandardWindowViewBodyBackgroundColor = nil,
_CPStandardWindowViewDividerBackgroundColor = nil,
_CPStandardWindowViewTitleBackgroundColor = nil,
_CPStandardWindowViewCloseButtonImage = nil,
_CPStandardWindowViewCloseButtonHighlightedImage = nil,
_CPStandardWindowViewCloseButtonUnsavedImage = nil,
_CPStandardWindowViewCloseButtonUnsavedHighlightedImage = nil,
_CPStandardWindowViewMinimizeButtonImage = nil,
_CPStandardWindowViewMinimizeButtonHighlightedImage = nil;
var STANDARD_GRADIENT_HEIGHT = 41.0;
STANDARD_TITLEBAR_HEIGHT = 25.0;
@implementation _CPStandardWindowView : _CPWindowView
{
_CPTexturedWindowHeadView _headView;
CPView _dividerView;
CPView _bodyView;
CPView _toolbarView;
CPTextField _titleField;
CPButton _closeButton;
CPButton _minimizeButton;
BOOL _isDocumentEdited;
}
+ (CPColor)bodyBackgroundColor
{
if (!_CPStandardWindowViewBodyBackgroundColor)
_CPStandardWindowViewBodyBackgroundColor = [CPColor colorWithWhite:0.96 alpha:1.0];
return _CPStandardWindowViewBodyBackgroundColor;
}
+ (CPColor)dividerBackgroundColor
{
if (!_CPStandardWindowViewDividerBackgroundColor)
_CPStandardWindowViewDividerBackgroundColor = [CPColor colorWithCalibratedRed:125.0 / 255.0 green:125.0 / 255.0 blue:125.0 / 255.0 alpha:1.0];
return _CPStandardWindowViewDividerBackgroundColor;
}
+ (CPColor)titleColor
{
if (!_CPStandardWindowViewTitleBackgroundColor)
_CPStandardWindowViewTitleBackgroundColor = [CPColor colorWithCalibratedRed:44.0 / 255.0 green:44.0 / 255.0 blue:44.0 / 255.0 alpha:1.0];
return _CPStandardWindowViewTitleBackgroundColor;
}
+ (CGRect)contentRectForFrameRect:(CGRect)aFrameRect
{
var contentRect = CGRectMakeCopy(aFrameRect),
titleBarHeight = [self titleBarHeight] + 1.0;
contentRect.origin.y += titleBarHeight;
contentRect.size.height -= titleBarHeight;
return contentRect;
}
+ (CGRect)frameRectForContentRect:(CGRect)aContentRect
{
var frameRect = CGRectMakeCopy(aContentRect),
titleBarHeight = [self titleBarHeight] + 1.0;
frameRect.origin.y -= titleBarHeight;
frameRect.size.height += titleBarHeight;
return frameRect;
}
+ (float)titleBarHeight
{
return STANDARD_TITLEBAR_HEIGHT;
}
- (CGRect)contentRectForFrameRect:(CGRect)aFrameRect
{
var contentRect = [[self class] contentRectForFrameRect:aFrameRect],
theToolbar = [[self window] toolbar];
if ([theToolbar isVisible])
{
toolbarHeight = CGRectGetHeight([[theToolbar _toolbarView] frame]);
contentRect.origin.y += toolbarHeight;
contentRect.size.height -= toolbarHeight;
}
return contentRect;
}
- (CGRect)frameRectForContentRect:(CGRect)aContentRect
{
var frameRect = [[self class] frameRectForContentRect:aContentRect],
theToolbar = [[self window] toolbar];
if ([theToolbar isVisible])
{
toolbarHeight = CGRectGetHeight([[theToolbar _toolbarView] frame]);
frameRect.origin.y -= toolbarHeight;
frameRect.size.height += toolbarHeight;
}
return frameRect;
}
- (id)initWithFrame:(CPRect)aFrame styleMask:(unsigned)aStyleMask
{
self = [super initWithFrame:aFrame styleMask:aStyleMask];
if (self)
{
var theClass = [self class],
bounds = [self bounds];
_headView = [[_CPTexturedWindowHeadView alloc] initWithFrame:CGRectMake(0.0, 0.0, CGRectGetWidth(bounds), [[self class] titleBarHeight])];
[_headView setAutoresizingMask:CPViewWidthSizable];;
[_headView setHitTests:NO];
[self addSubview:_headView];
_dividerView = [[CPView alloc] initWithFrame:CGRectMake(0.0, CGRectGetMaxY([_headView frame]), CGRectGetWidth(bounds), 1.0)];
[_dividerView setAutoresizingMask:CPViewWidthSizable];
[_dividerView setBackgroundColor:[theClass dividerBackgroundColor]];
[_dividerView setHitTests:NO];
[self addSubview:_dividerView];
var y = CGRectGetMaxY([_dividerView frame]);
_bodyView = [[CPView alloc] initWithFrame:CGRectMake(0.0, y, CGRectGetWidth(bounds), CGRectGetHeight(bounds) - y)];
[_bodyView setAutoresizingMask:CPViewWidthSizable | CPViewHeightSizable];
[_bodyView setBackgroundColor:[theClass bodyBackgroundColor]];
[_bodyView setHitTests:NO];
[self addSubview:_bodyView];
[self setResizeIndicatorOffset:CGSizeMake(2.0, 2.0)];
_titleField = [[CPTextField alloc] initWithFrame:CGRectMakeZero()];
[_titleField setFont:[CPFont boldSystemFontOfSize:12.0]];
[_titleField setAutoresizingMask:CPViewWidthSizable];
// FIXME: Make this to CPLineBreakByTruncatingMiddle once it's implemented.
[_titleField setLineBreakMode:CPLineBreakByTruncatingTail];
[_titleField setAlignment:CPCenterTextAlignment];
[_titleField setTextShadowColor:[CPColor whiteColor]];
[_titleField setTextShadowOffset:CGSizeMake(0.0, 1.0)];
[_titleField setStringValue:@"Untitled"];
[_titleField sizeToFit];
[_titleField setAutoresizingMask:CPViewWidthSizable];
[_titleField setStringValue:@""];
[self addSubview:_titleField];
if (_styleMask & CPClosableWindowMask)
{
if (!_CPStandardWindowViewCloseButtonImage)
{
var bundle = [CPBundle bundleForClass:[CPWindow class]];
_CPStandardWindowViewCloseButtonImage = [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPWindow/Standard/CPWindowStandardCloseButton.png"] size:CGSizeMake(16.0, 16.0)];
_CPStandardWindowViewCloseButtonHighlightedImage = [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPWindow/Standard/CPWindowStandardCloseButtonHighlighted.png"] size:CGSizeMake(16.0, 16.0)];
_CPStandardWindowViewCloseButtonUnsavedImage = [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPWindow/Standard/CPWindowStandardCloseButtonUnsaved.png"] size:CGSizeMake(16.0, 16.0)];
_CPStandardWindowViewCloseButtonUnsavedHighlightedImage = [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPWindow/Standard/CPWindowStandardCloseButtonUnsavedHighlighted.png"] size:CGSizeMake(16.0, 16.0)];
}
_closeButton = [[CPButton alloc] initWithFrame:CGRectMake(8.0, 7.0, 16.0, 16.0)];
[_closeButton setBordered:NO];
[self _updateCloseButton];
[self addSubview:_closeButton];
}
if (_styleMask & CPMiniaturizableWindowMask && ![CPPlatform isBrowser])
{
if (!_CPStandardWindowViewMinimizeButtonImage)
{
var bundle = [CPBundle bundleForClass:[CPWindow class]];
_CPStandardWindowViewMinimizeButtonImage = [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPWindow/Standard/CPWindowStandardMinimizeButton.png"] size:CGSizeMake(16.0, 16.0)];
_CPStandardWindowViewMinimizeButtonHighlightedImage = [[CPImage alloc] initWithContentsOfFile:[bundle pathForResource:@"CPWindow/Standard/CPWindowStandardMinimizeButtonHighlighted.png"] size:CGSizeMake(16.0, 16.0)];
}
_minimizeButton = [[CPButton alloc] initWithFrame:CGRectMake(27.0, 7.0, 16.0, 16.0)];
[_minimizeButton setBordered:NO];
[_minimizeButton setImage:_CPStandardWindowViewMinimizeButtonImage];
[_minimizeButton setAlternateImage:_CPStandardWindowViewMinimizeButtonHighlightedImage];
[self addSubview:_minimizeButton];
}
[self tile];
}
return self;
}
- (void)viewDidMoveToWindow
{
[_closeButton setTarget:[self window]];
[_closeButton setAction:@selector(performClose:)];
[_minimizeButton setTarget:[self window]];
[_minimizeButton setAction:@selector(performMiniaturize:)];
}
- (CGSize)toolbarOffset
{
return CGSizeMake(0.0, [[self class] titleBarHeight]);
}
- (void)tile
{
[super tile];
var theWindow = [self window],
bounds = [self bounds],
width = CGRectGetWidth(bounds);
[_headView setFrameSize:CGSizeMake(width, [self toolbarMaxY])];
[_dividerView setFrame:CGRectMake(0.0, CGRectGetMaxY([_headView frame]), width, 1.0)];
var dividerMaxY = CGRectGetMaxY([_dividerView frame]);
[_bodyView setFrame:CGRectMake(0.0, dividerMaxY, width, CGRectGetHeight(bounds) - dividerMaxY)];
var leftOffset = 8;
if (_closeButton)
leftOffset += 19.0;
if (_minimizeButton)
leftOffset += 19.0;
[_titleField setFrame:CGRectMake(leftOffset, 5.0, width - leftOffset*2.0, CGRectGetHeight([_titleField frame]))];
[[theWindow contentView] setFrameOrigin:CGPointMake(0.0, CGRectGetMaxY([_dividerView frame]))];
}
/*
- (void)setAnimatingToolbar:(BOOL)isAnimatingToolbar
{
[super setAnimatingToolbar:isAnimatingToolbar];
if ([self isAnimatingToolbar])
{
[[self toolbarView] setAutoresizingMask:CPViewHeightSizable];
[_headView setAutoresizingMask:CPViewHeightSizable];
[_dividerView setAutoresizingMask:CPViewMinYMargin];
[_bodyView setAutoresizingMask:CPViewMinYMargin];
[[[self window] contentView] setAutoresizingMask:CPViewNotSizable];
}
else
{
[[self toolbarView] setAutoresizingMask:CPViewWidthSizable];
[_headView setAutoresizingMask:CPViewWidthSizable];
[_dividerView setAutoresizingMask:CPViewWidthSizable];
[_bodyView setAutoresizingMask:CPViewWidthSizable | CPViewHeightSizable];
[[[self window] contentView] setAutoresizingMask:CPViewWidthSizable | CPViewHeightSizable];
}
}
*/
- (void)_updateCloseButton
{
if (_isDocumentEdited)
{
[_closeButton setImage:_CPStandardWindowViewCloseButtonUnsavedImage];
[_closeButton setAlternateImage:_CPStandardWindowViewCloseButtonUnsavedHighlightedImage];
}
else
{
[_closeButton setImage:_CPStandardWindowViewCloseButtonImage];
[_closeButton setAlternateImage:_CPStandardWindowViewCloseButtonHighlightedImage];
}
}
- (void)setDocumentEdited:(BOOL)isEdited
{
_isDocumentEdited = isEdited;
[self _updateCloseButton];
}
- (void)setTitle:(CPString)aTitle
{
[_titleField setStringValue:aTitle];
}
- (void)mouseDown:(CPEvent)anEvent
{
if (CGRectContainsPoint([_headView frame], [self convertPoint:[anEvent locationInWindow] fromView:nil]))
return [self trackMoveWithEvent:anEvent];
[super mouseDown:anEvent];
}
@end
+372
View File
@@ -0,0 +1,372 @@
/*
* _CPWindowView.j
* AppKit
*
* Created by Francisco Tolmasky.
* Copyright 2008, 280 North, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
@import "CPView.j"
@import "CPImageView.j"
#include "../CoreGraphics/CGGeometry.h"
var _CPWindowViewResizeIndicatorImage = nil;
@implementation _CPWindowView : CPView
{
unsigned _styleMask;
CPImageView _resizeIndicator;
CGSize _resizeIndicatorOffset;
CPView _toolbarView;
// BOOL _isAnimatingToolbar;
CGRect _resizeFrame;
CGPoint _mouseDraggedPoint;
CGRect _cachedScreenFrame;
}
+ (void)initialize
{
if (self != [_CPWindowView class])
return;
_CPWindowViewResizeIndicatorImage = [[CPImage alloc] initWithContentsOfFile:[[CPBundle bundleForClass:[CPWindow class]] pathForResource:@"_CPWindowView/_CPWindowViewResizeIndicator.png"] size:CGSizeMake(12.0, 12.0)];
}
+ (CGRect)contentRectForFrameRect:(CGRect)aFrameRect
{
return CGRectMakeCopy(aFrameRect);
}
+ (CGRect)frameRectForContentRect:(CGRect)aContentRect
{
return CGRectMakeCopy(aContentRect);
}
- (CGRect)contentRectForFrameRect:(CGRect)aFrameRect
{
return [[self class] contentRectForFrameRect:aFrameRect];
}
- (CGRect)frameRectForContentRect:(CGRect)aContentRect
{
return [[self class] frameRectForContentRect:aContentRect];
}
- (id)initWithFrame:(CPRect)aFrame styleMask:(unsigned)aStyleMask
{
self = [super initWithFrame:aFrame];
if (self)
{
_styleMask = aStyleMask;
_resizeIndicatorOffset = CGSizeMake(0.0, 0.0);
_toolbarOffset = CGSizeMake(0.0, 0.0);
}
return self;
}
- (void)setDocumentEdited:(BOOL)isEdited
{
}
- (void)setTitle:(CPString)aTitle
{
}
- (BOOL)acceptsFirstMouse:(CPEvent)anEvent
{
return YES;
}
- (void)mouseDown:(CPEvent)anEvent
{
var theWindow = [self window];
if ((_styleMask & CPResizableWindowMask) && _resizeIndicator)
{
// FIXME: This should be better
var frame = [_resizeIndicator frame];
if (CGRectContainsPoint(frame, [self convertPoint:[anEvent locationInWindow] fromView:nil]))
return [self trackResizeWithEvent:anEvent];
}
if ([theWindow isMovableByWindowBackground])
[self trackMoveWithEvent:anEvent];
else
[super mouseDown:anEvent];
}
- (void)trackResizeWithEvent:(CPEvent)anEvent
{
var location = [anEvent locationInWindow],
type = [anEvent type];
if (type === CPLeftMouseUp)
return;
var theWindow = [self window];
if (type === CPLeftMouseDown)
{
var frame = [theWindow frame];
_resizeFrame = CGRectMake(location.x, location.y, CGRectGetWidth(frame), CGRectGetHeight(frame));
}
else if (type === CPLeftMouseDragged)
{
var newSize = CGSizeMake(CGRectGetWidth(_resizeFrame) + location.x - CGRectGetMinX(_resizeFrame), CGRectGetHeight(_resizeFrame) + location.y - CGRectGetMinY(_resizeFrame));
if (theWindow._isSheet && theWindow._parentView && (theWindow._frame.size.width !== newSize.width))
[theWindow._parentView _setAttachedSheetFrameOrigin];
[theWindow setFrameSize:newSize];
}
[CPApp setTarget:self selector:@selector(trackResizeWithEvent:) forNextEventMatchingMask:CPLeftMouseDraggedMask | CPLeftMouseUpMask untilDate:nil inMode:nil dequeue:YES];
}
- (CGPoint)_pointWithinScreenFrame:(CGPoint)aPoint
{
// FIXME: this is WRONG, all of this is WRONG
if (![CPPlatform isBrowser])
return aPoint;
var visibleFrame = _cachedScreenFrame;
if (!visibleFrame)
visibleFrame = [[CPPlatformWindow primaryPlatformWindow] visibleFrame];
var minPointY = 0;
if([CPMenu menuBarVisible])
minPointY = [[CPApp mainMenu] menuBarHeight];
var restrictedPoint = CGPointMake(0, 0);
restrictedPoint.x = MIN(MAX(aPoint.x, -_frame.size.width + 4.0), CGRectGetMaxX(visibleFrame) - 4.0);
restrictedPoint.y = MIN(MAX(aPoint.y, minPointY), CGRectGetMaxY(visibleFrame) - 8.0);
return restrictedPoint;
}
- (void)trackMoveWithEvent:(CPEvent)anEvent
{
var type = [anEvent type];
if (type === CPLeftMouseUp)
{
_cachedScreenFrame = nil;
return;
}
else if (type === CPLeftMouseDown)
{
_mouseDraggedPoint = [[self window] convertBaseToGlobal:[anEvent locationInWindow]];
_cachedScreenFrame = [[CPPlatformWindow primaryPlatformWindow] visibleFrame];
}
else if (type === CPLeftMouseDragged)
{
var theWindow = [self window],
frame = [theWindow frame],
location = [theWindow convertBaseToGlobal:[anEvent locationInWindow]],
origin = [self _pointWithinScreenFrame:CGPointMake(_CGRectGetMinX(frame) + (location.x - _mouseDraggedPoint.x),
_CGRectGetMinY(frame) + (location.y - _mouseDraggedPoint.y))];
[theWindow setFrameOrigin:origin];
_mouseDraggedPoint = [self _pointWithinScreenFrame:location];
}
[CPApp setTarget:self selector:@selector(trackMoveWithEvent:) forNextEventMatchingMask:CPLeftMouseDraggedMask | CPLeftMouseUpMask untilDate:nil inMode:nil dequeue:YES];
}
- (void)setShowsResizeIndicator:(BOOL)shouldShowResizeIndicator
{
if (shouldShowResizeIndicator)
{
var size = [_CPWindowViewResizeIndicatorImage size],
boundsSize = [self frame].size;
_resizeIndicator = [[CPImageView alloc] initWithFrame:CGRectMake(boundsSize.width - size.width - _resizeIndicatorOffset.width, boundsSize.height - size.height - _resizeIndicatorOffset.height, size.width, size.height)];
[_resizeIndicator setImage:_CPWindowViewResizeIndicatorImage];
[_resizeIndicator setAutoresizingMask:CPViewMinXMargin | CPViewMinYMargin];
[self addSubview:_resizeIndicator];
}
else
{
[_resizeIndicator removeFromSuperview];
_resizeIndicator = nil;
}
}
- (BOOL)showsResizeIndicator
{
return _resizeIndicator !== nil;
}
- (void)setResizeIndicatorOffset:(CGSize)anOffset
{
if (CGSizeEqualToSize(_resizeIndicatorOffset, anOffset))
return;
_resizeIndicatorOffset = anOffset;
if (!_resizeIndicator)
return;
var size = [_resizeIndicator frame].size,
boundsSize = [self frame].size;
[_resizeIndicator setFrameOrigin:CGPointMake(boundsSize.width - size.width - anOffset.width, boundsSize.height - size.height - anOffset.height)];
}
- (CGSize)resizeIndicatorOffset
{
return _resizeIndicatorOffset;
}
- (void)windowDidChangeDocumentEdited
{
}
- (void)windowDidChangeDocumentSaving
{
}
- (BOOL)showsToolbar
{
return YES;
}
- (CGSize)toolbarOffset
{
return CGSizeMakeZero();
}
- (CPColor)toolbarLabelColor
{
return [CPColor blackColor];
}
- (float)toolbarMaxY
{
if (!_toolbarView || [_toolbarView isHidden])
return [self toolbarOffset].height;
return CGRectGetMaxY([_toolbarView frame]);
}
- (_CPToolbarView)toolbarView
{
return _toolbarView;
}
- (void)tile
{
var theWindow = [self window],
bounds = [self bounds],
width = CGRectGetWidth(bounds);
if ([[theWindow toolbar] isVisible])
{
var toolbarView = [self toolbarView],
toolbarOffset = [self toolbarOffset];
[toolbarView setFrame:CGRectMake(toolbarOffset.width, toolbarOffset.height, width, CGRectGetHeight([toolbarView frame]))];
}
if ([self showsResizeIndicator])
{
var size = [_resizeIndicator frame].size,
boundsSize = [self bounds].size;
[_resizeIndicator setFrameOrigin:CGPointMake(boundsSize.width - size.width - _resizeIndicatorOffset.width, boundsSize.height - size.height - _resizeIndicatorOffset.height)];
}
}
- (void)noteToolbarChanged
{
var theWindow = [self window],
toolbar = [theWindow toolbar],
toolbarView = [toolbar _toolbarView];
if (_toolbarView !== toolbarView)
{
[_toolbarView removeFromSuperview];
if (toolbarView)
{
[toolbarView removeFromSuperview];
[toolbarView FIXME_setIsHUD:_styleMask & CPHUDBackgroundWindowMask];
[self addSubview:toolbarView];
}
_toolbarView = toolbarView;
}
[toolbarView setHidden:![self showsToolbar] || ![toolbar isVisible]];
if (theWindow)
{
var contentRect = [self convertRect:[[theWindow contentView] frame] toView:nil];
contentRect.origin = [theWindow convertBaseToGlobal:contentRect.origin];
[self setAutoresizesSubviews:NO];
[theWindow setFrame:[theWindow frameRectForContentRect:contentRect]];
[self setAutoresizesSubviews:YES];
}
[self tile];
}
/*
- (void)setAnimatingToolbar:(BOOL)isAnimatingToolbar
{
_isAnimatingToolbar = isAnimatingToolbar;
}
- (BOOL)isAnimatingToolbar
{
return _isAnimatingToolbar;
}
*/
- (void)didAddSubview:(CPView)aView
{
if (!_resizeIndicator || aView === _resizeIndicator)
return;
[self addSubview:_resizeIndicator];
}
@end
+256 -65
View File
@@ -20,30 +20,48 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
import <Foundation/CPObject.j>
import <Foundation/CPString.j>
@import <Foundation/CPObject.j>
@import <Foundation/CPString.j>
import "CPResponder.j"
import "CPWindow.j"
import "CPDocument.j"
@import "CPResponder.j"
@import "CPWindow.j"
@import "CPDocument.j"
#include "Platform/Platform.h"
/*
An instance of a <objj>CPWindowController</objj> manages a <objj>CPWindow</objj>. It has methods
/*!
@ingroup appkit
@class CPWindowController
An instance of a CPWindowController manages a CPWindow. It has methods
that get called when the window is loading, and after the window has loaded. In the
Model-View-Controller method of program design, the <objj>CPWindowController</objj> would be
considered the 'Controller' and the <objj>CPWindow</objj> the 'Model.'
Model-View-Controller method of program design, the CPWindowController would be
considered the 'Controller' and the CPWindow the 'Model.'
*/
@implementation CPWindowController : CPResponder
{
id _owner;
CPWindow _window;
CPDocument _document;
CPString _windowCibName;
CPWindow _window;
CPArray _documents;
CPDocument _document;
BOOL _shouldCloseDocument;
BOOL _supportsMultipleDocuments;
id _cibOwner;
CPString _windowCibName;
CPString _windowCibPath;
CPViewController _viewController;
CPView _viewControllerContainerView;
}
/*
- (id)init
{
return [self initWithWindow:nil];
}
/*!
Initializes the controller with a window.
@param aWindow the window to control
@return the initialzed window controller
@@ -51,18 +69,21 @@ import "CPDocument.j"
- (id)initWithWindow:(CPWindow)aWindow
{
self = [super init];
if (self)
{
[self setWindow:aWindow];
[self setShouldCloseDocument:NO];
[self setNextResponder:CPApp];
_documents = [];
}
return self;
}
/*
/*!
Initializes the controller with a Capppuccino Interface Builder name.
@param aWindowCibName the cib name of the window to control
@return the initialized window controller
@@ -72,7 +93,7 @@ import "CPDocument.j"
return [self initWithWindowCibName:aWindowCibName owner:self];
}
/*
/*!
Initializes the controller with a cafe name.
@param aWindowCibName the cib name of the window to control
@param anOwner the owner of the cib file
@@ -80,112 +101,144 @@ import "CPDocument.j"
*/
- (id)initWithWindowCibName:(CPString)aWindowCibName owner:(id)anOwner
{
self = [super init];
self = [self initWithWindow:nil];
if (self)
{
_owner = anOwner;
_cibOwner = anOwner;
_windowCibName = aWindowCibName;
[self setNextResponder:CPApp];
}
return self;
}
/*
- (id)initWithWindowCibPath:(CPString)aWindowCibPath owner:(id)anOwner
{
self = [self initWithWindow:nil];
if (self)
{
_cibOwner = anOwner;
_windowCibPath = aWindowCibPath;
}
return self;
}
/*!
Loads the window
*/
- (void)loadWindow
{
[self windowWillLoad];
//FIXME: ACTUALLY LOAD WINDOW!!!
[self setWindow:CPApp._keyWindow = [[CPWindow alloc] initWithContentRect:CPRectMakeZero() styleMask:CPBorderlessBridgeWindowMask|CPTitledWindowMask|CPClosableWindowMask|CPResizableWindowMask]];
[self windowDidLoad];
if (_window)
return;
[[CPBundle bundleForClass:[_cibOwner class]] loadCibFile:[self windowCibPath] externalNameTable:[CPDictionary dictionaryWithObject:_cibOwner forKey:CPCibOwner]];
}
/*
/*!
Shows the window.
@param aSender the object requesting the show
*/
- (CFAction)showWindow:(id)aSender
- (@action)showWindow:(id)aSender
{
var theWindow = [self window];
if ([theWindow respondsToSelector:@selector(becomesKeyOnlyIfNeeded)] && [theWindow becomesKeyOnlyIfNeeded])
if ([theWindow respondsToSelector:@selector(becomesKeyOnlyIfNeeded)] && [theWindow becomesKeyOnlyIfNeeded])
[theWindow orderFront:aSender];
else
[theWindow makeKeyAndOrderFront:aSender];
}
/*
Returns <code>YES</code> if the window has been loaded. Specifically,
if <objj>loadWindow</objj> has been called.
/*!
Returns \c YES if the window has been loaded. Specifically,
if loadWindow has been called.
*/
- (BOOL)isWindowLoaded
{
return _window;
return _window !== nil;
}
/*
/*!
Returns the window this object controls.
*/
- (CPWindow)window
{
if (!_window)
[self loadWindow];
{
[self windowWillLoad];
[_document windowControllerWillLoadCib:self];
[self loadWindow];
if (_window === nil && [_cibOwner isKindOfClass:[CPDocument class]])
[self setWindow:[_cibOwner valueForKey:@"window"]];
if (!_window)
{
var reason = [CPString stringWithFormat:@"Window for %@ could not be loaded from Cib or no window specified. \
Override loadWindow to load the window manually.", self];
[CPException raise:CPInternalInconsistencyException reason:reason];
}
[self windowDidLoad];
[_document windowControllerDidLoadCib:self];
[self synchronizeWindowTitleWithDocumentName];
}
return _window;
}
/*
/*!
Sets the window to be controlled.
@param aWindow the new window to control
*/
- (void)setWindow:(CPWindow)aWindow
{
[_window setWindowController:nil];
_window = aWindow;
[_window setWindowController:self];
[_window setNextResponder:self];
}
/*
/*!
The method notifies the controller that it's window has loaded.
*/
- (void)windowDidLoad
{
[_document windowControllerDidLoadNib:self];
[self synchronizeWindowTitleWithDocumentName];
}
/*
/*!
The method notifies the controller that it's window is about to load.
*/
- (void)windowWillLoad
{
[_document windowControllerWillLoadNib:self];
}
/*
/*!
Sets the document that is inside the controlled window.
@param aDocument the document in the controlled window
*/
- (void)setDocument:(CPDocument)aDocument
{
if (_document == aDocument)
if (_document === aDocument)
return;
var defaultCenter = [CPNotificationCenter defaultCenter];
if (_document)
{
if (![self supportsMultipleDocuments])
[self removeDocument:_document];
[defaultCenter removeObserver:self
name:CPDocumentWillSaveNotification
object:_document];
[defaultCenter removeObserver:self
name:CPDocumentDidSaveNotification
object:_document];
@@ -194,16 +247,18 @@ import "CPDocument.j"
name:CPDocumentDidFailToSaveNotification
object:_document];
}
_document = aDocument;
if (_document)
{
[self addDocument:_document];
[defaultCenter addObserver:self
selector:@selector(_documentWillSave:)
name:CPDocumentWillSaveNotification
object:_document];
[defaultCenter addObserver:self
selector:@selector(_documentDidSave:)
name:CPDocumentDidSaveNotification
@@ -213,13 +268,113 @@ import "CPDocument.j"
selector:@selector(_documentDidFailToSave:)
name:CPDocumentDidFailToSaveNotification
object:_document];
[self setDocumentEdited:[_document isDocumentEdited]];
}
}
var viewController = [_document viewControllerForWindowController:self];
if (viewController)
[self setViewController:viewController];
[self synchronizeWindowTitleWithDocumentName];
}
- (void)setSupportsMultipleDocuments:(BOOL)shouldSupportMultipleDocuments
{
_supportsMultipleDocuments = shouldSupportMultipleDocuments;
}
- (BOOL)supportsMultipleDocuments
{
return _supportsMultipleDocuments;
}
- (void)addDocument:(CPDocument)aDocument
{
if (aDocument && ![_documents containsObject:aDocument])
[_documents addObject:aDocument];
}
- (void)removeDocument:(CPDocument)aDocument
{
var index = [_documents indexOfObjectIdenticalTo:aDocument];
if (index === CPNotFound)
return;
[_documents removeObjectAtIndex:index];
if (_document === aDocument && [_documents count])
[self setDocument:[_documents objectAtIndex:MIN(index, [_documents count] - 1)]];
}
- (void)removeDocumentAndCloseIfNecessary:(CPDocument)aDocument
{
[self removeDocument:aDocument];
if (![_documents count])
[self close];
}
- (CPArray)documents
{
return _documents;
}
- (void)setViewController:(CPViewController)aViewController
{
var containerView = [self viewControllerContainerView] || [[self window] contentView],
view = [_viewController view],
frame = view ? [view frame] : [containerView bounds];
[view removeFromSuperview];
_viewController = aViewController;
view = [_viewController view];
if (view)
{
[view setFrame:frame];
[containerView addSubview:view];
}
}
- (void)setViewControllerContainerView:(CPView)aView
{
_viewControllerContainerView = aView;
}
- (void)viewControllerContainerView
{
return _viewControllerContainerView;
}
- (void)setViewController:(CPViewController)aViewController
{
var containerView = [self viewControllerContainerView] || [[self window] contentView],
view = [_viewController view],
frame = view ? [view frame] : [containerView bounds];
[view removeFromSuperview];
_viewController = aViewController;
view = [_viewController view];
if (view)
{
[view setFrame:frame];
[containerView addSubview:view];
}
}
- (CPViewController)viewController
{
return _viewController;
}
/* @ignore */
- (void)_documentWillSave:(CPNotification)aNotification
{
@@ -238,7 +393,7 @@ import "CPDocument.j"
[[self window] setDocumentSaving:NO];
}
/*
/*!
Returns the document in the controlled window.
*/
- (CPDocument)document
@@ -246,30 +401,66 @@ import "CPDocument.j"
return _document;
}
/*
/*!
Sets whether the document has unsaved changes. The window can use this as a hint to
@param isEdited <code>YES</code> means the document has unsaved changes.
@param isEdited \c YES means the document has unsaved changes.
*/
- (void)setDocumentEdited:(BOOL)isEdited
{
[[self window] setDocumentEdited:isEdited];
}
- (void)close
{
[[self window] close];
}
- (void)setShouldCloseDocument:(BOOL)shouldCloseDocument
{
_shouldCloseDocument = shouldCloseDocument;
}
- (BOOL)shouldCloseDocument
{
return _shouldCloseDocument;
}
- (id)owner
{
return _cibOwner;
}
- (CPString)windowCibName
{
if (_windowCibName)
return _windowCibName;
return [[_windowCibPath lastPathComponent] stringByDeletingPathExtension];
}
- (CPString)windowCibPath
{
if (_windowCibPath)
return _windowCibPath;
return [[CPBundle bundleForClass:[_cibOwner class]] pathForResource:_windowCibName + @".cib"];
}
// Setting and Getting Window Attributes
/*
/*!
Sets the title of the window as the name of the document.
*/
- (void)synchronizeWindowTitleWithDocumentName
{
if (!_document || !_window)
return;
// [_window setRepresentedFilename:];
[_window setTitle:[self windowTitleForDocumentDisplayName:[_document displayName]]];
}
/*
/*!
Returns the window title based on the document's name.
@param aDisplayName the document's filename
*/
+139 -67
View File
@@ -20,101 +20,173 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
import <Foundation/CPObject.j>
import <Foundation/CPURLConnection.j>
import <Foundation/CPURLRequest.j>
@import <Foundation/CPObject.j>
@import <Foundation/CPURLConnection.j>
@import <Foundation/CPURLRequest.j>
@import "_CPCibClassSwapper.j"
@import "_CPCibCustomObject.j"
@import "_CPCibCustomResource.j"
@import "_CPCibCustomView.j"
@import "_CPCibKeyedUnarchiver.j"
@import "_CPCibObjectData.j"
@import "_CPCibProxyObject.j"
@import "_CPCibWindowTemplate.j"
import "_CPCibCustomObject.j"
import "_CPCibCustomView.j"
import "_CPCibKeyedUnarchiver.j"
import "_CPCibObjectData.j"
import "_CPCibWindowTemplate.j"
CPCibOwner = @"CPCibOwner",
CPCibTopLevelObjects = @"CPCibTopLevelObjects";
CPCibTopLevelObjects = @"CPCibTopLevelObjects",
CPCibReplacementClasses = @"CPCibReplacementClasses",
CPCibExternalObjects = @"CPCibExternalObjects";
var CPCibObjectDataKey = @"CPCibObjectDataKey";
/*!
@ingroup appkit
*/
@implementation CPCib : CPObject
{
CPData _data;
CPData _data;
CPBundle _bundle;
BOOL _awakenCustomResources;
id _loadDelegate;
}
- (id)initWithContentsOfURL:(CPURL)aURL
{
self = [super init];
if (self)
_data = [CPURLConnection sendSynchronousRequest:[CPURLRequest requestWithURL:aURL] returningResponse:nil error:nil];
{
_data = [CPURLConnection sendSynchronousRequest:[CPURLRequest requestWithURL:aURL] returningResponse:nil];
_awakenCustomResources = YES;
}
return self;
}
- (id)initWithContentsOfURL:(CPURL)aURL loadDelegate:(id)aLoadDelegate
{
self = [super init];
if (self)
{
[CPURLConnection connectionWithRequest:[CPURLRequest requestWithURL:aURL] delegate:self];
_awakenCustomResources = YES;
_loadDelegate = aLoadDelegate;
}
return self;
}
- (id)initWithCibNamed:(CPString)aName bundle:(CPBundle)aBundle
{
if (![aName hasSuffix:@".cib"])
aName = [aName stringByAppendingString:@".cib"];
// If aBundle is nil, use mainBundle, but ONLY for searching for the nib, not for resources later.
self = [self initWithContentsOfURL:[aBundle || [CPBundle mainBundle] pathForResource:aName]];
if (self)
_bundle = aBundle;
return self;
}
- (id)initWithCibNamed:(CPString)aName bundle:(CPBundle)aBundle loadDelegate:(id)aLoadDelegate
{
if (![aName hasSuffix:@".cib"])
aName = [aName stringByAppendingString:@".cib"];
// If aBundle is nil, use mainBundle, but ONLY for searching for the nib, not for resources later.
self = [self initWithContentsOfURL:[aBundle || [CPBundle mainBundle] pathForResource:aName] loadDelegate:aLoadDelegate];
if (self)
_bundle = aBundle;
return self;
}
- (void)_setAwakenCustomResources:(BOOL)shouldAwakenCustomResources
{
_awakenCustomResources = shouldAwakenCustomResources;
}
- (BOOL)_awakenCustomResources
{
return _awakenCustomResources;
}
- (BOOL)instantiateCibWithExternalNameTable:(CPDictionary)anExternalNameTable
{
var unarchiver = [[_CPCibKeyedUnarchiver alloc] initForReadingWithData:_data],
objectData = [unarchiver decodeObjectForKey:CPCibObjectDataKey];
var bundle = _bundle,
owner = [anExternalNameTable objectForKey:CPCibOwner];
if (!bundle && owner)
bundle = [CPBundle bundleForClass:[owner class]];
var unarchiver = [[_CPCibKeyedUnarchiver alloc] initForReadingWithData:_data bundle:bundle awakenCustomResources:_awakenCustomResources],
replacementClasses = [anExternalNameTable objectForKey:CPCibReplacementClasses];
if (replacementClasses)
{
var key = nil,
keyEnumerator = [replacementClasses keyEnumerator];
while (key = [keyEnumerator nextObject])
[unarchiver setClass:[replacementClasses objectForKey:key] forClassName:key];
}
[unarchiver setExternalObjectsForProxyIdentifiers:[anExternalNameTable objectForKey:CPCibExternalObjects]];
var objectData = [unarchiver decodeObjectForKey:CPCibObjectDataKey];
if (!objectData || ![objectData isKindOfClass:[_CPCibObjectData class]])
return NO;
[objectData establishConnectionsWithExternalNameTable:anExternalNameTable];
var owner = [anExternalNameTable objectForKey:CPCibOwner],
topLevelObjects = [anExternalNameTable objectForKey:CPCibTopLevelObjects];
/*
// [objectData establishConnectionsWithOwner:owner topLevelObjects:topLevelObjects];
// [objectData cibInstantiateWithOwner:owner topLevelObjects:topLevelObjects];
// alert([objectData description]);
// alert([unarchiver._archive description]);
NSMutableArray *t;
NSEnumerator *e;
id o;
id owner;
id rootObject;
#if 0
NSLog(@"instantiateCibWithExternalNameTable=%@", table);
#endif
if(![decoded isKindOfClass:[NSIBObjectData class]])
return NO;
owner=[table objectForKey:NSCibOwner];
rootObject=[decoded rootObject];
#if 0
NSLog(@"establishConnections");
#endif
[decoded establishConnectionsWithExternalNameTable:table];
#if 0
NSLog(@"awakeFromCib %d objects", [decodedObjects count]);
#endif
#if 0
NSLog(@"objects 2=%@", decodedObjects);
#endif
// FIXME: shouldn't be accessing private variables.
var objects = unarchiver._objects,
count = [objects count];
// The order in which objects receive the awakeFromCib message is not guaranteed.
while (count--)
{
var object = objects[count];
if ([object respondsToSelector:@selector(awakeFromCib)])
[object awakeFromCib];
}
var topLevelObjects = [anExternalNameTable objectForKey:CPCibTopLevelObjects];
// if ([owner respondsToSelector:@selector(awakeFromCib)])
// [owner awakeFromCib];
// Display visible windows.
return YES;*/
[objectData instantiateWithOwner:owner topLevelObjects:topLevelObjects]
[objectData establishConnectionsWithOwner:owner topLevelObjects:topLevelObjects];
[objectData awakeWithOwner:owner topLevelObjects:topLevelObjects];
// Display Visible Windows.
[objectData displayVisibleWindows];
return YES;
}
- (BOOL)instantiateCibWithOwner:(id)anOwner topLevelObjects:(CPArray)topLevelObjects
{
[CPDictionary dictionaryWithObjectsAndKeys:anOwner, CPCibOwner, topLevelObjects, CPCibTopLevelObjects];
return [self instantiate];
return [self instantiateCibWithExternalNameTable:[CPDictionary dictionaryWithObjectsAndKeys:anOwner, CPCibOwner, topLevelObjects, CPCibTopLevelObjects]];
}
@end
@implementation CPCib (CPURLConnectionDelegate)
- (void)connection:(CPURLConnection)aConnection didReceiveData:(CPString)data
{
_data = [CPData dataWithRawString:data];
}
- (void)connection:(CPURLConnection)aConnection didFailWithError:(CPError)anError
{
alert("cib: connection failed.");
_loadDelegate = nil;
}
- (void)connectionDidFinishLoading:(CPURLConnection)aConnection
{
if ([_loadDelegate respondsToSelector:@selector(cibDidFinishLoading:)])
[_loadDelegate cibDidFinishLoading:self];
_loadDelegate = nil;
}
@end
+88
View File
@@ -0,0 +1,88 @@
/*
* CPCibConnector.j
* AppKit
*
* Created by Francisco Tolmasky.
* Copyright 2008, 280 North, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
@import <Foundation/CPObject.j>
@import <Foundation/CPKeyValueCoding.j>
var _CPCibConnectorSourceKey = @"_CPCibConnectorSourceKey",
_CPCibConnectorDestinationKey = @"_CPCibConnectorDestinationKey",
_CPCibConnectorLabelKey = @"_CPCibConnectorLabelKey";
@implementation CPCibConnector : CPObject
{
id _source @accessors(property=source);
id _destination @accessors(property=destination);
CPString _label @accessors(property=label);
}
- (void)replaceObject:(id)anObject withObject:(id)anotherObject
{
if (_source === anObject)
_source = anotherObject;
if (_destination === anObject)
_destination = anotherObject;
}
- (void)replaceObjects:(Object)replacementObjects
{
var replacement = replacementObjects[[_source UID]];
if (replacement !== undefined)
_source = replacement;
replacement = replacementObjects[[_destination UID]];
if (replacement !== undefined)
_destination = replacement;
}
@end
@implementation CPCibConnector (CPCoding)
- (id)initWithCoder:(CPCoder)aCoder
{
self = [super init];
if (self)
{
_source = [aCoder decodeObjectForKey:_CPCibConnectorSourceKey];
_destination = [aCoder decodeObjectForKey:_CPCibConnectorDestinationKey];
_label = [aCoder decodeObjectForKey:_CPCibConnectorLabelKey];
}
return self;
}
- (void)encodeWithCoder:(CPCoder)aCoder
{
[aCoder encodeObject:_source forKey:_CPCibConnectorSourceKey];
[aCoder encodeObject:_destination forKey:_CPCibConnectorDestinationKey];
[aCoder encodeObject:_label forKey:_CPCibConnectorLabelKey];
}
@end
// For backwards compatibility.
@implementation _CPCibConnector : CPCibConnector { } @end
+76
View File
@@ -0,0 +1,76 @@
/*
* CPCibControlConnector.j
* AppKit
*
* Created by Francisco Tolmasky.
* Copyright 2008, 280 North, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
@import "CPCibConnector.j"
@implementation CPCibControlConnector : CPCibConnector
{
}
- (void)establishConnection
{
var selectorName = _label,
selectorNameLength = [selectorName length];
if (selectorNameLength && selectorName.charAt(selectorNameLength - 1) !== ':')
selectorName += ':';
var selector = CPSelectorFromString(selectorName);
// Not having a selector is a fatal error.
if (!selector)
[CPException
raise:CPInvalidArgumentException
reason:@"-[" + [self className] + ' ' + _cmd + @"] selector " + selectorName + @" does not exist."];
// If the destination doesn't respond to this selector, warn but don't die.
if (_destination && ![_destination respondsToSelector:selector])
{
CPLog.warn(@"Could not connect the action " + selector + @" to target of class " + [_destination className]);
return;
}
// Not being able to set the action is a fatal error.
if ([_source respondsToSelector:@selector(setAction:)])
objj_msgSend(_source, @selector(setAction:), selector);
else
[CPException
raise:CPInvalidArgumentException
reason:@"-[" + [self className] + ' ' + _cmd + @"] " + [_source description] + " does not respond to setAction:"];
// Not being able to set the target is a fatal error.
if ([_source respondsToSelector:@selector(setTarget:)])
objj_msgSend(_source, @selector(setTarget:), _destination);
else
[CPException
raise:CPInvalidArgumentException
reason:@"-[" + [self className] + ' ' + _cmd + @"] " + [_source description] + " does not respond to setTarget:"];
}
@end
@implementation _CPCibControlConnector : CPCibControlConnector { } @end
+121
View File
@@ -0,0 +1,121 @@
/*
* _CPCibLoading.j
* AppKit
*
* Created by Francisco Tolmasky.
* Copyright 2008, 280 North, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
@import <Foundation/CPBundle.j>
@import <Foundation/CPDictionary.j>
@import <Foundation/CPString.j>
var CPCibOwner = @"CPCibOwner";
@implementation CPObject (CPCibLoading)
- (void)awakeFromCib
{
}
@end
@implementation CPBundle (CPCibLoading)
+ (void)loadCibFile:(CPString)anAbsolutePath externalNameTable:(CPDictionary)aNameTable
{
[[[CPCib alloc] initWithContentsOfURL:anAbsolutePath] instantiateCibWithExternalNameTable:aNameTable];
}
+ (void)loadCibNamed:(CPString)aName owner:(id)anOwner
{
if (![aName hasSuffix:@".cib"])
aName = [aName stringByAppendingString:@".cib"];
// Path is based solely on anOwner:
var bundle = anOwner ? [CPBundle bundleForClass:[anOwner class]] : [CPBundle mainBundle],
path = [bundle pathForResource:aName];
[self loadCibFile:path externalNameTable:[CPDictionary dictionaryWithObject:anOwner forKey:CPCibOwner]];
}
- (void)loadCibFile:(CPString)aFileName externalNameTable:(CPDictionary)aNameTable
{
[[[CPCib alloc] initWithContentsOfURL:aFileName] instantiateCibWithExternalNameTable:aNameTable];
}
+ (void)loadCibFile:(CPString)anAbsolutePath externalNameTable:(CPDictionary)aNameTable loadDelegate:aDelegate
{
[[CPCib alloc]
initWithContentsOfURL:anAbsolutePath
loadDelegate:[[_CPCibLoadDelegate alloc]
initWithLoadDelegate:aDelegate
externalNameTable:aNameTable]];
}
+ (void)loadCibNamed:(CPString)aName owner:(id)anOwner loadDelegate:(id)aDelegate
{
if (![aName hasSuffix:@".cib"])
aName = [aName stringByAppendingString:@".cib"];
// Path is based solely on anOwner:
var bundle = anOwner ? [CPBundle bundleForClass:[anOwner class]] : [CPBundle mainBundle],
path = [bundle pathForResource:aName];
[self loadCibFile:path externalNameTable:[CPDictionary dictionaryWithObject:anOwner forKey:CPCibOwner] loadDelegate:aDelegate];
}
- (void)loadCibFile:(CPString)aFileName externalNameTable:(CPDictionary)aNameTable loadDelegate:(id)aDelegate
{
[[CPCib alloc]
initWithCibNamed:aFileName
bundle:self
loadDelegate:[[_CPCibLoadDelegate alloc]
initWithLoadDelegate:aDelegate
externalNameTable:aNameTable]];
}
@end
@implementation _CPCibLoadDelegate : CPObject
{
id _loadDelegate;
CPDictionary _externalNameTable;
}
- (id)initWithLoadDelegate:(id)aLoadDelegate externalNameTable:(id)anExternalNameTable
{
self = [self init];
if (self)
{
_loadDelegate = aLoadDelegate;
_externalNameTable = anExternalNameTable;
}
return self;
}
- (void)cibDidFinishLoading:(CPCib)aCib
{
[aCib instantiateCibWithExternalNameTable:_externalNameTable];
[_loadDelegate cibDidFinishLoading:aCib];
}
@end
+48
View File
@@ -0,0 +1,48 @@
/*
* CPCibOutletConnector.j
* AppKit
*
* Created by Francisco Tolmasky.
* Copyright 2008, 280 North, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
@import "CPCibConnector.j"
@implementation CPCibOutletConnector : CPCibConnector
{
}
- (void)establishConnection
{
try
{
[_source setValue:_destination forKey:_label];
}
catch (anException)
{
if ([anException name] === CPUndefinedKeyException)
CPLog.warn(@"Could not connect the outlet " + _label + @" of target of class " + [_source className]);
else
throw anException;
}
}
@end
@implementation _CPCibOutletConnector : CPCibOutletConnector { } @end
+76
View File
@@ -0,0 +1,76 @@
/*
* _CPCibClassSwapper.j
* AppKit
*
* Created by Francisco Tolmasky.
* Copyright 2009, 280 North, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
@import <Foundation/CPObject.j>
@import <Foundation/CPString.j>
var _CPCibClassSwapperClassNameKey = @"_CPCibClassSwapperClassNameKey",
_CPCibClassSwapperOriginalClassNameKey = @"_CPCibClassSwapperOriginalClassNameKey";
@implementation _CPCibClassSwapper : CPObject
{
}
+ (void)allocObjectWithCoder:(CPCoder)aCoder className:(CPString)aClassName
{
// FIXME: Also check class classForClassName:
var theClass = [aCoder classForClassName:aClassName];
if (!theClass)
{
theClass = objj_lookUpClass(aClassName);
if (!theClass)
return nil;
}
return [theClass alloc];
}
+ (id)allocWithCoder:(CPCoder)aCoder
{
if ([aCoder respondsToSelector:@selector(usesOriginalClasses)] && [aCoder usesOriginalClasses])
{
var theClassName = [aCoder decodeObjectForKey:_CPCibClassSwapperOriginalClassNameKey],
object = [self allocObjectWithCoder:aCoder className:theClassName];
}
else
{
var theClassName = [aCoder decodeObjectForKey:_CPCibClassSwapperClassNameKey],
object = [self allocObjectWithCoder:aCoder className:theClassName];
if (!object)
{
CPLog.error("Unable to find class " + theClassName + " in cib file.");
object = [self allocObjectWithCoder:aCoder className:[aCoder decodeObjectForKey:_CPCibClassSwapperOriginalClassNameKey]];
}
}
if (!object)
[CPException raise:CPInvalidArgumentException reason:@"Unable to find class " + theClassName + " in cib file."];
return object;
}
@end
-112
View File
@@ -1,112 +0,0 @@
import <Foundation/CPObject.j>
import <Foundation/CPKeyValueCoding.j>
var _CPCibConnectorSourceKey = @"_CPCibConnectorSourceKey",
_CPCibConnectorDestinationKey = @"_CPCibConnectorDestinationKey",
_CPCibConnectorLabelKey = @"_CPCibConnectorLabelKey";
@implementation _CPCibConnector : CPObject
{
id _source;
id _destination;
CPString _label;
}
- (void)replaceObject:(id)anObject withObject:(id)anotherObject
{
if (_source == anObject)
_source = anotherObject;
else if (_destination == anObject)
_destination = anotherObject;
}
@end
@implementation _CPCibConnector (CPCoding)
- (id)initWithCoder:(CPCoder)aCoder
{
self = [super init];
if (self)
{
_source = [aCoder decodeObjectForKey:_CPCibConnectorSourceKey];
_destination = [aCoder decodeObjectForKey:_CPCibConnectorDestinationKey];
_label = [aCoder decodeObjectForKey:_CPCibConnectorLabelKey];
#if DEBUG
CPLog("Connection from " + [_source description] + " to " + [_destination description] + " and label " + _label + " decoded.");
#endif
}
return self;
}
- (void)encodeWithCoder:(CPCoder)aCoder
{
[aCoder encodeObject:_source forKey:_CPCibConnectorSourceKey];
[aCoder encodeObject:_destination forKey:_CPCibConnectorDestinationKey];
[aCoder encodeObject:_label forKey:_CPCibConnectorLabelKey];
}
@end
@implementation _CPCibControlConnector : _CPCibConnector
{
}
- (void)establishConnection
{
#if DEBUG
CPLog('[' + [_source description] + " setTarget: " + [_destination description] + ']');
CPLog('[' + [_source description] + " setAction: " + _label + ']');
#endif
var selectorName = _label;
if (![selectorName hasSuffix:@":"])
selectorName += ':';
var selector = CPSelectorFromString(selectorName);
if (!selector)
[CPException
raise:CPInvalidArgumentException
reason:@"-[" + [self className] + ' ' + _cmd + @"] selector " + selectorName + @" does not exist."];
if ([_source respondsToSelector:@selector(setAction:)])
objj_msgSend(_source, @selector(setAction:), selector);
else
[CPException
raise:CPInvalidArgumentException
reason:@"-[" + [self className] + ' ' + _cmd + @"] " + [_source description] + " does not respond to setAction:"];
if ([_source respondsToSelector:@selector(setTarget:)])
objj_msgSend(_source, @selector(setTarget:), _destination);
else
[CPException
raise:CPInvalidArgumentException
reason:@"-[" + [self className] + ' ' + _cmd + @"] " + [_source description] + " does not respond to setTarget:"];
}
@end
@implementation _CPCibOutletConnector : _CPCibConnector
{
}
- (void)establishConnection
{
#if DEBUG
CPLog([_source description] + " setValue: " + [_destination description] + " forKey: " + _label);
#endif
[_source setValue:_destination forKey:_label];
}
@end
+33 -2
View File
@@ -1,5 +1,5 @@
import <Foundation/CPObject.j>
@import <Foundation/CPObject.j>
var _CPCibCustomObjectClassName = @"_CPCibCustomObjectClassName";
@@ -9,6 +9,21 @@ var _CPCibCustomObjectClassName = @"_CPCibCustomObjectClassName";
CPString _className;
}
- (CPString)customClassName
{
return _className;
}
- (void)setCustomClassName:(CPString)aClassName
{
_className = aClassName;
}
- (CPString)description
{
return [super description] + " (" + [self customClassName] + ')';
}
@end
@implementation _CPCibCustomObject (CPCoding)
@@ -31,9 +46,25 @@ var _CPCibCustomObjectClassName = @"_CPCibCustomObjectClassName";
- (id)_cibInstantiate
{
var theClass = CPClassFromString(_className);
// Hey this is us!
if (theClass === [self class])
{
_className = @"CPObject";
return self;
}
if (!theClass)
{
#if DEBUG
CPLog("Unknown class \"" + _className + "\" in cib file");
#endif
theClass = [CPObject class];
}
if (theClass === [CPApplication class])
return [CPApplication sharedApplication];
return [[theClass alloc] init];
}
+115
View File
@@ -0,0 +1,115 @@
/*
* _CPCibCustomResource.j
* AppKit
*
* Portions based on NSCustomResource.m (01/08/2009) in Cocotron (http://www.cocotron.org/)
* Copyright (c) 2006-2007 Christopher J. W. Lloyd
*
* Created by Francisco Tolmasky.
* Copyright 2009, 280 North, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
@import <Foundation/CPObject.j>
@import <Foundation/CPString.j>
var _CPCibCustomResourceClassNameKey = @"_CPCibCustomResourceClassNameKey",
_CPCibCustomResourceResourceNameKey = @"_CPCibCustomResourceResourceNameKey",
_CPCibCustomResourcePropertiesKey = @"_CPCibCustomResourcePropertiesKey";
@implementation _CPCibCustomResource : CPObject
{
CPString _className;
CPString _resourceName;
CPDictionary _properties;
}
+ (id)imageResourceWithName:(CPString)aResourceName size:(CGSize)aSize
{
return [[self alloc] initWithClassName:@"CPImage" resourceName:aResourceName properties:[CPDictionary dictionaryWithObject:aSize forKey:@"size"]];
}
- (id)initWithClassName:(CPString)aClassName resourceName:(CPString)aResourceName properties:(CPDictionary)properties
{
self = [super init];
if (self)
{
_className = aClassName;
_resourceName = aResourceName;
_properties = properties;
}
return self;
}
- (id)initWithCoder:(CPCoder)aCoder
{
self = [super init];
if (self)
{
_className = [aCoder decodeObjectForKey:_CPCibCustomResourceClassNameKey];
_resourceName = [aCoder decodeObjectForKey:_CPCibCustomResourceResourceNameKey];
_properties = [aCoder decodeObjectForKey:_CPCibCustomResourcePropertiesKey];
}
return self;
}
- (void)encodeWithCoder:(CPCoder)aCoder
{
[aCoder encodeObject:_className forKey:_CPCibCustomResourceClassNameKey];
[aCoder encodeObject:_resourceName forKey:_CPCibCustomResourceResourceNameKey];
[aCoder encodeObject:_properties forKey:_CPCibCustomResourcePropertiesKey];
}
- (id)awakeAfterUsingCoder:(CPCoder)aCoder
{
if ([aCoder respondsToSelector:@selector(bundle)] &&
(![aCoder respondsToSelector:@selector(awakenCustomResources)] || [aCoder awakenCustomResources]))
if (_className === @"CPImage")
return [[CPImage alloc] initWithContentsOfFile:[[aCoder bundle] pathForResource:_resourceName] size:_properties.valueForKey(@"size")];
return self;
}
@end
@implementation _CPCibCustomResource (CPImage)
- (CPString)filename
{
return [[CPBundle mainBundle] pathForResource:_resourceName];
}
- (CGSize)size
{
return [_properties objectForKey:@"size"];
}
- (BOOL)isThreePartImage
{
return NO;
}
- (BOOL)isNinePartImage
{
return NO;
}
@end

Some files were not shown because too many files have changed in this diff Show More