Comparar commits
2107 Commits
| Autor | SHA1 | Data | |
|---|---|---|---|
| 296e89e7c6 | |||
| e52c4255d9 | |||
| a0eaa3fb95 | |||
| bf870bb9e3 | |||
| 8d4aa48713 | |||
| 21d459bb55 | |||
| 05210b2332 | |||
| 942380eadd | |||
| e0ff9cd8d3 | |||
| 3470e24b46 | |||
| ab513b62a0 | |||
| da6c521e1c | |||
| 5115f143ce | |||
| 64466deb5e | |||
| d8638912f0 | |||
| 87c582ce23 | |||
| 9f1361b533 | |||
| 323a913bf6 | |||
| deff187509 | |||
| cfbe750615 | |||
| 32447ce488 | |||
| 27c7d3ad49 | |||
| 9340b94e63 | |||
| d7bb1e189f | |||
| 6cd4216336 | |||
| bbef9fa6ab | |||
| 28fc8ce789 | |||
| 8508354adc | |||
| 6d8bf1eaf4 | |||
| d498bd9493 | |||
| c490fc9101 | |||
| 05348f6c26 | |||
| bfc02645a0 | |||
| 46238caafb | |||
| 2a756c628a | |||
| 56eb5c7d4a | |||
| 1bd0db1148 | |||
| dc013ea124 | |||
| 34d87fd98f | |||
| 71631fb543 | |||
| 4934eb644b | |||
| f3e7ede297 | |||
| 2c0d097389 | |||
| e3aa9cd1a2 | |||
| d84910a762 | |||
| 2c16197d0f | |||
| 2e4c4349dd | |||
| 5d4e9b14fd | |||
| feecc7fd1e | |||
| 3f23dc3ffb | |||
| 5ce1658269 | |||
| 75a532b088 | |||
| 8aa8a2e090 | |||
| 4836f05059 | |||
| ed35e7b973 | |||
| 4e4dbda6f0 | |||
| 6756267f48 | |||
| 87200e8006 | |||
| 35c743df72 | |||
| c94c3b9ee0 | |||
| 1d0988127d | |||
| e736b45a35 | |||
| e67a50c904 | |||
| 6f37195ce2 | |||
| 9785311050 | |||
| ed5dac53cc | |||
| 6b25643334 | |||
| 667fdd1e32 | |||
| a0c486f826 | |||
| a41d97d9e8 | |||
| 30b64fb78c | |||
| f277c9dce2 | |||
| c7dcf61bb6 | |||
| 438d1313fc | |||
| e465dca4ce | |||
| 99bd756eab | |||
| b2e16d4f6c | |||
| 6f13f2e6d9 | |||
| f5d7955f41 | |||
| 0aab1f52a5 | |||
| 8dd1592f70 | |||
| eaf9e25461 | |||
| deb7cc68f4 | |||
| 5b3a782ab7 | |||
| 66fcd236cf | |||
| 487dab42de | |||
| bb27c09164 | |||
| f6ceaf3355 | |||
| cb8f9dd7df | |||
| 395bffcf72 | |||
| 35cc5e2e31 | |||
| 4df5e827a7 | |||
| 8de77d3df3 | |||
| 8a4a7e1b1a | |||
| 7dc7547271 | |||
| 4ee5e0efec | |||
| e79f6e0e04 | |||
| 9de200502a | |||
| 57197d3cc8 | |||
| e4a1158b50 | |||
| 23a7cbaf11 | |||
| 21765f9a9c | |||
| bc0b30fec5 | |||
| 6883010c0f | |||
| 3fc7603da8 | |||
| 79c3521c94 | |||
| 1d6fa14851 | |||
| ddecf09700 | |||
| e9d3793b61 | |||
| 5ec1f87113 | |||
| f35fe81b40 | |||
| 4d0f5ab5d5 | |||
| 919a31f16e | |||
| 938ee0ddd8 | |||
| 4f9260b35e | |||
| 6e0690aa70 | |||
| 854165453a | |||
| 04d74c8ba5 | |||
| 0ddf39c979 | |||
| 842904ad44 | |||
| 20b582e97b | |||
| 2553a95c95 | |||
| f989080691 | |||
| 02230ef692 | |||
| d8d9c62de1 | |||
| c1ac91e00f | |||
| 4f1f03346f | |||
| 8c9e2e67ef | |||
| 2c32c5596e | |||
| af8c85428d | |||
| 2bb0ac91d1 | |||
| 8f24f1d82a | |||
| 6762c42a18 | |||
| f1903d903c | |||
| 2ee9962838 | |||
| 9f4155a150 | |||
| 44f6e5ab76 | |||
| b10c508a6b | |||
| 70f3c4757f | |||
| 15b2df4acf | |||
| 3157243deb | |||
| 95526ab823 | |||
| cf6b5e4dce | |||
| 4b245b9053 | |||
| 923cd5a937 | |||
| 342afd7221 | |||
| 91a9bd6ab3 | |||
| b980a28c91 | |||
| 9b7ba38dc2 | |||
| 08157deece | |||
| c7e7e2bcdc | |||
| 01ab778621 | |||
| 312de23e5e | |||
| 792c5374d7 | |||
| 34dea52d6c | |||
| 6f3703d00b | |||
| cbd4b46f9f | |||
| ff1109389c | |||
| c31e9cdebf | |||
| 97449288eb | |||
| 9c2aebcf3c | |||
| 54c1851db5 | |||
| f1d0a9b688 | |||
| d62a8abb24 | |||
| 3f182664be | |||
| 6f362b53c3 | |||
| 617420eaf9 | |||
| e0d2079802 | |||
| 897b318324 | |||
| 1737d6addb | |||
| 418a53806c | |||
| 79272c76a5 | |||
| d0936b0189 | |||
| 8db46b4c1a | |||
| c6a88f3b7f | |||
| 2fb4c9b683 | |||
| 766db7a318 | |||
| e8d4a3e6c0 | |||
| 9ac8de0f5d | |||
| fed3b9f432 | |||
| 327b429d79 | |||
| 55cca7220a | |||
| 3e55136c6a | |||
| 2d7971a429 | |||
| acf06d725f | |||
| e5dcc56056 | |||
| ce96234b72 | |||
| 3b8fe3b011 | |||
| 82561550e8 | |||
| 631920d41e | |||
| 6021064040 | |||
| 0547a9c3e2 | |||
| a1fe8ce22c | |||
| 5e56b8565a | |||
| 16d4db1790 | |||
| 32442cd2c4 | |||
| 2ac6c86266 | |||
| 5664101490 | |||
| d2dda4abb6 | |||
| 1f878f01f7 | |||
| bf28737ebd | |||
| 7fb2c1b041 | |||
| 4f3dcfdf4b | |||
| 13b2d7c0c1 | |||
| 2239bdfdfd | |||
| c6151c3775 | |||
| 0387196f85 | |||
| c7e7798979 | |||
| aa80c8d19f | |||
| 02d5f47380 | |||
| 75f3ed2d5a | |||
| 4e5afb4940 | |||
| 85793114d4 | |||
| 708e76473a | |||
| 2b8773a8f0 | |||
| 962ae7998e | |||
| 8f199788a5 | |||
| caaddd1179 | |||
| 3704b23a71 | |||
| c596f9f7d5 | |||
| f6208e71f4 | |||
| 85a3cda5c8 | |||
| 6c591c38d9 | |||
| 15aac21e2b | |||
| e0441a356d | |||
| f3da8161aa | |||
| 609e3e459b | |||
| 8638bb57f9 | |||
| d11084ce0d | |||
| 1ae335c7da | |||
| 99529821b4 | |||
| d551e656cb | |||
| ba49b166fb | |||
| a3e002c1db | |||
| 02601e4f7c | |||
| e2349e4bf6 | |||
| 87afaf44f7 | |||
| bb913b171d | |||
| 975063a28f | |||
| 8e44c82096 | |||
| 7a33f0b43e | |||
| cfdf20f4b7 | |||
| 13207caab6 | |||
| 980b86e2c5 | |||
| c6afe5f73d | |||
| 5c48942bda | |||
| 82c032329a | |||
| 2a2bdbe60c | |||
| 9414757638 | |||
| 253dc5abae | |||
| 296185c0ba | |||
| 70cff3e17a | |||
| 78969b8050 | |||
| d90f6e3346 | |||
| 8f99db35dd | |||
| b5759955d5 | |||
| adafa3b2c4 | |||
| 979f43da07 | |||
| 528036e9e3 | |||
| 39aebf1d0b | |||
| 45df2eb8f5 | |||
| 7ae490a393 | |||
| 4c114f7796 | |||
| 92aa443023 | |||
| 1492546150 | |||
| 95c7be884f | |||
| 00acbd664e | |||
| e7b4a2d5ec | |||
| d7448ad16c | |||
| 7d8afba0f4 | |||
| 0f1bdc87d4 | |||
| d4ed7ea34f | |||
| daf8d5ef89 | |||
| 3ba1fd0975 | |||
| a3cdb5a90d | |||
| c6c99b8b98 | |||
| fffe7926da | |||
| 285e5305cb | |||
| b9fa73ce7a | |||
| d5669d2ae4 | |||
| 3db7fc10ec | |||
| 7a0ec5b1df | |||
| 8e99313ea4 | |||
| 8e8aba6ffb | |||
| f903aa926d | |||
| 3848e55813 | |||
| 55778824f3 | |||
| 5b240371d9 | |||
| d65432a014 | |||
| 107d7fa43e | |||
| bf19830d66 | |||
| 090b248708 | |||
| e5855c2fa1 | |||
| 064785b985 | |||
| 757446c64e | |||
| 14e69d1501 | |||
| 874caccc53 | |||
| 295aaa4c31 | |||
| dbd45ddf90 | |||
| 2f2289c9df | |||
| 9b7dddfe0c | |||
| 21a468a125 | |||
| de82d964ca | |||
| d843968432 | |||
| f4958ee8f9 | |||
| 1ed65484e0 | |||
| 8c1e1c2d2e | |||
| c888d6e86a | |||
| a9ef0e6aca | |||
| 35b409dce8 | |||
| 16f3f9310e | |||
| 5206982e48 | |||
| 8e9e3b45b6 | |||
| f96eddc6ca | |||
| b2dc918313 | |||
| d511e9f0e5 | |||
| ed93f9833e | |||
| 4b34601dc3 | |||
| c7142dc82c | |||
| 9914826b57 | |||
| d2159d70e3 | |||
| 6a06656c16 | |||
| b1aa24d911 | |||
| 198cb1f9df | |||
| 3fa90d76f5 | |||
| bfea982d45 | |||
| 78d70e760e | |||
| 4b9632c4ee | |||
| 6c9708070c | |||
| b7a299f42a | |||
| e35977776d | |||
| 25d1b110a3 | |||
| 38b796a516 | |||
| 136653a644 | |||
| 1af1000139 | |||
| 5db3b42770 | |||
| 6b552cc03d | |||
| 19d7775e91 | |||
| 299b0a9517 | |||
| 075efa649d | |||
| b4f0f21421 | |||
| dbeda7f67d | |||
| ea56252d2f | |||
| 8d376755dc | |||
| 5d8243ec3b | |||
| 85e962c124 | |||
| 97403354a2 | |||
| 605dfcbd33 | |||
| 3f6441c420 | |||
| 885586188c | |||
| a517ca68e9 | |||
| 4f84e1b325 | |||
| 5857cf7c49 | |||
| 52bec37a5b | |||
| 48b584d979 | |||
| 6d2658d888 | |||
| 48df3d3cd2 | |||
| d58add66d4 | |||
| 5ac33562cf | |||
| 483223546b | |||
| 3a795a4483 | |||
| 3e0ee7eced | |||
| 721a080af9 | |||
| e8dd1564d5 | |||
| 6b923bcf0c | |||
| 889d2bbb11 | |||
| d53bbd32a9 | |||
| 467ab4ec17 | |||
| 900a68eb63 | |||
| 638135f309 | |||
| 3a94cbf242 | |||
| 8326d791bf | |||
| a676e3acaa | |||
| 8a5265c1dd | |||
| cab106167c | |||
| 6fc42f59e1 | |||
| d0995f3bc2 | |||
| 8ed4def1f3 | |||
| bf0ab0ea55 | |||
| d4a33cbc58 | |||
| 18cd75b130 | |||
| 4b2c411a2e | |||
| b33ac764b4 | |||
| 0edd935144 | |||
| 839be7862e | |||
| 3cfb7df151 | |||
| 3364dfcc2a | |||
| 818f7fa5d6 | |||
| 8bb128062a | |||
| f576184c13 | |||
| 7d57612d7d | |||
| c94e9ff4b7 | |||
| 0a8a67ca5f | |||
| dac9dc4742 | |||
| bf91b32d25 | |||
| 16e6031999 | |||
| a4ee620aaf | |||
| 2c18ec2b75 | |||
| f0080de225 | |||
| e176d09eac | |||
| 9ff14b0a90 | |||
| 1b234b6c3b | |||
| 84cfea1ac0 | |||
| 85d8d08972 | |||
| 5cf120de75 | |||
| bdf38eaf8e | |||
| 3823533c17 | |||
| fecaf92ec1 | |||
| d7ed79ea07 | |||
| 830dc666ad | |||
| 68010b6752 | |||
| b7951759ec | |||
| ead2c70a1a | |||
| e0016e875f | |||
| d74598979a | |||
| 24f60158d4 | |||
| 910642248d | |||
| b26402bd57 | |||
| 6166a169e3 | |||
| bf1579a5dc | |||
| 2a51bbfba5 | |||
| d8e8889d92 | |||
| 6fdb21414d | |||
| 6178c5c6a0 | |||
| e7b0c5d05d | |||
| 1140b4eed2 | |||
| 99613775b1 | |||
| 13c1a17018 | |||
| e51a82e19d | |||
| 5180a7e092 | |||
| d56c74724c | |||
| 27e9f0f005 | |||
| 832845535a | |||
| fcf1f5c283 | |||
| 47d1f3cc89 | |||
| 58b89ebc55 | |||
| a2bfccb15b | |||
| 7904663f14 | |||
| bbc1d4b432 | |||
| 69fbc85665 | |||
| 65a246f39b | |||
| 0d9bd6d96b | |||
| ed58f42176 | |||
| e00752087b | |||
| 626bf14b2d | |||
| 683e7351f0 | |||
| 5242a7d826 | |||
| f3a384f011 | |||
| 5267a6ddde | |||
| a9f757f39c | |||
| af1ef9330f | |||
| cf58970bdf | |||
| 4595abcebe | |||
| 4b73c277fa | |||
| 9f80a92973 | |||
| b4091b4f45 | |||
| cb714b9f8b | |||
| 0769a8e597 | |||
| 846cbb3c96 | |||
| e6d7829ca2 | |||
| 404cf22380 | |||
| 6c75db5003 | |||
| 71a8ecfd27 | |||
| 2582708b2f | |||
| 5587a8fadc | |||
| 22cb28ec50 | |||
| c4d9966709 | |||
| c69d03a74b | |||
| 38643d974b | |||
| 00308279df | |||
| 896f4b8b85 | |||
| ae1bafb39b | |||
| 3e2e7ffec7 | |||
| 46bc91fc63 | |||
| fb9e4c6262 | |||
| aa043c73e7 | |||
| 68ed3e521e | |||
| b6b3a51d32 | |||
| 7573196742 | |||
| b2e16a0ca5 | |||
| 53809b3c38 | |||
| 2549728a97 | |||
| 06fde953b1 | |||
| 21b9287cfd | |||
| eeeed87239 | |||
| 97e50d7a35 | |||
| f0195711b5 | |||
| 68ba4117f6 | |||
| dbd584d305 | |||
| e69d7fa485 | |||
| cdb4797fa3 | |||
| bd4207dfa4 | |||
| c9493636a9 | |||
| e6d76b9bc8 | |||
| 49868b8203 | |||
| 528e1bcbe9 | |||
| f0fd47dbdb | |||
| e1c2632941 | |||
| ef19ab440b | |||
| 75bb17e11f | |||
| 2c2f4bee15 | |||
| 58696f0c2c | |||
| 4130e11693 | |||
| 19de232dd2 | |||
| afb3fb6ab1 | |||
| 4dda1bcdd1 | |||
| c665f2ccb9 | |||
| 1f01a50e09 | |||
| 9cc0ce3148 | |||
| bd0425966f | |||
| 7089c83878 | |||
| 9511c34c54 | |||
| c6e9d44c7d | |||
| 3d051ecbb5 | |||
| f0ae20f0b6 | |||
| 2c83e4c22b | |||
| 07eaffd28f | |||
| 8c1f995e4e | |||
| f721075ac3 | |||
| da711cc76b | |||
| d9fb94a13d | |||
| 9da1b4528d | |||
| 768ea368a6 | |||
| 6ff34c29db | |||
| acdfd6ea20 | |||
| b9bf45ecce | |||
| b5df2c589a | |||
| dff973e9ee | |||
| 4a0644f3cd | |||
| f8d521999c | |||
| be0e5b51cd | |||
| f10c45b1f8 | |||
| 6d608dd49b | |||
| 70658a0279 | |||
| f3ceebecfd | |||
| 251eae5cac | |||
| 07b88af439 | |||
| 959616e992 | |||
| f7b2f910b7 | |||
| 4220566fb4 | |||
| 415179f9b7 | |||
| 9a9f8cbd99 | |||
| 319f6e9047 | |||
| 9b7d02618e | |||
| ed2f4d3b05 | |||
| fef81ce17f | |||
| 1942640b2d | |||
| d8232c9122 | |||
| 1a8b3b55d8 | |||
| 156d2015a5 | |||
| 8cbbb1eec8 | |||
| 351d68faf6 | |||
| 6d0651acbc | |||
| 7bd83c65f9 | |||
| dfe8862e0f | |||
| e89e70c9a6 | |||
| 8f06411357 | |||
| 011a2eaed7 | |||
| f29b2f5c51 | |||
| 1a9d2daef3 | |||
| 662f961d91 | |||
| 7e06d1ab81 | |||
| 6a22e39d4c | |||
| ff27aaffe3 | |||
| 601f1026eb | |||
| bdf59518fb | |||
| 3f7e52a4d9 | |||
| 8da7dc2e56 | |||
| b1cda9cd72 | |||
| 811d025b88 | |||
| c7e96bd3c0 | |||
| bc67864e57 | |||
| 96a4450d70 | |||
| 8591ebd55f | |||
| 16b6d591d5 | |||
| 5e3e485d4d | |||
| f7bd979d1b | |||
| 176b44fd65 | |||
| 548714343a | |||
| 8ce6297b97 | |||
| 52897e2693 | |||
| d5582d6181 | |||
| d9868285a0 | |||
| 429bed5aba | |||
| 3442e07023 | |||
| fef7e3786e | |||
| e77f69908a | |||
| c2be88fd9c | |||
| 85f8c409de | |||
| ad442d822d | |||
| bbfc36e8c6 | |||
| 136dbaa257 | |||
| b6215a24b5 | |||
| c62b73bdf5 | |||
| 2832feaa8e | |||
| f90fd1288b | |||
| 2e27312ea0 | |||
| f2b6eb5e7a | |||
| 24439832da | |||
| 89c1f7fa4c | |||
| b78eef7789 | |||
| aaa7fd0123 | |||
| 8b17879219 | |||
| 6ab495c8eb | |||
| 03be32b103 | |||
| 4218a07549 | |||
| 17a26e7dbc | |||
| 580dd76041 | |||
| 74ae45c476 | |||
| d6d99a9b6b | |||
| 3854e50e64 | |||
| a8966e8dcf | |||
| 98c7993a41 | |||
| 662763fdcc | |||
| 47211510b0 | |||
| 997ff2e7ed | |||
| 32d19f0a61 | |||
| a5ce77f5c4 | |||
| 464e03172f | |||
| d9ad71341c | |||
| 4eedc67bf0 | |||
| c96712eadc | |||
| 3b2fd06dc0 | |||
| 296b97d58a | |||
| 363db04779 | |||
| 13f2419f33 | |||
| ec9868b85b | |||
| a31faf3026 | |||
| e1fda6694b | |||
| 2fb117023b | |||
| d2a70dac78 | |||
| 18218163fd | |||
| fccab0ac15 | |||
| 02a01db39a | |||
| bd950aa654 | |||
| 32758ee8e2 | |||
| 0c79114d30 | |||
| 43b426410d | |||
| 26de4b0dd0 | |||
| 58243488fc | |||
| 489b5ddde1 | |||
| 0d0d36d599 | |||
| 2d454fb7dc | |||
| 5097ed533f | |||
| 160dee7d84 | |||
| 7395736b9f | |||
| b64c489135 | |||
| fffc3f0f7c | |||
| 5dd4e0c846 | |||
| e32ae1cae6 | |||
| 8771dce348 | |||
| 3ac6f75611 | |||
| f88d243071 | |||
| feb7b88279 | |||
| 070b47e825 | |||
| c1289c07be | |||
| e68fd9dfaf | |||
| f23a4bf9d5 | |||
| b769daec0c | |||
| 4e36f71f3a | |||
| 25db8ccfa7 | |||
| 5c2923c0af | |||
| 018ad7f2c0 | |||
| c1a7fd7267 | |||
| 3c086de42c | |||
| b48390fc1e | |||
| 136fe02333 | |||
| 5f9d100b2d | |||
| 176f3f32d4 | |||
| 2667202a3f | |||
| 245eb88b40 | |||
| d51479c357 | |||
| 7a583b1aaa | |||
| eaff9bd176 | |||
| da4d941906 | |||
| ed94e60da3 | |||
| 2fe6c956b4 | |||
| 559c7d7f13 | |||
| 6b7f2eeadb | |||
| 7bda1b3d0e | |||
| d516b01c75 | |||
| 08c579f0cb | |||
| c231069066 | |||
| ec16947808 | |||
| 2d61573175 | |||
| 507c065c0e | |||
| cf6b6299e0 | |||
| 862a746170 | |||
| 14717ce21f | |||
| 72aade4f8f | |||
| fbf75539f9 | |||
| 879402d020 | |||
| 7296f2213d | |||
| fb243c6cf5 | |||
| 20d1a720ce | |||
| ea12e0755b | |||
| 83cc22a24c | |||
| c795c80439 | |||
| edab625da6 | |||
| 9f9240391b | |||
| 4fbbc6b42a | |||
| cdbc379608 | |||
| bfeac30452 | |||
| 2e7d188afa | |||
| d291bd52cd | |||
| d8e8fd09a6 | |||
| d66471e4c0 | |||
| bb7d364f45 | |||
| f9f8474e7f | |||
| e2cac3a280 | |||
| d6b5c2c797 | |||
| c0e51cb47f | |||
| 03f054b474 | |||
| 511676e0e9 | |||
| 94ac8af162 | |||
| a814936bd7 | |||
| e42b2ca09d | |||
| 7be159d0c2 | |||
| c53c384096 | |||
| 6a52c22a02 | |||
| 6f30debd34 | |||
| d400921e17 | |||
| e95b37e5de | |||
| b9cc27c1ad | |||
| c8852f7c44 | |||
| 18b0700337 | |||
| 8d535e72c7 | |||
| 2f51fc68cb | |||
| 1f1972bf0e | |||
| e91fbd35c2 | |||
| f46c5ffc2b | |||
| a9f90b508a | |||
| 7dd96c6978 | |||
| 0c888d992b | |||
| 14da21e9f9 | |||
| 019e861539 | |||
| 79d208096b | |||
| 28c4c5fef5 | |||
| 5e211134d5 | |||
| 310e829d70 | |||
| 3d0040a183 | |||
| bbb0501f76 | |||
| 641b7aa3ad | |||
| 1572b12f75 | |||
| 689ddc493f | |||
| cb05293c11 | |||
| d5e2ee902d | |||
| b9995b2ad0 | |||
| bd243519df | |||
| f11614bc27 | |||
| 58a5185c20 | |||
| e92ff82c19 | |||
| c4c07d7878 | |||
| e07ed3082d | |||
| 5728822dad | |||
| fd13022f7c | |||
| 296eaec0e6 | |||
| 8b8672214c | |||
| 2f662bcf6d | |||
| 35f12b7027 | |||
| 719fab1ad2 | |||
| 67ffdd5168 | |||
| afc3fe3687 | |||
| 14dbeda4ed | |||
| f5ee066cc0 | |||
| ad65bcccfb | |||
| fab66d7d49 | |||
| d78c38e4e2 | |||
| 21cecef8ef | |||
| 3e8511fbc6 | |||
| 21863e190d | |||
| fb84300563 | |||
| a8de00b8e5 | |||
| 5fd52be589 | |||
| 6335fef0b1 | |||
| 3455742d89 | |||
| 6ba364f64f | |||
| 164da6cf1c | |||
| 1b6bc6342e | |||
| bde74fdccf | |||
| 6dd612162d | |||
| 2ff4d20fad | |||
| fbcd02ae6e | |||
| 6de51cdf5a | |||
| e97b1df6ee | |||
| 65d68b8d70 | |||
| f915ec7e05 | |||
| 44b4bc0cac | |||
| 2a6ac9a20d | |||
| 076298e343 | |||
| 1c3ab0f80f | |||
| a0ae2836d9 | |||
| 2309762aca | |||
| e4d89f7087 | |||
| 44c41b6faf | |||
| 8003de03ec | |||
| c5ae6a3cbb | |||
| 4581cb2f61 | |||
| 804795c5f8 | |||
| efce3ec30e | |||
| e56835fccc | |||
| 4f495756aa | |||
| 9dce43affa | |||
| 7200f90633 | |||
| 861e4cc3bc | |||
| c2c1f81ea5 | |||
| 14481ee346 | |||
| a92256bc72 | |||
| be42dda63d | |||
| 7313da6156 | |||
| b7d94d6a14 | |||
| 782b11f201 | |||
| aea387ce02 | |||
| 4ddad49369 | |||
| 224f18fef4 | |||
| 2390543445 | |||
| 473d48b39b | |||
| a947dfdac5 | |||
| b83e977839 | |||
| ab2d5a72e7 | |||
| bc5855e900 | |||
| 2c5993d680 | |||
| 2cc7fe3272 | |||
| 958ecde56b | |||
| 0a9a4c926a | |||
| a0b50515e2 | |||
| edf2dacfac | |||
| d65bd51895 | |||
| e0bd677ffc | |||
| c7123cf59b | |||
| 187fcdc2fb | |||
| a064b2a0e1 | |||
| 777406eb7b | |||
| 37f108fa51 | |||
| f0817a3e75 | |||
| 0eb9636bdf | |||
| 3f3872974e | |||
| 99533d2052 | |||
| dce035056a | |||
| 53cb504e90 | |||
| 2162f14786 | |||
| bd7fdf2438 | |||
| cc399eca28 | |||
| adb048c01a | |||
| 738900d840 | |||
| 3755747fda | |||
| 36020c6d33 | |||
| b64e24691b | |||
| a97377bb4a | |||
| b661a7ecbd | |||
| 2f3807d9a4 | |||
| 9932ce345e | |||
| b254399c02 | |||
| 5c08bfcd5c | |||
| fcd4cafe8a | |||
| cd6a1f48c8 | |||
| 2996d99914 | |||
| 785173f106 | |||
| bf66cb55d6 | |||
| 9ce2f894c3 | |||
| 436e842faa | |||
| adf4a382a3 | |||
| d4ba6b3575 | |||
| 6439e36464 | |||
| 57ded8d803 | |||
| aa5fc9b3d8 | |||
| afb3a7cc84 | |||
| e14201201d | |||
| 92b5085dd8 | |||
| 4c814e7700 | |||
| fb6d9e6908 | |||
| 1398a5764b | |||
| e66bea10d4 | |||
| 8ba666dfe0 | |||
| 882bd3dd11 | |||
| 317d41e1df | |||
| 02bd142758 | |||
| 5f2620944f | |||
| 0405f305f9 | |||
| 501dc9054a | |||
| b2c3c585db | |||
| 481010d0b3 | |||
| 4f79bd12e1 | |||
| 0bfd959bcb | |||
| d7845899b4 | |||
| 307bf2600b | |||
| 04f7f25563 | |||
| de33b60d87 | |||
| 6e0914b1c9 | |||
| f7f4b349e9 | |||
| 3c2f3115e0 | |||
| 2df1b3675c | |||
| 76f7b189fa | |||
| 8c2d495e1c | |||
| 42c9dea2c2 | |||
| c52599b6d9 | |||
| ec90593be8 | |||
| 382d0098af | |||
| 4c14dddec3 | |||
| c2ce8be50f | |||
| a7717e5933 | |||
| 9b255071f2 | |||
| 70bb54e13f | |||
| 4461ca926c | |||
| b14ccb8eab | |||
| d873f6f6be | |||
| 7f0d465e98 | |||
| 7855615a9d | |||
| 9889489355 | |||
| 6f7ece8603 | |||
| 5d44e011b9 | |||
| 0a190774b4 | |||
| a09b116a9c | |||
| f351facdf4 | |||
| 2143c18459 | |||
| 8c0df63844 | |||
| 121430dac1 | |||
| 71163d3b9a | |||
| 3c916775ee | |||
| 5ba54ed055 | |||
| bd5b7fb376 | |||
| 05ed5c68bf | |||
| b8dd54f99b | |||
| e20d384f9d | |||
| bd63a56975 | |||
| 1f10720f6e | |||
| 1ef26f6227 | |||
| 7d59645a67 | |||
| 70e7b8f1f9 | |||
| 9e9b898452 | |||
| 00e3608c54 | |||
| af6bd86757 | |||
| 0952ce45c1 | |||
| 040e67b637 | |||
| cd6fe24df5 | |||
| 42d2fb8607 | |||
| 241028bbd8 | |||
| 0c58f7cb59 | |||
| 47887c1d95 | |||
| cbc16d2a48 | |||
| 636b01b95c | |||
| 41683e76bb | |||
| 4030e1c015 | |||
| db6a8e7cda | |||
| dd93afa50e | |||
| 822d49087b | |||
| e463de8cc8 | |||
| 0c060dbaaa | |||
| 0fec165454 | |||
| 504460458c | |||
| 2fba190dde | |||
| b8fb3290b2 | |||
| 2e0c0a670f | |||
| 9473f51d7b | |||
| de857048a2 | |||
| 83ec260e09 | |||
| cbf8b37734 | |||
| e81f46ecf5 | |||
| c2089f5275 | |||
| e9da3c61c1 | |||
| 01ff3f1d86 | |||
| 931deeef94 | |||
| 5caa17a994 | |||
| ecbfaa4b2d | |||
| 0d273fefc6 | |||
| 9c4232b6e2 | |||
| 79c2aaaebb | |||
| 7141c7a612 | |||
| cd420e3e33 | |||
| ef2cc89023 | |||
| 2beeabb17b | |||
| d83dde09a7 | |||
| 3ca38481c7 | |||
| 288a5157be | |||
| f5bde32616 | |||
| bffbc30c3d | |||
| 9ca125ddc4 | |||
| df2721c0ce | |||
| 961e41be26 | |||
| 1332fbbcb0 | |||
| 8325f7cd82 | |||
| 86f7b9788d | |||
| b23411bc2b | |||
| 7c43abaf4e | |||
| d7c106d08b | |||
| fdf9bbcc31 | |||
| 65385d2ac6 | |||
| 133d956592 | |||
| 245dcb0f4a | |||
| 6b19aa7ec9 | |||
| c5cbdbb1e8 | |||
| cbf16d3f82 | |||
| df6ab34e5b | |||
| 816317b8a6 | |||
| 521aa2dad0 | |||
| 6e439ca778 | |||
| d66e9e98b7 | |||
| a3994e009d | |||
| 062afd1773 | |||
| 8d2d8086b1 | |||
| cf71299f3b | |||
| 36dad4738a | |||
| fb744c65bd | |||
| a9949b3fe0 | |||
| a72d5b473b | |||
| 201931d2f8 | |||
| c58c5260a0 | |||
| e25dcd7c5f | |||
| 04e36d1560 | |||
| 681e840d97 | |||
| 59b44d532c | |||
| 04a6806957 | |||
| 6041c067a5 | |||
| 9b9e6510ac | |||
| 489d797df5 | |||
| 9df51dd4d8 | |||
| 6ffbf31eda | |||
| 7ea92aa923 | |||
| 1d481a7050 | |||
| 76781972a2 | |||
| 2953b46a3c | |||
| aae0c47f5c | |||
| 6d83a71bdd | |||
| 7b515a7dc8 | |||
| 8c06f5762f | |||
| 1d96ae4ab2 | |||
| c1b875ff38 | |||
| 5b15ee4ae3 | |||
| 92d3c433c4 | |||
| 79ff2f7a93 | |||
| b78618dca1 | |||
| 0967615734 | |||
| 9eb51ebaba | |||
| d9c887c0d4 | |||
| 6e6d761f2b | |||
| 7865bb46ad | |||
| c6ad9adbe0 | |||
| 907e2eb411 | |||
| e1ed265df7 | |||
| 1466833fb7 | |||
| ebf08cfede | |||
| fc703cadb8 | |||
| bb69e3d099 | |||
| 08e6f64a64 | |||
| d9193f4442 | |||
| e658538926 | |||
| b55b60cff4 | |||
| ac272df5d3 | |||
| b61e701298 | |||
| 7e2f27fe42 | |||
| 078763cb92 | |||
| 2f66bb2b77 | |||
| b3de77c961 | |||
| 60184e16f5 | |||
| 3e71e6cb3e | |||
| f0b5b01a5f | |||
| 877af01713 | |||
| 39ce53e6c9 | |||
| 3d60203509 | |||
| ed3da68670 | |||
| a0cf56bdac | |||
| 26b8fad3c1 | |||
| 6f9c712b22 | |||
| b95bcb2b63 | |||
| 67fb8d11c2 | |||
| e1f846df99 | |||
| b8cba40e84 | |||
| 0d9dede3c4 | |||
| bb2888f670 | |||
| 1cb727a62a | |||
| 77419e2808 | |||
| 6b42585e82 | |||
| 2841c3aaf1 | |||
| 72871bbd4c | |||
| 697e024936 | |||
| c7603bffa8 | |||
| 366296743b | |||
| a48f90067e | |||
| 8e6b046ee0 | |||
| af9c4e6cb9 | |||
| 1af26d22fd | |||
| f9c9e0ef41 | |||
| 06060b7dff | |||
| 6b9d964e36 | |||
| 43752710f8 | |||
| c397a0a4e3 | |||
| 5a674bf44b | |||
| cea1743630 | |||
| 2666f05790 | |||
| 53822961b9 | |||
| 0574c76c4f | |||
| 6941166a71 | |||
| 34ab92f0fb | |||
| b5dbe3bb94 | |||
| 542b9c47ed | |||
| bf6a58c9b7 | |||
| a7182710cc | |||
| cd238a0800 | |||
| 3e6f098b34 | |||
| 244dd4296b | |||
| c7ef8c3223 | |||
| 34b5f2f206 | |||
| ae4c442077 | |||
| 1da72d973d | |||
| 8ef79fb6a6 | |||
| 15e8e58f67 | |||
| c082e4813d | |||
| fc2c75c7df | |||
| d033c4c5a9 | |||
| 04e4a24664 | |||
| 2a7ecd3847 | |||
| 727c8a47d1 | |||
| 37630b17c3 | |||
| 1ec856379d | |||
| 8d43c5cabf | |||
| 0fae5813f6 | |||
| 62242cd708 | |||
| 5c758d3baf | |||
| 1f495f5fec | |||
| 9e6ebd4c8e | |||
| dd323edec4 | |||
| 53006d6ff4 | |||
| 94097d4656 | |||
| 033ef99663 | |||
| c82e2b01a4 | |||
| b25bc96eb7 | |||
| 00c79242fe | |||
| 46dac8226a | |||
| 8e919e7298 | |||
| 499b115a01 | |||
| 75c0885a5b | |||
| 1cec02f2d8 | |||
| b05e7835c6 | |||
| 62201ceba0 | |||
| 7d28dd8114 | |||
| 6d3f003133 | |||
| 167d6bcbb7 | |||
| fac681cfa2 | |||
| a1643fcdc2 | |||
| d1d7f2eb2b | |||
| 605ab234d7 | |||
| d10c7c922e | |||
| 1c82657c0c | |||
| a4a7faba40 | |||
| ffa4cc6ac9 | |||
| 0cdc7ff542 | |||
| 71de662675 | |||
| a18e453686 | |||
| 6e99ab0184 | |||
| 4b8d91084b | |||
| ed900e2b31 | |||
| e2e67eac9f | |||
| 7ce94ed58e | |||
| 57d44c3c36 | |||
| 3a86a62865 | |||
| 65d5d4303d | |||
| 8d7256ef08 | |||
| fd16cfc67a | |||
| e7bd55637a | |||
| 0f459174c8 | |||
| 1d19323026 | |||
| ed1cc99506 | |||
| f66cb26c58 | |||
| 707412d1b6 | |||
| a7ebdc5453 | |||
| dc35957f63 | |||
| 0711483bb7 | |||
| f4f5ff1887 | |||
| 33a4fa3203 | |||
| 8b22412e55 | |||
| 92d721d9d0 | |||
| 0f06d0b8ce | |||
| e321ec4c6f | |||
| 2f2892ff08 | |||
| 1dd559e80e | |||
| b7fb1b7e5a | |||
| eb60877793 | |||
| 5907ce0a02 | |||
| 5a1d431e51 | |||
| 0552c4a001 | |||
| 96d017869a | |||
| ddc2688af8 | |||
| baa60b6198 | |||
| 8abdddf11a | |||
| 9141018b27 | |||
| 3370fecdf2 | |||
| 5e91f76f0f | |||
| 557b3e1c93 | |||
| 3f65e56ccd | |||
| 5bd2cba2c2 | |||
| 3de7eb58a7 | |||
| 41eb294ce6 | |||
| ba94f2ebe0 | |||
| 7912248950 | |||
| 5d27c255b3 | |||
| 80e86e3b83 | |||
| 3a759f1eea | |||
| a09e503f19 | |||
| da4524b05c | |||
| 1a98283709 | |||
| acca8c5ac9 | |||
| 55eabb84e4 | |||
| 90ba9fce2a | |||
| 76b3982ddd | |||
| c946f80d5b | |||
| 8d350c7d99 | |||
| 7cd7fb8d6c | |||
| b12e563340 | |||
| 9c0aadce1e | |||
| b8d538b1b4 | |||
| 0219cd71b9 | |||
| 899fcbdfcc | |||
| 79fed6e32f | |||
| 55263ca11d | |||
| fe1f4a3bac | |||
| dd4fda55b5 | |||
| 2aae506110 | |||
| aae54a6f41 | |||
| 89da58adec | |||
| 57ef003eb9 | |||
| d378a64096 | |||
| 58ac91bc10 | |||
| 97602c0bf8 | |||
| 8523c487c1 | |||
| 3580b58bf6 | |||
| 9b26a4d5ce | |||
| c43fc68bc8 | |||
| df07539331 | |||
| 563931750b | |||
| 6b090de7b1 | |||
| d8863ef95f | |||
| 36f9595ce7 | |||
| 48565e6305 | |||
| 3727f9583b | |||
| 4a6bbf0b3c | |||
| 7513a7157f | |||
| e7dbdb6ead | |||
| db5f101bfc | |||
| 3c06e8b6fd | |||
| 28f94cbd0b | |||
| 6f37cbd946 | |||
| 396281263b | |||
| a00e8ac201 | |||
| b1772a89c1 | |||
| 58f07ff045 | |||
| 12f99d4fc7 | |||
| 05da0a6877 | |||
| 46ce871f34 | |||
| 4b22c2f044 | |||
| 4014828eff | |||
| bc87a62d59 | |||
| f6862442d3 | |||
| bff7f57eb8 | |||
| e19024ca0d | |||
| 73997e4799 | |||
| ffa97aa438 | |||
| d08244dfd8 | |||
| 2e0d367045 | |||
| 0f1fb2e6a1 | |||
| 672e362ed8 | |||
| bcae16c441 | |||
| 19b8f5cb59 | |||
| 68b37156d8 | |||
| d9237b64c0 | |||
| da037b38e3 | |||
| 62f864f4ab | |||
| bf89f1d37d | |||
| 3dc986e609 | |||
| 2f5e874201 | |||
| 05291932f8 | |||
| 72aa450ecb | |||
| 926ea21fe0 | |||
| 657a077cdb | |||
| 9a90f56845 | |||
| 7d36e0d63b | |||
| 865d5ed7a1 | |||
| 9dd91ee17e | |||
| 425ea821d7 | |||
| bea5049a2f | |||
| eae1e34696 | |||
| e63b6b00bc | |||
| e5b3ed226b | |||
| d5ce354c87 | |||
| e280838989 | |||
| 2309054b1f | |||
| 9dcc44a76b | |||
| 7a417c6d3b | |||
| 425ab15ae1 | |||
| c75ff4f118 | |||
| 75d3dd19ec | |||
| 4cd556555e | |||
| feebe921af | |||
| 92929308bd | |||
| ca4f14b555 | |||
| a7bcfacbd9 | |||
| e097b4820d | |||
| 566ec7974c | |||
| c735d6c420 | |||
| cf54ca9551 | |||
| 9f1da1b562 | |||
| f5a3dbf82b | |||
| 89f83e796a | |||
| 977a9e49c5 | |||
| 7ee0a4b39f | |||
| 4268e3a1d2 | |||
| 860b9a266a | |||
| c39d752ccb | |||
| 15db1cf385 | |||
| 38d684d1e6 | |||
| ccb1bc514b | |||
| 27c46a2c8e | |||
| ff2f1d237a | |||
| 402f4c162c | |||
| 81013a98b4 | |||
| 971dd622c7 | |||
| 0045d31e2d | |||
| caef8f4ebc | |||
| 6116c1ae71 | |||
| 03ecf2b0bb | |||
| d4a5005273 | |||
| 7522f29f0a | |||
| 09f0a2e4a6 | |||
| aa846929f3 | |||
| b378af7cb1 | |||
| 8b549a487f | |||
| 005f659eaa | |||
| a5aad94f24 | |||
| 52a6926da3 | |||
| b3c0f003bb | |||
| 3d2360bc56 | |||
| 1267f51d8c | |||
| e7328001a4 | |||
| fc7b53e809 | |||
| 50637cb3c2 | |||
| 11b4203874 | |||
| 60beb432eb | |||
| 64331c9cf0 | |||
| 00088d4093 | |||
| 472f3660e0 | |||
| 3c13cc8c4d | |||
| 0792ac8eee | |||
| 4952af4ffe | |||
| 3fcca7ef56 | |||
| e93244fef2 | |||
| acf75ce7fe | |||
| 7560b6e53d | |||
| f5346bbec2 | |||
| 41958889fb | |||
| d439a7811d | |||
| 4951c00d23 | |||
| 202cd0d45e | |||
| 1502db6095 | |||
| e8eea9e68e | |||
| 396eb9f283 | |||
| 378f400226 | |||
| 37e02dfbd5 | |||
| dce66ec8ec | |||
| 2fef67a08d | |||
| 50a17583c7 | |||
| bfe2c7df83 | |||
| b3186dde12 | |||
| 628a33eb76 | |||
| 4373e66b1e | |||
| 2e67b0ad9f | |||
| a4cbe0635f | |||
| 8563419280 | |||
| 0974bd4a90 | |||
| e1d47adc99 | |||
| e5e171d913 | |||
| 1e313227b8 | |||
| 8d45a9e0cd | |||
| 95568d76d3 | |||
| d4a3442468 | |||
| e262de22ea | |||
| 49243f1891 | |||
| 1a099ba549 | |||
| 2367133b4f | |||
| c648a1933d | |||
| 598acf08da | |||
| 208a8dee90 | |||
| e9fb299565 | |||
| 17a514ecd0 | |||
| 38ac62cedd | |||
| ce280731af | |||
| 751fb57f71 | |||
| be7d90abbf | |||
| d59585dd4f | |||
| 7a695707a2 | |||
| 4e590c9450 | |||
| b069d1c9e9 | |||
| 9fa1f7b981 | |||
| 4a68e4cd9d | |||
| 8320b6fd7c | |||
| e40cf0a1c4 | |||
| 19106985d7 | |||
| 3d817c54da | |||
| ca31877107 | |||
| f5f9afefb0 | |||
| d42863603e | |||
| 2c19cf3e31 | |||
| e7dc918c6a | |||
| 64c9e8212a | |||
| 499c39f13d | |||
| bccdae735b | |||
| 58120730a5 | |||
| 5b8db8a680 | |||
| 0acfd583c8 | |||
| 402b7ef67e | |||
| 6944871c42 | |||
| b60da35689 | |||
| 5204feddb1 | |||
| 68156df66b | |||
| a9e8b27285 | |||
| b8f470ddbd | |||
| 9d075dd1d1 | |||
| 4b802c6f60 | |||
| 8ce9344dd0 | |||
| cb2b386791 | |||
| 7ee4681c10 | |||
| 82c0ea9df2 | |||
| 9070d80880 | |||
| 45c53caf94 | |||
| c4947618c1 | |||
| 941ed59c37 | |||
| d76bbec1ab | |||
| f5a1d98cf9 | |||
| b0e6d837f0 | |||
| b1cfb1b733 | |||
| 26a1212546 | |||
| 03b05aaae9 | |||
| f41c87d7c9 | |||
| b74deb5e35 | |||
| 240e2db637 | |||
| 441947b6a4 | |||
| 194bdaffcd | |||
| db6e9ff4c6 | |||
| 57261a1164 | |||
| 0b116bb409 | |||
| a5ad2e5de2 | |||
| b6928ff6c0 | |||
| 4b03dd321c | |||
| f7eefbd3d7 | |||
| b23f7f9b27 | |||
| b95bc7e4c4 | |||
| 1593c0c347 | |||
| c154663455 | |||
| 13bc1901dc | |||
| 4f28322ac2 | |||
| 756e2ced8b | |||
| 1dc78b5209 | |||
| 3464093273 | |||
| 4487214494 | |||
| 6d7e222946 | |||
| d12a6a3178 | |||
| ed9d609c35 | |||
| b86f359d93 | |||
| 02080dfcf8 | |||
| 2768d25884 | |||
| 7bdf9896d2 | |||
| 3b4f84ded8 | |||
| 69abc52731 | |||
| 1671b1fb8b | |||
| 8735f4ef5c | |||
| 86967b5786 | |||
| ca8ceeb130 | |||
| 41d6f8eeea | |||
| 27b7805608 | |||
| fef39f7013 | |||
| b414b54c6b | |||
| ccdbb20ad0 | |||
| eb7e47bf29 | |||
| 53988c7184 | |||
| 9092b2bdc5 | |||
| 068353aa5b | |||
| 95a17ddbf0 | |||
| 6c8c455f5b | |||
| 282032e178 | |||
| af63e6a80d | |||
| a46ba0da29 | |||
| f7738bf65b | |||
| bb11d1fe37 | |||
| d02a2deb52 | |||
| 46105d849d | |||
| f16b6c3482 | |||
| a9cb497045 | |||
| d529a34ecb | |||
| 5394029dc5 | |||
| 28247737ca | |||
| 6448c2d8fb | |||
| 4460ccc8ec | |||
| 2b02a3c533 | |||
| 6705513b86 | |||
| 4bd8d12481 | |||
| ccaf3c283b | |||
| ce4276a0cb | |||
| 709e316e56 | |||
| e46635d6ab | |||
| 0af8677ba4 | |||
| 9ab13daf09 | |||
| 17977fbabc | |||
| 83854047b7 | |||
| 28e56fd587 | |||
| 29fc6308b8 | |||
| 14a7df128d | |||
| dd4ef89d0a | |||
| 830ec91cbf | |||
| aee2d55fab | |||
| 89ed7982e7 | |||
| 9f702c89ab | |||
| 2f76efd0f6 | |||
| fae18c72c3 | |||
| 1586f6ee2b | |||
| 4ce6214526 | |||
| e370e4b65e | |||
| 944de2d3f5 | |||
| f32146368d | |||
| 8d45e9b016 | |||
| 70227861ff | |||
| 20e542516b | |||
| 73ad21df73 | |||
| a67fe7e43d | |||
| a15ddd9f88 | |||
| b27f9bf930 | |||
| d5c28f98f1 | |||
| 16b283ed00 | |||
| 97b43889a1 | |||
| 05efa12411 | |||
| 3e60495232 | |||
| 45522b0710 | |||
| d67d25eb7b | |||
| 2538690fb4 | |||
| 4c23b2518e | |||
| 9daade9816 | |||
| 5f925f0070 | |||
| 38b0cd7780 | |||
| e46391042b | |||
| 553a03b05f | |||
| 24c1cc4efe | |||
| f6eabe7b58 | |||
| de2de1fdc7 | |||
| 8184ac8843 | |||
| a57d82d4cd | |||
| a266ef7337 | |||
| b30ca23180 | |||
| db5c8f00fc | |||
| d1bbacb06e | |||
| bff4e3b0fd | |||
| 14248ddbd9 | |||
| 391f39d291 | |||
| b4354efa8b | |||
| 686588a6e5 | |||
| 294267a605 | |||
| 7b53b9108b | |||
| 15be9ab501 | |||
| 7cfcd2daef | |||
| 6070429eec | |||
| b5f41ef6c7 | |||
| 716588a8fb | |||
| 95bc92f005 | |||
| 23425abe9d | |||
| 3bab5e1e78 | |||
| 79ed7e81b1 | |||
| a59e58cc94 | |||
| 72bd12e394 | |||
| 2c667ca016 | |||
| 209c4d724f | |||
| 95cf641f50 | |||
| 85750fd065 | |||
| 402b5c7f81 | |||
| be6f52b796 | |||
| f4e6c6ad94 | |||
| 99fe59cee9 | |||
| 0e80ba8b91 | |||
| 8965efdce1 | |||
| 1393a94804 | |||
| 52e558d877 | |||
| d9948105f1 | |||
| 87c91c1c04 | |||
| f15e471371 | |||
| fc0a83933d | |||
| f1cf2fe218 | |||
| 7a5679cb65 | |||
| 571b4604db | |||
| 29e15a40db | |||
| 6fb2286fa4 | |||
| ab2f78c7b4 | |||
| f9b918a05b | |||
| a46cde174a | |||
| 6eee0f8741 | |||
| 28d31bb9f6 | |||
| 23128be17f | |||
| 130885fda7 | |||
| c4fc42f8f4 | |||
| 21e73c5fb9 | |||
| b635bf5591 | |||
| be594bb1f6 | |||
| 543e3fca98 | |||
| b385d76dc6 | |||
| 2adc88fec3 | |||
| 2a9e2ceb61 | |||
| 47fa804469 | |||
| f70c01eee7 | |||
| eb4ea07a2d | |||
| 55cd72baaa | |||
| 940076d101 | |||
| 93ebb9f7a9 | |||
| 1a17ea52d8 | |||
| 68bc0c0c7c | |||
| 0e7dd6b350 | |||
| b3b0bf3845 | |||
| ddc32f1e43 | |||
| c9de508a2c | |||
| fac68bca4e | |||
| eaf250c3c6 | |||
| 8b99772d29 | |||
| 862a32e97e | |||
| 6cfb84d6ee | |||
| 2fda7ca6f6 | |||
| f2aecb53bc | |||
| 05fdc2f17a | |||
| b9868b993c | |||
| 573d8eefd1 | |||
| 51d64f29e6 | |||
| a39ab60ae5 | |||
| ba9671fae5 | |||
| a9340f354d | |||
| f9d6b069f7 | |||
| c363d5790d | |||
| 15a50d2a26 | |||
| bffc188151 | |||
| e78205430c | |||
| 4ef76d4f85 | |||
| 967da46793 | |||
| 46899503bd | |||
| 2dcf0f774c | |||
| d669db0cab | |||
| f8aabcc50a | |||
| 4bb3ece8dc | |||
| 495a7765d2 | |||
| 225296f253 | |||
| 52e6900e7a | |||
| 557bff1465 | |||
| add32ac107 | |||
| f7699b98fb | |||
| 05a8ec1fec | |||
| 004e63c433 | |||
| 898f41b95a | |||
| 859a6a75aa | |||
| b90dae6448 | |||
| dc1ddf4cff | |||
| 46ef5d86c3 | |||
| ac63a6b125 | |||
| 72778c97df | |||
| b4b86081f9 | |||
| e4a47a4ca5 | |||
| 79c60f6d4e | |||
| 4c4d55e0dc | |||
| 9504416beb | |||
| 99586d9b3f | |||
| 65b19cbbd3 | |||
| 7b64f4443d | |||
| abb2e857be | |||
| df10745963 | |||
| 3d729595d1 | |||
| 96a38d1895 | |||
| b4c1390af8 | |||
| e9604ac212 | |||
| ea3a4b34ea | |||
| 79a0d92161 | |||
| b10c40260c | |||
| 9e056d2097 | |||
| 8a250c5994 | |||
| e311ac3269 | |||
| 28078a2d0c | |||
| 7def8c1bbf | |||
| 24ca11387e | |||
| bccc9583c1 | |||
| 9643747b17 | |||
| c695848092 | |||
| 5011613e4c | |||
| 6cc7f69a59 | |||
| db6678637b | |||
| 93892e12a2 | |||
| c196aab89d | |||
| 54a7718b88 | |||
| cec6e6175a | |||
| bc5036bd34 | |||
| 021826eb1b | |||
| facd071967 | |||
| 486e81ad77 | |||
| 872cd3d7c0 | |||
| ca9851b311 | |||
| 2fa0940d45 | |||
| 3485338386 | |||
| 786a821f3f | |||
| da1c9c5ea5 | |||
| 93d8cce7ac | |||
| 5086ba2a3b | |||
| 4cf8611dcd | |||
| 101e9d705a | |||
| 7d8bfa1b62 | |||
| 5dcf9e2f41 | |||
| cdf18b6c4d | |||
| 609ce3b6e0 | |||
| 3ba8be2e21 | |||
| 6b13a97ce4 | |||
| 130e40957e | |||
| a7b28317d7 | |||
| 29fcd0fdcf | |||
| 9d5f63e543 | |||
| 208c28ead2 | |||
| 447d5ee94b | |||
| bb443add17 | |||
| cb954773ed | |||
| 89749c7eb1 | |||
| 30146f8744 | |||
| a623f374b1 | |||
| b41584feb3 | |||
| 77d5bbb767 | |||
| 171d428d3a | |||
| 61254c6cc4 | |||
| 44b3a8952e | |||
| 0fc8c5e7e9 | |||
| 6d969eb92f | |||
| 26ea0f81ca | |||
| dc45e38f11 | |||
| 9d5db40d3f | |||
| 9e25d52679 | |||
| 1f98d4f6ff | |||
| b73883ce1d | |||
| 7af42da5d2 | |||
| cf75057b67 | |||
| e5b1841030 | |||
| 57325a22a5 | |||
| c640166cf8 | |||
| 4b4c362c03 | |||
| c71bfb1602 | |||
| 022e6349c1 | |||
| 917671ac9a | |||
| a108975d78 | |||
| 62d31c5902 | |||
| 5d28314ee3 | |||
| 1b22109f95 | |||
| e5c05bfd66 | |||
| 62e97858d7 | |||
| b9da9b977e | |||
| f121b6c039 | |||
| c48b13bc0a | |||
| 26abb9beb9 | |||
| 02cc7d53b7 | |||
| 67136b5986 | |||
| 58d5175fde | |||
| c511c4063e | |||
| 6429611b3c | |||
| 3cea53ddca | |||
| d661e58fc3 | |||
| e140b6e4e2 | |||
| e1025d9337 | |||
| f1acc483c3 | |||
| 0e25e979a2 | |||
| 0c129ff02e | |||
| 05234082a9 | |||
| bdc44962a1 | |||
| e96a59965e | |||
| 507f3fc74b | |||
| 22d997fcd9 | |||
| 89a98ca51b | |||
| 9834abe3ab | |||
| 54ffc2c138 | |||
| 4785c4f11e | |||
| 9d5b0deb61 | |||
| 9c0b540ddc | |||
| c124a9f2b8 | |||
| 8b0e08f9df | |||
| 9ee115d1a0 | |||
| a7ebf431a8 | |||
| d85330d54a | |||
| f8f93c7351 | |||
| ee1fd4944f | |||
| 5117fa06b8 | |||
| 2ac1552bf7 | |||
| 94c2647d25 | |||
| 6b2f067435 | |||
| 3e2471d0a0 | |||
| f0b1d33398 | |||
| bae955f7c5 | |||
| b747e71583 | |||
| 48160da4b7 | |||
| d17df6a9db | |||
| df7a9ec977 | |||
| f2157420f2 | |||
| ae9c56416f | |||
| 1dec6a541a | |||
| c75157ffd8 | |||
| fa77d03fea | |||
| 618f4c533c | |||
| 9b77631dd5 | |||
| 7aa22df1e2 | |||
| ee0ff79820 | |||
| ca772e8a9c | |||
| 8af05c14be | |||
| 20f230e910 | |||
| 8af51875b6 | |||
| a4ead757f6 | |||
| 0cc6bc9e2e | |||
| 00a551d2b1 | |||
| b6f1652aab | |||
| b304555389 | |||
| 456af457bb | |||
| e9cb67844d | |||
| ff12099078 | |||
| 4068c6da1a | |||
| 2f839a41c0 | |||
| d9c13aefe3 | |||
| 7bfa1c27bf | |||
| f6986352ee | |||
| 2eb51bbb13 | |||
| 77ef1e75c8 | |||
| ae11a9d77c | |||
| 30648be2ed | |||
| e5958a2a15 | |||
| 8d3b41ea4d | |||
| 2d7f82af75 | |||
| 9c93a94834 | |||
| 13a9861d18 | |||
| f7d1a91aad | |||
| 121b8e0a64 | |||
| 36ebf4a034 | |||
| 0a752616b7 | |||
| edd21a959b | |||
| dfe9779401 | |||
| d64bc68562 | |||
| f29a57ceb2 | |||
| 529c8e36f2 | |||
| 108abcdec4 | |||
| 1ae7d8373f | |||
| 8eb4860ec6 | |||
| 7ae188c42b | |||
| 125a65ee8a | |||
| 98c3353a07 | |||
| 683ba59fae | |||
| 38abd739d3 | |||
| df58c84b5a | |||
| 513bb215db | |||
| 77be329ed0 | |||
| 1f223fbe13 | |||
| c6a21ab661 | |||
| 6d59f0bd3f | |||
| 74972e267a | |||
| 6c2134ba0e | |||
| 7bf53b0588 | |||
| eaff635df5 | |||
| 88ad275b44 | |||
| fe6143ca49 | |||
| 724432aa02 | |||
| 9686a4b1bd | |||
| 7f8fab8ec0 | |||
| 5a985a143b | |||
| f9154f8c2e | |||
| 287879a7f5 | |||
| 3c82302545 | |||
| b331783c01 | |||
| 1882210db4 | |||
| 12bd185a9b | |||
| 3dbaa7984f | |||
| 40f00b1dcb | |||
| 98bb38cb03 | |||
| e1b4c8d616 | |||
| 5d7c015348 | |||
| a90e7c82b3 | |||
| 6c0c9e7d7c | |||
| 461b35f6ef | |||
| 81ca040918 | |||
| 5dc6bfb195 | |||
| b0d3657e56 | |||
| 822913c85f | |||
| ce0ac250e1 | |||
| 22e98986e5 | |||
| 3f7fc39362 | |||
| 024c845d06 | |||
| 4bb1e29cf3 | |||
| fa7bdc4fcd | |||
| ab0708340c | |||
| 34723a2e17 | |||
| d4c4d2bb13 | |||
| 80090df8e4 | |||
| 05dc68db7b | |||
| 1bcde2cbf2 | |||
| 9a5f5851ba | |||
| 8c7152bb9f | |||
| 5580e39447 | |||
| f29d58c0f0 | |||
| d69e62363e | |||
| 0e0af9dcaa | |||
| 85fee142b3 | |||
| a1b5a934f4 | |||
| 996b533634 | |||
| 11fab2e58e | |||
| 437df3b6d4 | |||
| 663c2fdbac | |||
| 4eb0e9f8aa | |||
| 00a17b60f8 | |||
| fb5f00db61 | |||
| 0105055c3e | |||
| efe147b731 | |||
| 9585302dc5 | |||
| 7432c0775b | |||
| 8666ac7b85 | |||
| 827cbfd03c | |||
| 64a5e8f236 | |||
| 6a60315011 | |||
| a234334f69 | |||
| d71acbd909 | |||
| 33e672d135 | |||
| a26a696e34 | |||
| c63827d5a0 | |||
| 998f9f6ad0 | |||
| 0e188d3bff | |||
| 4a0867c5f2 | |||
| 4fb1955303 | |||
| ef202cd8b8 | |||
| 3648b4539b | |||
| b78ac9355a | |||
| f023994074 | |||
| a47e77bdf9 | |||
| 13773c267d | |||
| deccbf6d9a | |||
| ec1f92c16a | |||
| 5436e605b0 | |||
| 949ae6a7aa | |||
| b957c563c6 | |||
| 36c73e1d64 | |||
| d8f0925466 | |||
| 77d1b2f648 | |||
| 7a82dd3baf | |||
| 7c5573199f | |||
| 55146b70bd | |||
| c2a26458e8 | |||
| 6be895f83c | |||
| fcae79eb9a | |||
| 9a342d979f | |||
| a48a7c321d | |||
| fd167bc19f | |||
| 11f794c9df | |||
| 30b353fabe | |||
| 61590a115c | |||
| 982dfbdd61 | |||
| 9a5605f5de | |||
| 5d62055838 | |||
| 3e886a8a5b | |||
| eb1d4736b0 | |||
| affcdf49f9 | |||
| 06a4a3f8af | |||
| eb58d23656 | |||
| ed2ee11af8 | |||
| 6ed833bf28 | |||
| 196e8af786 | |||
| 17aafbc595 | |||
| 1dcf8cf36c | |||
| 3fc6bc7e53 | |||
| fce337b823 | |||
| 6e3c4a856c | |||
| 05f44f3c62 | |||
| d609eed733 | |||
| 65c4e6ad94 | |||
| 6fc11568c0 | |||
| 494aa6e090 | |||
| abab91748c | |||
| f86ef41980 | |||
| a22191c1fb | |||
| db2a6b239e | |||
| 25726a3df9 | |||
| a95c4d673d | |||
| b6b53d7b83 | |||
| 573a5c6a53 | |||
| 7db8868043 | |||
| 7ee89a6e1d | |||
| 5e22b1cd27 | |||
| 2e5eee5092 | |||
| b341608130 | |||
| e6e8ffb1c3 | |||
| 60c851972e | |||
| dcfc552254 | |||
| 8bb92f5c19 | |||
| 0ca338ade0 | |||
| 272424d379 | |||
| 6d72f33da7 | |||
| c0fab06356 | |||
| 1423a7ce91 | |||
| 053a432804 | |||
| f50129baa3 | |||
| 9150e8f188 | |||
| b637ab3ceb | |||
| 32d38dd876 | |||
| a04f4bd4b2 | |||
| ad68219568 | |||
| af117d810d | |||
| 5d764abdc6 | |||
| a9e9c69265 | |||
| 461e86eb82 | |||
| 7e87ffa0fd | |||
| 7bfa698796 | |||
| 285f64ed62 | |||
| b13b1d7b70 | |||
| 212e0cd812 | |||
| 589a8e101d | |||
| b8b4169b1a | |||
| e8aac64083 | |||
| 8e3ae9bb85 | |||
| 14a549928f | |||
| 83e1fb715e | |||
| aeeac8e343 | |||
| 5fc6d50486 | |||
| edc7c111cb | |||
| 05a754bc92 | |||
| dff58c56fb | |||
| 58709a1d32 | |||
| 554567fa82 | |||
| 3ad51db9c2 | |||
| 007d74ee23 | |||
| cd15214d77 | |||
| 32eca24468 | |||
| a96e25ef5d | |||
| 5087fb1904 | |||
| 2c4af20cb0 | |||
| 78cdc63b76 | |||
| 6ef191563a | |||
| daf616be22 | |||
| 278dc84bb9 | |||
| 686a2931e6 | |||
| 5be5a0e417 | |||
| cd2d1dbb76 | |||
| 68a92623d0 | |||
| 81b3255577 | |||
| fc33a22f27 | |||
| 5267c76580 | |||
| 2908b993a3 | |||
| 1c172bf513 | |||
| aa037e4a0c | |||
| 10dd04e03c | |||
| 560f75c755 | |||
| f2ce65fb84 | |||
| eb1d463889 | |||
| 8d021cb29c | |||
| 70faac1b6a | |||
| abaf425a36 | |||
| 95a0333057 | |||
| a49bba636a | |||
| e252ef2cb2 | |||
| 4ca6be8892 | |||
| 29227a2c9e | |||
| be4326eb83 | |||
| 72cc002d5a | |||
| 0efce8e9b4 | |||
| 398b12f176 | |||
| 4ca2eaaeda | |||
| 8711ab4738 | |||
| d58faad8de | |||
| 8f44698c58 | |||
| 14b2f05881 | |||
| 663071fbb8 | |||
| 098e79c301 | |||
| 5f18808f7d | |||
| cb19b706d5 | |||
| e2ed1db1e1 | |||
| fc748c6a8b | |||
| 294f136297 | |||
| f3fc29497e | |||
| 6e01d29355 | |||
| 749725adba | |||
| 5538031da1 | |||
| dd0153f4e3 | |||
| 690cf60b8c | |||
| cce40a97f2 | |||
| ed0d95ae1f | |||
| 1e28ec4a6a | |||
| 6b4daa5f16 | |||
| 3075fd0cf5 | |||
| b7470fd09f | |||
| 4b8bf1149e | |||
| d9567609de | |||
| 9944e202c8 | |||
| 923b59e2a0 | |||
| bd7d13136f | |||
| a08aa84884 | |||
| 5be48aaae8 | |||
| 8530ec12b7 | |||
| d777506b74 | |||
| 6e9a57421e | |||
| c6d47a49cd | |||
| 13c48da980 | |||
| df0658406c | |||
| ea548c34cf | |||
| 28824d4b6f | |||
| 341a1e3810 | |||
| dcf4a926f6 | |||
| c12bdbb8a1 | |||
| 261706d808 | |||
| 904c3f4072 | |||
| 4a885ac56e | |||
| a51745868d | |||
| 9dd2d6c18c | |||
| 8aae405584 | |||
| 4a119e6012 | |||
| e3041177c7 | |||
| 607f83cf96 | |||
| 2c1fd46e24 |
@@ -0,0 +1,9 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<classpath>
|
||||
<classpathentry kind="src" path="src"/>
|
||||
<classpathentry kind="src" output="build.eclipse/test-classes" path="test"/>
|
||||
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
|
||||
<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/3"/>
|
||||
<classpathentry kind="lib" path="lib/test/reflections-0.9.8.jar"/>
|
||||
<classpathentry kind="output" path="build.eclipse/classes"/>
|
||||
</classpath>
|
||||
+22
-20
@@ -1,21 +1,23 @@
|
||||
.libs
|
||||
.deps
|
||||
*.o
|
||||
*.lo
|
||||
.dirstamp
|
||||
*.la
|
||||
Makefile
|
||||
config.log
|
||||
config.status
|
||||
build
|
||||
build-d64
|
||||
build.eclipse
|
||||
build.number
|
||||
build.clover
|
||||
.metadata
|
||||
.DS_Store
|
||||
bin
|
||||
contrib/ntservice/dist
|
||||
contrib/platform/dist
|
||||
doc
|
||||
*~
|
||||
fficonfig.h
|
||||
include/ffi.h
|
||||
include/ffitarget.h
|
||||
libffi.pc
|
||||
libtool
|
||||
stamp-h1
|
||||
libffi*gz
|
||||
autom4te.cache
|
||||
libffi.xcodeproj/xcuserdata
|
||||
libffi.xcodeproj/project.xcworkspace
|
||||
ios/
|
||||
**/*~
|
||||
dist/*.asc
|
||||
dist/*-sources.jar
|
||||
dist/*-javadoc.jar
|
||||
dist/src-mvn.zip
|
||||
dist/out-of-date.jar
|
||||
perf*.txt
|
||||
native/libffi/doc/libffi.info
|
||||
junit-*
|
||||
pom-jna.xml.asc
|
||||
pom-jna-platform.xml.asc
|
||||
|
||||
+17
@@ -0,0 +1,17 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<projectDescription>
|
||||
<name>jnalib</name>
|
||||
<comment></comment>
|
||||
<projects>
|
||||
</projects>
|
||||
<buildSpec>
|
||||
<buildCommand>
|
||||
<name>org.eclipse.jdt.core.javabuilder</name>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
</buildSpec>
|
||||
<natures>
|
||||
<nature>org.eclipse.jdt.core.javanature</nature>
|
||||
</natures>
|
||||
</projectDescription>
|
||||
+202
@@ -0,0 +1,202 @@
|
||||
|
||||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
APPENDIX: How to apply the Apache License to your work.
|
||||
|
||||
To apply the Apache License to your work, attach the following
|
||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||
replaced with your own identifying information. (Don't include
|
||||
the brackets!) The text should be enclosed in the appropriate
|
||||
comment syntax for the file format. We also recommend that a
|
||||
file or class name and description of purpose be included on the
|
||||
same "printed page" as the copyright notice for easier
|
||||
identification within third-party archives.
|
||||
|
||||
Copyright [yyyy] [name of copyright owner]
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
+722
@@ -0,0 +1,722 @@
|
||||
NOTE: as of JNA 4.0, JNA is now dual-licensed under LGPL and ASL (see LICENSE).
|
||||
|
||||
NOTE: JNI native support is typically incompatible between minor versions, and almost always incompatible between major versions.
|
||||
|
||||
Next Release
|
||||
============
|
||||
|
||||
Features
|
||||
--------
|
||||
* Updated AIX natives and build - [@twall](https://github.com/twall).
|
||||
* [#290](https://github.com/twall/jna/pull/290): Improved the stacktrace for the exceptions thrown by `com.sun.jna.Structure` - [@ebourg](https://github.com/ebourg).
|
||||
* [#332](https://github.com/twall/jna/pull/332): Added Win32 Monitor Configuration API in `com.sun.jna.platform.win32.Dxva2` - [@msteiger](https://github.com/msteiger).
|
||||
* Added Winspool monitor sample and updated Kernel32, WinBase, Winspool - [@wolftobias](https://github.com/wolftobias).
|
||||
* Added Some minor changes to MS Office samples Test and small changes to the MS Office samples Bug Fixes - [@wolftobias](https://github.com/wolftobias).
|
||||
* [#333](https://github.com/twall/jna/pull/333): Added `CoTaskMemAlloc`, `CoTaskMemRealloc` and `CoTaskMemFree` to `com.sun.jna.platform.win32.Ole32` - [@msteiger](https://github.com/msteiger).
|
||||
* [#334](https://github.com/twall/jna/pull/334): Added `com.sun.jna.platform.win32.Shell32.SHGetKnownFolderPath` and `KnownFolders` GUID constants - [@msteiger](https://github.com/msteiger).
|
||||
|
||||
Bug Fixes
|
||||
---------
|
||||
* [#319](https://github.com/twall/jna/pull/319): Fix direct-mapping type-mapped pointer result types - [@marco2357](https://github.com/marco2357).
|
||||
* Added Variant and TlbImp Fixes - [@wolftobias](https://github.com/wolftobias).
|
||||
|
||||
Release 4.1
|
||||
===========
|
||||
|
||||
Features
|
||||
--------
|
||||
* Added `com.sun.jna.platform.win32.Advapi32Util.registryCloseKey` - [@falldog](https://github.com/falldog).
|
||||
* Enabled platform tests to be run w/o building native bits - [@twall](https://github.com/twall).
|
||||
* Added COM/Typelib java code generator `com.sun.jna.platform.win32.COM.tlb.TlbImp` - [@wolftobias](https://github.com/wolftobias).
|
||||
* [#226](https://github.com/twall/jna/issues/226): Added OSGI information to jna-platform.jar - [@brettwooldridge](https://github.com/brettwooldridge).
|
||||
* [#267](https://github.com/twall/jna/pull/267): Added support for Windows RAS32 API, `com.sun.jna.platform.win32.Rasapi32` and `Rasapi32Util` - [@kc7bfi](https://github.com/kc7bfi).
|
||||
* [#101](https://github.com/twall/jna/issues/101): Modify `com.sun.jna.platform.win32.Advapi32Util.registryGet*` API to support `KEY_WOW64` option - [@falldog](https://github.com/falldog).
|
||||
* [#271](https://github.com/twall/jna/pull/271): Added `com.sun.jna.platform.win32.Gdi32.ChoosePixelFormat` and `SetPixelFormat` - [@kc7bfi](https://github.com/kc7bfi).
|
||||
* [#271](https://github.com/twall/jna/pull/271): Added `com.sun.jna.platform.win32.OpenGL32`, `OpenGL32Util` and `WinOpenGL` - [@kc7bfi](https://github.com/kc7bfi).
|
||||
* [#250](https://github.com/twall/jna/pull/250): Added `com.sun.jna.platform.win32.Kernel32.GetPrivateProfileSection`, `GetPrivateProfileSectionNames` and `WritePrivateProfileSection` and corresponding `Kernel32Util` helpers - [@quipsy-karg](https://github.com/quipsy-karg).
|
||||
* [#287](https://github.com/twall/jna/pull/287): Added `DBTF_MEDIA` and `DBTF_NET` to `com.sun.jna.platform.win32.DBT` - [@daifei4321](https://github.com/daifei4321).
|
||||
* [#295](https://github.com/twall/jna/pull/295): Added `com.sun.jna.platform.win32.Kernel32.ResetEvent` - [@manithree](https://github.com/manithree).
|
||||
* [#301](https://github.com/twall/jna/pull/301): Added `accessCheck` to `com.sun.jna.platform.win32.Advapi32Util`, `MapGenericMask` and `AccessCheck` to `com.sun.jna.platform.win32.Advapi32`, `PRIVILEGE_SET` and `GENERIC_MAPPING` to `com.sun.jna.platform.win32.WinNT` - [@BusyByte](https://github.com/BusyByte).
|
||||
|
||||
Bug Fixes
|
||||
---------
|
||||
* Fixed inconsistent behavior on `Structure.ByValue` fields within a `Structure` - [@twall](https://github.com/twall).
|
||||
* [#279](https://github.com/twall/jna/issues/279): Accommodate FreeBSD libc loading - [@sevan](https://github.com/sevan).
|
||||
* [#287](https://github.com/twall/jna/pull/287): Fixed contrib `win32.Win32WindowDemo`, now showing the added/removed drive letter, and whether the event is about media in drive or physical drive - [@daifei4321](https://github.com/daifei4321).
|
||||
* [#300](https://github.com/twall/jna/issues/300): Fix stdcall argument alignment - [@twall](https://github.com/twall).
|
||||
|
||||
Release 4.0
|
||||
===========
|
||||
|
||||
Features
|
||||
--------
|
||||
* Added ASL licensing to facilitate distribution - [@twall](https://github.com/twall).
|
||||
* [#109](https://github.com/twall/jna/issues/109): Set default Java compatibility level to 1.6 - [@twall](https://github.com/twall).
|
||||
* [#209](https://github.com/twall/jna/issues/209): Improved default performance saving last error results - [@twall](https://github.com/twall).
|
||||
* Use predictable names for CPU architecture prefix (namely x86, x86-64); names correspond to OSGI processor values - [@twall](https://github.com/twall).
|
||||
* Avoid superfluous Structure memory allocation from native - [@twall](https://github.com/twall).
|
||||
* Added `Library.OPTION_CLASSLOADER`, which enables loading native libraries from any class loader (including JNA's native library). This enables parallel dependencies on JNA (e.g. within a tomcat deployment without having to include JNA in the app server environment) - [@twall](https://github.com/twall).
|
||||
* Use per-library String encoding settings (see `Native.getDefaultStringEncoding()` and `Structure.getStringEncoding()`) - [@twall](https://github.com/twall).
|
||||
* Added memory dump for debugging (see `com.sun.jna.Memory`) - [@twall](https://github.com/twall).
|
||||
* Improved caching of Structure alignment, type mapping, and encoding information - [@twall](https://github.com/twall).
|
||||
* [#225](https://github.com/twall/jna/pull/225): Added `platform.win32.Kernel32.GetLogicalProcessorInformation` and `platform.win32.Kernel32Util.getLogicalProcessorInformation` - [@trejkaz](https://github.com/trejkaz).
|
||||
* [#236](https://github.com/twall/jna/issues/236): Auto-strip profiler native method prefix specified by `jna.profiler.prefix`, which defaults to $$YJP$$ - [@twall](https://github.com/twall).
|
||||
* Added `jna.debug_load` property to diagnose library loading issues - [@twall](https://github.com/twall).
|
||||
* Throw explicit `IllegalArgumentException` when `Structure.ByReference` is used where it shouldn't be (can result in multiply freed memory or other unexpected behavior) - [@twall](https://github.com/twall).
|
||||
* [#243](https://github.com/twall/jna/issues/243): Automatically accommodate long library paths on Windows which would otherwise fail - [@twall](https://github.com/twall).
|
||||
* [#241](https://github.com/twall/jna/issues/241) - Added `com.sun.jna.platform.win32.Shell32.SHAppBarMessage` - [@bsorrentino](https://github.com/bsorrentino).
|
||||
* Make `Structure.read/writeField()` protected to facilitate per-field overrides - [@twall](https://github.com/twall).
|
||||
* Speed up callback lookup where large numbers of native function pointers are in use - [@twall](https://github.com/twall).
|
||||
|
||||
Bug Fixes
|
||||
---------
|
||||
* [#213](https://github.com/twall/jna/pull/213): Fixed `Structure.toString()` not to dump memory when `jna.dump_memory` is false - [@tomohiron](https://github.com/tomohiron).
|
||||
* Use dedicated TLS to indicate callback detach state, to avoid any potential conflicts with last error storage - [@twall](https://github.com/twall).
|
||||
* [#173](https://github.com/twall/jna/issues/173): Fixed OSX 10.8/Xcode 4+ builds, web start path with Oracle 1.7 JDK - [@mkjellman](https://github.com/mkjellman).
|
||||
* [#215](https://github.com/twall/jna/issues/215): Forced use of XSI `strerror_r` on linux - [LionelCons](https://github.com/LionelCons).
|
||||
* [#214](https://github.com/twall/jna/issues/214): Don't map library names when an absolute path is provided - [@twall](https://github.com/twall).
|
||||
* [#218](https://github.com/twall/jna/issues/218): Explicitly handled broken Android `SecurityManager` implementation - [@twall](https://github.com/twall).
|
||||
* [#223](https://github.com/twall/jna/issues/223): Fixed layout/size derivation for unions - [@twall](https://github.com/twall).
|
||||
* [#229](https://github.com/twall/jna/issues/229): Added `CreateProcessW` (Unicode version) - [@twall](https://github.com/twall).
|
||||
* Avoid solaris/x86 JVM bug w/library open flags - [@twall](https://github.com/twall).
|
||||
* Fixed NPE returning wide string from a direct-mapped function - [@twall](https://github.com/twall).
|
||||
* [#237](https://github.com/twall/jna/issues/237): Fix LastErrorException/getLastError on AIX - [@skissane](https://github.com/skissane).
|
||||
* [#228](https://github.com/twall/jna/issues/228): Fix win32/win64 crashes due to LastErrorException buffer overruns (`snprintf` on windows is broken) - [@davidhoyt](https://github.com/davidhoyt).
|
||||
|
||||
Release 3.5.2
|
||||
=============
|
||||
|
||||
Features
|
||||
--------
|
||||
* Basic [COM support](https://github.com/twall/jna/blob/master/www/PlatformLibrary.md) for w32 - [@wolftobias](https://github.com/wolftobias).
|
||||
* Avoid superfluous Structure memory allocation by using Structure(Pointer) ctors if available - [@twall](https://github.com/twall).
|
||||
* [PR#120](https://github.com/twall/jna/pull/120): Provide methods for extracting native libraries from the class path for use by JNA - [@Zlika](https://github.com/Zlika).
|
||||
* [PR#163](https://github.com/twall/jna/pull/163): The Java `GUID` structure can be used directly as alternative to `Ole32Util.getGUIDFromString()` - [@wolftobias](https://github.com/wolftobias).
|
||||
* [PR#163](https://github.com/twall/jna/pull/163): Ported Win32 `dbt.h` - [@wolftobias](https://github.com/wolftobias).
|
||||
* [PR#163](https://github.com/twall/jna/pull/163): Added Win32 `WTSRegisterSessionNotification()` and `WTSUnRegisterSessionNotification()` from `Wtsapi32.dll` - [@wolftobias](https://github.com/wolftobias).
|
||||
* [PR#163](https://github.com/twall/jna/pull/163): Added Win32 `native_window_msg` that creates windows, registers for USB device and logon/logoff notifications - [@wolftobias](https://github.com/wolftobias).
|
||||
* [PR#178](https://github.com/twall/jna/pull/178): Added Win32 `USER_INFO_10` structure from `LMAccess.h` - [@davidmc24](https://github.com/davidmc24).
|
||||
* [PR#192](https://github.com/twall/jna/pull/192): Added Win32 `SHGetSpecialFolderPath()` and initialization file (.ini) API functions from `kernel32.dll` - [@headcrashing](https://github.com/headcrashing).
|
||||
* [PR#194](https://github.com/twall/jna/pull/194): Added Unit Test for `CLSIDFromProgID()` - [@headcrashing](https://github.com/headcrashing).
|
||||
* [PR#196](https://github.com/twall/jna/pull/196): Added Win32 `RegisterWindowMessage()` and new wrapper `User32Util` for convenient use of `RegisterWindowMessage`, `CreateWindow` and `CreateWindowEx` - [@headcrashing](https://github.com/headcrashing).
|
||||
* [PR#187](https://github.com/twall/jna/pull/187): Allow StructureFieldOrderTest unit test in platform project to run on Linux. - [@bhamail](https://github.com/bhamail).
|
||||
|
||||
Bug Fixes
|
||||
---------
|
||||
* [PR#180](https://github.com/twall/jna/pull/180): Fix: added missing fields in `XEvents.getFieldOrder()` - [@xwizard](https://github.com/xwizard).
|
||||
* [PR#183](https://github.com/twall/jna/pull/183): Fix `LMAccess.GROUP_INFO_3.getFieldOrder()` to return correct fields names - [@bhamail](https://github.com/bhamail).
|
||||
* [PR#187](https://github.com/twall/jna/pull/187): Fix `getFieldOrder()` to return correct field names for some X11 structures - [@bhamail](https://github.com/bhamail).
|
||||
* Remove deprecated methods on Memory (getSize,isValid) and Structure (getSize) - [@twall](https://github.com/twall).
|
||||
* Remove problematic AWT check via `Class.forName("java.awt.Component")` (see [here](https://bugs.eclipse.org/bugs/show_bug.cgi?id=388170)) - [@twall](https://github.com/twall).
|
||||
* [PR#210](https://github.com/twall/jna/pull/210) Add OSGI processor specs for Mac OS X - [@bertfrees](https://github.com/bertfrees).
|
||||
* [PR#174](https://github.com/twall/jna/pull/174): Recompile linux-amd64 natives to remove glibc-2.11 dependencies, now requires only 2.2.5 or better - [@twall](https://github.com/twall).
|
||||
* [PR#183](https://github.com/twall/jna/pull/183): Added `StructureFieldOrderInspector` unit test utility to scan for `Structure` field issues; see: `com.sun.jna.platform.StructureFieldOrderTest.testMethodGetFieldOrder` - [@bhamail](https://github.com/bhamail).
|
||||
* [PR#187](https://github.com/twall/jna/pull/187): Allow `StructureFieldOrderTest` unit test in platform project to run on Linux - [@bhamail](https://github.com/bhamail).
|
||||
* [#206](https://github.com/twall/jna/issues/206): Fix `moveToTrash()` on OSX to work with symlinks - [@twall](https://github.com/twall).
|
||||
* Fix NPE if `Thread.getContextClassLoader()` returns `null` - [@twall](https://github.com/twall).
|
||||
|
||||
Release 3.5.1
|
||||
=============
|
||||
|
||||
Bug Fixes
|
||||
---------
|
||||
* Fix bug where string fields sometimes failed to be writtern - [@twall](https://github.com/twall) (roman kisluhin).
|
||||
* [PR#145](https://github.com/twall/jna/pull/145): Fix `Netapi32Util.getDomainTrusts()` returns "empty" domain object - [@aikidojohn](https://github.com/aikidojohn).
|
||||
* [PR#145](https://github.com/twall/jna/pull/145): Fix `Netapi32.getDC()` - added missing fields in `DOMAIN_CONTROLLER_INFO` - [@aikidojohn](https://github.com/aikidojohn).
|
||||
* [PR#151](https://github.com/twall/jna/pull/151): 'platform.jar' in the dist directory was not updated for release 3.5.0. (The 'platform.jar' published to maven central was correct.)
|
||||
|
||||
Release 3.5.0
|
||||
=============
|
||||
|
||||
Features
|
||||
--------
|
||||
* [#62](https://github.com/twall/jna/issues/62) If a callback is required to reside in a DLL, use [`DLLCallback`](http://twall.github.com/jna/3.5.1/javadoc/com/sun/jna/win32/DLLCallback.html) to tag your Callback object - [@twall](https://github.com/twall).
|
||||
* `Structure.getFieldOrder()` supersedes `Structure.setFieldOrder()` and is now required - [@twall](https://github.com/twall).
|
||||
* Search `~/Library/Frameworks` and `/Library/Frameworks` on OSX - [@shaneholloway](https://github.com/shaneholloway).
|
||||
* Automatic cleanup of native threads (based on suggestions from neil smith) - [@twall](https://github.com/twall).
|
||||
* Add `android-arm` target - [@ochafik](https://github.com/ochafik), [@twall](https://github.com/twall).
|
||||
* Add `jna.tmpdir` to override temporary JNA storage location - [@twall](https://github.com/twall).
|
||||
* Add `EXTRA_MAKE_OPTS` ant property to override make variables - [@twall](https://github.com/twall).
|
||||
* Add `Library.OPTION_OPEN_FLAGS` to customize dlopen behavior - [@twall](https://github.com/twall).
|
||||
* [#113](https://github.com/twall/jna/issues/113), [#114](https://github.com/twall/jna/issues/114): Add support for GNU/kFreeBSD and debian multi-arch distros - [@twall](https://github.com/twall).
|
||||
|
||||
Bug Fixes
|
||||
---------
|
||||
* Fix `Advapi32Util.registryGetValues()` tried to allocate memory for a zero-length `REG_BINARY` value - [@phailwhale22](https://github.com/phailwhale22).
|
||||
* Fix crash in direct mode callbacks with certain type conversions - [@twall](https://github.com/twall).
|
||||
* More thoroughly propagate unexpected exceptions generated in jnidispatch - [@twall](https://github.com/twall).
|
||||
* Cleanup maven poms and publishing to central repo - [@bhamail](https://github.com/bhamail).
|
||||
* [#129](https://github.com/twall/jna/issues/129): Allow `Memory` field in structure - [@twall](https://github.com/twall).
|
||||
* Preserve `PointerType` fields on `Structure.read()` if unchanged - [@twall](https://github.com/twall).
|
||||
* [#128](https://github.com/twall/jna/issues/128): Fix masking extracting DWORD upper and lower WORD values - [@twall](https://github.com/twall).
|
||||
* [#135](https://github.com/twall/jna/issues/135): Fix for `Advapi32Util.registryGetValues()` when reading zero length values - [@danwi](https://github.com/danwi).
|
||||
|
||||
Release 3.4.2
|
||||
=============
|
||||
|
||||
Features
|
||||
--------
|
||||
* Add `platform.win32.Kernel32.GetEnvironmentVariable` and `platform.win32.Kernel32Util.getEnvironmentVariable` - [@dblock](https://github.com/dblock).
|
||||
* Moved `Kernel32.dll` function definitions from `WinNT.java` into `Kernel32.java` - [@dblock](https://github.com/dblock).
|
||||
* Provide `toPointer()` methods on all `_PTR` types (platform win32) - [@twall](https://github.com/twall).
|
||||
* Provide `ant -Dskip-native` to skip platform native build - [@twall](https://github.com/twall).
|
||||
* Provide `ant -Dheadless=true` to run unit tests headless - [@twall](https://github.com/twall).
|
||||
* Added Windows dev environment instructions - [@twall](https://github.com/twall).
|
||||
|
||||
Bug Fixes
|
||||
---------
|
||||
* Ensure platform win32 classes use unsigned where appropriate (`ULONG_PTR`, `UINT_PTR`, `ULONGLONG`, `WORD`, `DWORDLONG`) - [@twall](https://github.com/twall).
|
||||
* [#71](https://github.com/twall/jna/issues/71), [#73](https://github.com/twall/jna/issues/73): Fix OSGI entries in manifest - [@twall](https://github.com/twall).
|
||||
* [#78](https://github.com/twall/jna/issues/78): Fix NPE in `platform.win32.Netapi32Util.getDomainTrusts` - [@dblock](https://github.com/dblock).
|
||||
* Fix: auto-sync memory for `struct**` arguments (array of struct pointers) - [@twall](https://github.com/twall).
|
||||
* Fix: `platform.win32.Secur32.AcquireCredentialsHandle`, `InitializeSecurityContext` and `AcceptSecurityContext` on Win32 64-bit - [@dblock](https://github.com/dblock).
|
||||
* Fix: avoid overwriting native `char *` or `wchar_t *` fields within structures when unmodified (similar to current operation with pointers) - [@twall](https://github.com/twall).
|
||||
* Fix: `platform.win32.DsGetDC.DS_DOMAIN_TRUSTS` and `DsEnumerateDomainTrusts` on Win32 64-bit - [@trejkaz](https://github.com/trejkaz).
|
||||
* Fix: Crash freeing the wrong pointer in `Netapi32Util.getDomainTrusts` - [@trejkaz](https://github.com/trejkaz).
|
||||
* [#100](https://github.com/twall/jna/issues/100): Fix `platform.win32.W32FileMonitor` - [@dblock](https://github.com/dblock).
|
||||
* Return INT_PTR from `platform.win32.Shell32.ShellExecute`, since returning
|
||||
`HINSTANCE` is useless.
|
||||
* Fix runtime error in some instances where Structure.setFieldOrder is used (never return self when sharing AutoAllocated memory).
|
||||
* [#107](https://github.com/twall/jna/issues/107): `Structure.clear()` always calls `ensureAllocated()` to avoid NPE.
|
||||
* Ensure internal memory pointer is *always* allocated when calling `Structure.useMemory()`, even if layout is not yet determined.
|
||||
|
||||
Release 3.4.1
|
||||
=============
|
||||
|
||||
Features
|
||||
--------
|
||||
* Add 'unsigned' modifier to IntegerType.
|
||||
* Add to `platform.win32.User32`: `GetLastInputInfo`.
|
||||
* Add `platform.win32.WinNT.GetFileType` and `platform.win32.Kernel32Util.getFileType`.
|
||||
* Add to `platform.win32.Kernel32Util`: `getFileType`.
|
||||
|
||||
Bug Fixes
|
||||
---------
|
||||
* Re-build linux-amd and linux-i386 against older versions of glibc (2.2.5 and
|
||||
2.1.3 respectively).
|
||||
* Properly initialize first printer info struct in winspool library.
|
||||
* Properly support getting and setting zero-array-length `REG_MULTI_SZ` values on Win32.
|
||||
* Fixed SID in Win32 `USER_INFO_23` and `GROUP_INFO_3`.
|
||||
* Fixed passing domain name into Win32 `Netapi32Util.getUserInfo`.
|
||||
|
||||
Release 3.4.0
|
||||
=============
|
||||
|
||||
Features
|
||||
--------
|
||||
* Provide `jna.nosys=true` to avoid loading any system-provided JNA (useful for local build/development).
|
||||
* Allow override of default jnidispatch library name with `jna.boot.library.name` system property.
|
||||
* Throw an Error if a system install of JNA is incompatible or if JNA's JNI library does not match.
|
||||
* Disable automatic jnidispatch unpacking with `jna.nounpack=true`.
|
||||
* Automatically look up system error messages for LastErrorException.
|
||||
* Improved callback thread-mapping support; re-use, rename, and group callback
|
||||
threads.
|
||||
* Cache structure layout results, improving performance of structure creation.
|
||||
* linux/arm 32-bit support (hardware provided by Alex Lam).
|
||||
* linux/ppc 32-bit support (hardware provided by Fritiof Hedman).
|
||||
* Preliminary linux/ia64, linux/ppc64 support (thanks to Laurent Guerby and the GCC compile farm).
|
||||
* Windows CE/Mobile support (w32ce-arm) (resources provided by andrea antonello and Hydrologis SRL).
|
||||
* linux multi-arch support (kohsuke).
|
||||
* Added REG_QWORD registry type support
|
||||
* Add to `platform.unix.x11`: `XGrabKey`, `XUngrabKey`, `XSetErrorHandler`.
|
||||
* Add to `platform.mac.Carbon`: `GetEventDispatcherTarget`, `InstallEventHandler`, `RegisterEventHotKey`, `GetEventParameter`, `RemoveEventHandler`, `UnregisterEventHotKey`.
|
||||
* Add to `platform.win32.Kernel32`: `CopyFile`, `MoveFile`, `MoveFileEx`, `CreateProcess`, `SetEnvironmentVariables`, `GetFileTime`, `SetFileTime`, `SetFileAttributes`, `DeviceIoControl`, `GetDiskFreeSpaceEx`, `CreateToolhelp32Snapshot`, `Process32First`, `Process32Next`.
|
||||
* Add to `platform.win32.Msi`: `MsiGetComponentPath`, `MsiLocateComponent`, `MsiGetProductCode`, `MsiEnumComponents`.
|
||||
* Add to `platform.win32.User32`: `RegisterHotKey`, `UnregisterHotKey`
|
||||
* Add to `platform.win32.SetupApi`: `SetupDiGetClassDevs`, `SetupDiDestroyDeviceInfoList`, `SetupDiEnumDeviceInterfaces`, `SetupDiGetDeviceInterfaceDetail`, `SetupDiGetDeviceRegistryProperty`.
|
||||
* Add `platform.win32.Shell32.ShellExecute`.
|
||||
* Add to `platform.win32.User32`: `SetParent`, `IsWindowVisible`, `MoveWindow`, `SetWindowPos`, `AttachInputThread`, `SetForegroundWindow`, `GetForegroundWindow`, `SetFocus`, `SendInput`, `WaitForInputIdle`, `InvalidateRect`, `RedrawWindow`, `GetWindow`, `UpdateWindow`, `ShowWindow`, `CloseWindow`.
|
||||
* Add to `platform.win32.Version`: `GetFileVersionInfoSize`, `GetFileVersionInfo`, `VerQueryValue`.
|
||||
* Add to `platform.win32.Advapi32`: `GetFileSecurity`, `RegQueryValueEx(...Long...)`.
|
||||
* Add to `platform.win32.Netapi32`: `NetUserGetInfo`.
|
||||
|
||||
Bug Fixes
|
||||
--------
|
||||
* Revise cleanup of in-use temporary files on win32 (issue 6).
|
||||
* Fix structure alignment issues on linux/ppc.
|
||||
* Fix structure alignment issues on linux/arm.
|
||||
* Account for NIO Buffer position (JIRA issue 185).
|
||||
* Avoid crash with very long Strings (> 150k in length).
|
||||
* Fix bug tracking Memory with an associated direct ByteBuffer.
|
||||
* Fix bug handling structs by value when type mappers are in effect (JIRA issue 188).
|
||||
|
||||
Release 3.3.0
|
||||
=============
|
||||
|
||||
Features
|
||||
--------
|
||||
|
||||
* Facilitate `Memory` subclasses (jbellis).
|
||||
* Allow multiple fields of the same type in Unions (Francis Barber).
|
||||
* Add `platform.win32.Advapi32.AdjustTokenPrivileges`, `platform.win32.Advapi32.LookupPrivilegeName`, `platform.win32.Advapi32.LookupPrivilegeValue`, `platform.win32.Advapi32.ImpersonateSelf`.
|
||||
* Add `platform.win32.Advapi32.DuplicateTokenEx`, `platform.win32.Advapi32.CreateProcessAsUser`, `platform.win32.Kernel32.GetExitCodeProcess`, `platform.win32.Kernel32.TerminateProcess`, `platform.win32.Kernel32.ReadFile`, `platform.win32.Kernel32.CreatePipe`, `platform.win32.Kernel32.SetHandleInformation` and related constants / structures in `platform.win32.WinBase` and `platform.win32.WinNT`. Please note that the `SECURITY_ATTRIBUTES` structure has been moved from `platform.win32.WinNT` to `platform.win32.WinBase`.
|
||||
* Add `platform.win32.Kernel32.DeleteFile` and `platform.win32.Kernel32Util.deleteFile`.
|
||||
* Add `platform.win32.Kernel32.GetFileAttributes` and `platform.win32.Kernel32Util.getFileAttributes`.
|
||||
* Add `platform.win32.Kernel32.GetTickCount`.
|
||||
* Add Win32 Service functions to `platform.win32.Advapi32`.
|
||||
* Add `platform.win32.W32ServiceManager` and `W32Service`.
|
||||
* Add Win32 Event Logging functions to `platform.win32.Advapi32` and `platform.win32.Advapi32Util.EventLogIterator`.
|
||||
* `platform.win32.Advapi32Util.registryCreateKey` returns `true` if key was created, `false` if it already exists.
|
||||
* Add `REG_BINARY`, `REG_EXPAND_SZ` and `REG_MULTI_SZ` support to `platform.win32.Advapi32Util` registry functions.
|
||||
* Reduce JNI crossings in a number of native methods, moving object creation out into pure Java code.
|
||||
|
||||
Bug Fixes
|
||||
---------
|
||||
|
||||
* Move all native functions into `com.sun.jna.Native`, to ensure that all dependent classes must be disposed before the `Native` class is unloaded. Note that this change is incompatible with all previous JNA native libraries.
|
||||
* Fix `platform.win32.Kernel32.GetNativeSystemInfo` and `GetSystemInfo` AV on Win64.
|
||||
* Fix several potential minor bugs as reported by TvT.
|
||||
* Fix bug in Structure.StructureSet.toString (Blair Zajac), exposed by Tomcat ThreadLocal cleanup.
|
||||
* Fix several bugs when using Structure(Pointer) ctor and array fields (Samuel Audet).
|
||||
|
||||
Release 3.2.7
|
||||
=============
|
||||
|
||||
Features
|
||||
--------
|
||||
|
||||
* Add native peer value accessors for Pointer
|
||||
* The `jna.library.path` property is now re-evaluated whenever a native library is loaded. Previously this value was cached when the JNA classes loaded.
|
||||
* `Native.loadLibrary` can now load `.drv` files.
|
||||
* Refactor `com.sun.jna.platform.win32.WINBASE` into `WinDef`, `WinNT` and `BaseTSD`, matching Windows SDK headers.
|
||||
* Refactor constants from `com.sun.jna.platform.win32.GDI32` into `WinGDI`, matching Windows SDK headers.
|
||||
* Refactor constants from `com.sun.jna.platform.win32.User32` into `WinUser`, matching Windows SDK headers.
|
||||
* Refactor `platform.win32.WinNT.LARGE_INTEGER` into a union.
|
||||
* Add `platform.win32.ObjBase`, `com.sun.jna.platform.win32.Ole32.CoInitializeEx`, `CoUninitialize`, and `CoCreateInstance`.
|
||||
* Add `platform.win32.Oleaut32.SysAllocString` and `SysFreeString`.
|
||||
* Add `platform.win32.Secur32.ImpersonateSecurityContext` and `RevertSecurityContext`.
|
||||
* Add `platform.win32.WinNT.WELL_KNOWN_SID_TYPE`, `SECURITY_MAX_SID_SIZE` and other related SID-related constants.
|
||||
* Add `platform.win32.Advapi32.CreateWellKnownSid` and `IsWellKnownSid` and `com.sun.jna.platform.win32.Advapi32Util.isWellKnownSid`.
|
||||
* Add `platform.win32.Kernel32.GetVersion`, `GetVersionEx`, `GetSystemInfo`, `GetNativeSystemInfo`, `GlobalMemoryStatusEx`, `GetLogicalDriveStrings` and `IsWow64Process`.
|
||||
* Add `platform.win32.Kernel32Util.getLogicalDriveStrings`.
|
||||
* Add `platform.win32.User32.GetSystemMetrics`.
|
||||
* Add `platform.win32.BaseTSD.DWORD_PTR`.
|
||||
* Add `platform.win32.WinBase.SYSTEM_INFO` and `MEMORYSTATUSEX`.
|
||||
* Add `platform.win32.WinNT.OSVERSIONINFOEX`, `VER` constants.
|
||||
* Add `platform.win32.WinDef.ULONGLONG` and `DWORDLONG`.
|
||||
* Add `platform.win32.Shell32.SHGetDesktopFolder` (prep work for Com4JNA).
|
||||
* Add `platform.win32.Winspool.GetPrinterInfo`.
|
||||
* Add `platform.win32.WinspoolUtil.getPrinterInfo1`.
|
||||
* Add `platform.win32.GDI32.GetDeviceCaps`.
|
||||
* Add `platform.win32.GDI32.GetDIBits`.
|
||||
|
||||
Bug Fixes
|
||||
---------
|
||||
|
||||
* Fix `ClassCastException` in `Structure.equals` (issue 152).
|
||||
* Fix bug initializing a structure object from existing memory when the structure has initialized fields (issue 133).
|
||||
* Fix NPE reading an array of string from a pointer when an element of the array is `NULL` (issue 151).
|
||||
* Avoid calling `UnregisterNatives` in native code (issue 154).
|
||||
* Compare unpacked library path against canonical (long) filename (issue 156).
|
||||
* Fix `read()` of uninitialized memory in `platform.win32.Advapi32Util.getTokenGroups` and `getTokenAccount`.
|
||||
* Fix `com.sun.jna.platform.win32.Secur32.QuerySecurityContextToken` to take a `CtxtHandle` instead of `PSecHandle`.
|
||||
* Fix definition of BITMAPINFO (platform/win32).
|
||||
|
||||
Release 3.2.5
|
||||
=============
|
||||
|
||||
Features
|
||||
--------
|
||||
|
||||
* Split code in examples.jar into a contrib platform.jar package and individual packages for demos.
|
||||
* Fix Eclipse build and added Eclipse projects for all contrib samples, import projects from jnalib and contrib.
|
||||
* Ensure Structure fields correctly ordered when inherited.
|
||||
* Use explicit Structure field whenever provided, regardless of whether the VM requires it.
|
||||
* Add Win32 mappings for two dozen functions from Kernel32.dll, Advapi32.dll, Netapi32.dll, Secur32.dll, NtDll.dll, Ole32.dll, Shell32.dll and Crypt32.dll to com.sun.jna.platform.win32.
|
||||
* Port parts of WinError.h, WinNT.h, LMAccess.h, LMCons.h, LMErr.h, LMJoin.h, NTStatus.h, ShlObj.h, WinDef.h, ShellApi.h, Wdm.h, WinReg.h, WinCrypt.h, Sspi.h, Guid.h, NtSecApi.h and DsGetDc.h.
|
||||
* Add Win32 simplified utility interfaces Kernel32Util, Advapi32Util, Netapi32Util, Crypt32Util, NtDllUtil, Shell32Util, Ole32Util and Secur32Util to com.sun.jna.platform.win32.
|
||||
* Support unicode paths in W32FileUtils.
|
||||
* Fix exception during dispose in W32FileMonitor.
|
||||
|
||||
Bug Fixes
|
||||
---------
|
||||
|
||||
* Provide String.replace for 1.4 compatibility.
|
||||
* Avoid allocating memory when Structure is provided a pointer in the ctor.
|
||||
* Ensure proper value returned in Pointer.getValue() for non-null, unchanged NIO Buffer values.
|
||||
* Use 1.4-compatible URI generation (issue 149).
|
||||
|
||||
Release 3.2.4
|
||||
=============
|
||||
|
||||
Features
|
||||
--------
|
||||
|
||||
* Make Pointer ctor public.
|
||||
* Provide access to Function objects for arbitrary Pointer values.
|
||||
* Add linux/ia64 binaries (bpiwowar). See issue 134 patch.
|
||||
|
||||
Bug Fixes
|
||||
---------
|
||||
|
||||
* Use a more robust method to decode a file-based URL (issue 135).
|
||||
|
||||
Release 3.2.3
|
||||
=============
|
||||
|
||||
Features
|
||||
--------
|
||||
|
||||
* Include version information in code in case package information lost.
|
||||
|
||||
Bug Fixes
|
||||
---------
|
||||
|
||||
* Fix WindowUtils exception on mouse over TrayIcon.
|
||||
* Fix bug toggling windows transparent/opaque (win32/OSX).
|
||||
* Avoid overwriting unchanged Pointer values in arrays (function calls with Pointer[] and Structure.read).
|
||||
* Ensure Structure fields marked `final` are never written.
|
||||
* Fix bug preventing proper population Structure.ByReference fields on Structure read.
|
||||
* Ensure double buffering is disabled in components added to a transparent window.
|
||||
* Fix UnsatisfiedLinkError attempting to load system libraries under Web Start.
|
||||
* Fix loading Web Start-provided libraries on OSX (libraries must have a .jnilib suffix under Web Start).
|
||||
* Properly include sources in Maven zip file (Issue 129).
|
||||
|
||||
Release 3.2.2
|
||||
=============
|
||||
|
||||
Features
|
||||
--------
|
||||
|
||||
* Provide length-specified Pointer.getStringArray()
|
||||
|
||||
Bug Fixes
|
||||
---------
|
||||
|
||||
* Fix crash with direct mapping if NULL struct* used (Issue 125).
|
||||
* Fix case where null-valued Structure fields would get non-null values on write.
|
||||
* Synch callback Structure/Structure[] arguments on callback return.
|
||||
* Fix NPE when mapping an interface to the current process.
|
||||
* Automatically load proper C library version from current process on Linux (avoids crashing bug on Ubuntu with libc-i686 packages active).
|
||||
* Avoid scanning structure contents in Structure.toString if contents aren't actually used.
|
||||
|
||||
Release 3.2.1
|
||||
==========
|
||||
|
||||
Features
|
||||
--------
|
||||
|
||||
* Add HRESULT, LONG mapping to W32API (marc strapetz).
|
||||
|
||||
|
||||
Bug Fixes
|
||||
---------
|
||||
|
||||
* Fix definition of HWND_BROADCAST in W32API.
|
||||
* Fix memory alignment checking (Issue 121).
|
||||
* Fix Structure equals/hashCode implementation, based on current Java fields rather than strictly native memory contents. Avoid using equals/hashCode when avoiding recursive reads/writes.
|
||||
|
||||
Release 3.2.0
|
||||
=============
|
||||
|
||||
Features
|
||||
--------
|
||||
|
||||
* Handle String, Structure, Callback, Buffer, and primitive arrays in direct mappings. Handle NativeMapped and TypeMapper, with optimized paths for IntegerType and PointerType.
|
||||
* Optionally throw errno/GetLastError as an exception. This is preferred to (and more efficient than) calling Native.getLastError().
|
||||
* Unload/delete native library unpacked from jna.jar if Native class is garbage collected. Only install shutdown hook if using the system class loader.
|
||||
* Auto-write contiguous Structure arrays when first element is written.
|
||||
* Support NativeMapped[] as function arguments for interface-mapped libraries (Issue 90).
|
||||
* Enable function lookup within current process on Windows.
|
||||
|
||||
Bug Fixes
|
||||
---------
|
||||
|
||||
* Restrict recursive structure reads/writes by thread instead of globally. This avoids potentially missed reads/writes with concurrent access (Issue 120).
|
||||
* Ensure Memory is not GC'd and freed if direct NIO buffers mapped to it are extant.
|
||||
* Allow types derived from java.nio.Buffer as Structure fields.
|
||||
|
||||
Release 3.1.0
|
||||
=============
|
||||
|
||||
Features
|
||||
--------
|
||||
|
||||
* Add raw JNI mapping of static Java methods. Performance is about 10X that of traditional JNA interface mapping, although with less type conversion functionality.
|
||||
* Add library option to allow passing/return of Java Objects.
|
||||
* Allow handling of uncaught callback exceptions (Issue 63).
|
||||
* Object oriented interface to X server (see contrib/x11)
|
||||
* Make Memory class more accessible.
|
||||
* Provide Structure ctor with Pointer argument (issue 102).
|
||||
* Allow implicit library access to current process on linux (issue 98).
|
||||
* Open all shared libraries with RTLD_GLOBAL, if applicable. This was the default behavior on OSX and changes the default behavior on linux.
|
||||
* Allow NIO Buffer as Structure field (with limitations) (Issue 57)
|
||||
* Add `size_t` size.
|
||||
|
||||
Bug Fixes
|
||||
---------
|
||||
|
||||
* Run tests with libjsig.so, if available, which fixes some crashes when running tests on 64-bit platforms.
|
||||
* Fix Issue 104.
|
||||
* Fix Issue 94 (Java 1.6 update 10 regression).
|
||||
* Fix Issue 51 (Java 1.6 update 10 regression).
|
||||
* Fix Issue 95.
|
||||
* Fix Issue 101.
|
||||
* Fix Issue 111, memory leak with String-returning Callback.
|
||||
* Fix missing storage of union type information (affects usage of struct/union by value as argument and return type).
|
||||
* Remove non-functional Structure ctors requiring explicit size.
|
||||
|
||||
Release 3.0.9
|
||||
=============
|
||||
|
||||
Bug Fixes
|
||||
---------
|
||||
|
||||
* Fix issue 93 by only manually searching jna.library.path, then falling back to passing the mapped library name to dlopen/LoadLibrary. This fixes an issue in JRUBY where the incorrect libc.so.6 was being loaded.
|
||||
|
||||
Release 3.0.8
|
||||
==========
|
||||
|
||||
Features
|
||||
--------
|
||||
|
||||
* Auto-map Pointer[]/String[]/WString[] return values.
|
||||
* Provide utility functions to convert String to primitive array.
|
||||
* Add jna.library.boot.path property to define the directory that the native stub library is loaded from
|
||||
|
||||
Release 3.0.7
|
||||
==========
|
||||
|
||||
Features
|
||||
--------
|
||||
|
||||
* Improve Win32 loading of libraries with dependencies.
|
||||
|
||||
Bug Fixes
|
||||
---------
|
||||
|
||||
* Fix bug reading structures with PointerType fields, introduced with Pointer field preservation fix.
|
||||
|
||||
Release 3.0.6
|
||||
=============
|
||||
|
||||
Features
|
||||
--------
|
||||
|
||||
* Allow arbitrary callback method names if only one method is defined in the class which implements Callback (colinwalters).
|
||||
* Allow specification of callback type mappers by using a TYPE_MAPPER field (colinwalters).
|
||||
* Allow uninitialized (null-valued) boxed primitives in Structures (colinwalters).
|
||||
* Add convenience methods to set active Union field and value simultaneously (xylo).
|
||||
* Augment Union read/writeField to set the active field.
|
||||
* Allow Structure auto-synch across native calls to be disabled.
|
||||
* Win64 support.
|
||||
|
||||
Bug Fixes
|
||||
---------
|
||||
|
||||
* Avoid overwriting unchanged Structure fields of type Pointer.
|
||||
* Avoid more content dragging on OSX or warn if it's too late.
|
||||
* Fix UnsatisfiedLinkError using transparent window on Win2K.
|
||||
* Fix memory leak with callbacks called from native threads with no Java context (johnwallace).
|
||||
* Defer structure size calculation if type mapper not yet set, allowing type mapper to be set in derived constructors (colinwalters).
|
||||
* Ensure structure memory is allocated in Structure.read/writeField.
|
||||
|
||||
Release 3.0.5
|
||||
=============
|
||||
|
||||
Features
|
||||
--------
|
||||
|
||||
* Allow explicit declaration of field order for VMs which have an unpredictable field order.
|
||||
* Check for w32 libraries with a "lib" prefix in addition to normal lookup.
|
||||
* Allow String[]/WString[] as callback argument/return value (assume NULL-terminated array).
|
||||
* Add Solaris8 compatibility to sunos-sparc build (Corey Puffalt).
|
||||
* Look up libraries using web start library path, if appropriate (Corey Puffalt).
|
||||
* Use constants to return integer boolean values.
|
||||
|
||||
Bug Fixes
|
||||
---------
|
||||
|
||||
* Properly track cursor on alpha-masked windows.
|
||||
* Avoid searching /lib or /usr/lib on 64-bit Linux.
|
||||
* Avoid using incorrect version of a library when both 32- and 64-bit versions are found.
|
||||
* Avoid transparent window events always dragging window bug on OSX.
|
||||
* Fix division by zero error calculating structure size on OSX/ppc.
|
||||
* Avoid overwriting initialized NativeMapped Structure fields when calculating structure size.
|
||||
* Fix NPE reading back into StringArray.
|
||||
|
||||
Release 3.0.4
|
||||
=============
|
||||
|
||||
Features
|
||||
--------
|
||||
|
||||
* Automatically write contents of Structure.ByReference fields on Structure.write().
|
||||
* Use the actual parameter type in Function invocations if no parameter type information is available (whether method is missing or untyped varargs).
|
||||
* Augmented X11 library mappings (xylo).
|
||||
* Support read/write of NativeMapped arrays within Structure (notably NativeLong).
|
||||
|
||||
Bug Fixes
|
||||
---------
|
||||
|
||||
* Fix library load error when /usr/lib32 and /usr/lib both exist (linux) (Marek Slama).
|
||||
* Avoid incorrect matches against libraries named with the same prefix (e.g. libc-client.so vs libc.so) (xylo).
|
||||
* Properly handle arrays of NativeMapped (e.g. NativeLong) as a Structure field (stefan endrullis).
|
||||
* Ensure structure size calculated prior to setting union active type.
|
||||
* XID is 64-bits on 64-bit X clients (xylo).
|
||||
* Ensure proper arch name is used on Debian (amd64 instead of x86_64).
|
||||
|
||||
Release 3.0.3
|
||||
=============
|
||||
|
||||
Features
|
||||
--------
|
||||
|
||||
* Enable build/run using IBM's J9 VM (leonardo).
|
||||
* Make StdCallFunctionMapper attempt a leading underscore if the simpler mapping doesn't work.
|
||||
* Allow Structure.read to overwrite final fields (may not work on some 1.4 VMs).
|
||||
|
||||
Bug Fixes
|
||||
---------
|
||||
|
||||
* Fix NPE when passing an array of Structure.ByReference.
|
||||
* Compare entire linux library version when finding a match.
|
||||
* Don't pass struct by value unless the method signature declares it.
|
||||
* Restrict custom first element structure alignment to OSX/ppc.
|
||||
* Improve performance and reduce memory footprint for window masks. Optimize polygon-based masks on w32. Use XFillRectangles on X11.
|
||||
* Fix linkage settings on sunos-amd64 to avoid relocation errors.
|
||||
* Fix callback allocation code on w32, solaris, freebsd, darwin (libffi was misconfigured).
|
||||
* Fix bug when NativeMapped fields are used in a Structure.ByValue instance.
|
||||
* Fix NPE calling Structure.read() before memory is initialized.
|
||||
* Fix NPE calling Structure.read/write with uninitialized NativeMapped fields.
|
||||
|
||||
Release 3.0.2
|
||||
=============
|
||||
|
||||
Features
|
||||
--------
|
||||
|
||||
* Attempt to force unload of jnidispatch library prior to deleting it (w32).
|
||||
* Added amd64 targets for OSX, FreeBSD, and Solaris.
|
||||
|
||||
Bug Fixes
|
||||
---------
|
||||
|
||||
* Reduce space allocated for invocation arguments.
|
||||
* Fix NPE when NativeMapped type is used in a Structure.
|
||||
* Fix some X11 type mappings for 64-bit.
|
||||
* Fix OSX Leopard/JRE1.5+ window transparency.
|
||||
* Fix window alpha compositing on X11.
|
||||
* Fix loading of libraries with unicode names on OSX.
|
||||
|
||||
Release 3.0.1
|
||||
=============
|
||||
|
||||
Features
|
||||
--------
|
||||
|
||||
* Improve transparent window drawing performance on w32
|
||||
* Use closure allocation from libffi
|
||||
|
||||
Bug Fixes
|
||||
---------
|
||||
|
||||
* Ensure nested structure arrays initialized with Structure.toArray use the appropriate native memory.
|
||||
* Ensure structure size is calculated prior to converting to array
|
||||
* Avoid creating new windows when setting a window mask
|
||||
* Fix bug in Pointer.setChar.
|
||||
|
||||
Release 3.0
|
||||
===========
|
||||
|
||||
Features
|
||||
--------
|
||||
|
||||
* More supported platforms, via GCC's libffi (wmeissner)
|
||||
* Support struct by value as parameter and return value (duncan)
|
||||
* Support struct by reference within structures
|
||||
* Provide access to native peer for java.awt.Component
|
||||
* Provide access to native peer on OS X.
|
||||
* Support MINGW32 builds (fullung)
|
||||
* Allow per-field Structure read/write by field name
|
||||
* Avoid writing Structure fields marked 'volatile'
|
||||
* Read and wrap function pointers in Structure fields when read with a Java proxy to allow easy Java-side invocation (Ken Larson)
|
||||
* Support array-backed Buffers as arguments (wmeissner)
|
||||
* Auto-conversion of custom types (wmeissner)
|
||||
* Allow pointer type-safety
|
||||
* Optional VM crash protection, via Native.setProtected(boolean)
|
||||
* Auto-convert WString[]
|
||||
* Provide library synchronization wrapper similar to Collections.synchronizedX
|
||||
* Support lookup of OSX framework libraries by name
|
||||
* Explicit access to shared library global data
|
||||
* Invocation interception to facilitate translation of C preprocessor macros and inline functions
|
||||
* Provide utility to determine Web Start native library cache location; auto-include this path if jnidispatch is included as a <nativelib> (robertengels)
|
||||
* Provide access to aligned memory
|
||||
* Versioning information embedded in jna.jar and native library
|
||||
|
||||
Bug Fixes
|
||||
---------
|
||||
|
||||
* Avoid attempts to free native library if it failed to load (wmeissner)
|
||||
* Explicitly check method signatures for varargs instead of heuristically guessing (wmeissner)
|
||||
* Disallow declaring Pointer-derived fields in Structures (Function, Memory)
|
||||
* Ensure Object.toString/hashCode/equals methods are intercepted on proxyied interfaces
|
||||
* Update X11 library for 64-bit use (wmeissner)
|
||||
* Properly map arrays of char*/wchar_t* under w32
|
||||
* Allow Pointer[] as a Structure field and Function argument
|
||||
* Fix some misleading Structure error messages
|
||||
* Properly preserve/return GetLastError/errno after native calls
|
||||
* Allocate executable memory on w32 to avoid errors with hardware-enforced data execution protection (DEP)
|
||||
* Fix VM crash on w32 stdcall callbacks
|
||||
* Use long offsets and sizes rather than ints (64-bit safe)
|
||||
* Properly clean up references and release closure memory on JNI_Unload
|
||||
* Use simpler AWT/JAWT library loading workaround
|
||||
* Avoid changing array references within a Structure on read
|
||||
|
||||
Release 2.5
|
||||
===========
|
||||
|
||||
Features
|
||||
--------
|
||||
|
||||
* Unions
|
||||
* Optimized shaped windows (chris deckers & olivier chafik); instantiation time improved by about 2-3 orders of magnitude for large, mostly contiguous shapes
|
||||
* Provide type mapping in callback arguments/results
|
||||
* Provide access to ByteBuffer direct address as a Pointer
|
||||
* Provide customization of native string encoding with jna.encoding system property
|
||||
|
||||
Bug Fixes
|
||||
---------
|
||||
|
||||
* Properly handle VMs with reversed Structure member storage
|
||||
* Avoid making window undecorated when clearing window mask on X11
|
||||
* Fix structure alignment bug on OSX/PPC when first element is > 4 bytes in size
|
||||
* Clearing OSX window mask by setting to MASK_NONE now works properly
|
||||
* Avoid index exceptions if native buffers are not NUL-terminated on string conversions
|
||||
* Write initialized Structure[] argument memory prior to function calls
|
||||
* Fix IllegalArgumentException reading WString into a Structure
|
||||
* Clear memory when allocating a structure block (fixes VM crash)
|
||||
* Remove versioned JAWT dependency on OSX, allowing use on 10.3/JRE1.4.
|
||||
|
||||
Release 2.4
|
||||
===========
|
||||
|
||||
Features
|
||||
--------
|
||||
|
||||
* Explicitly support unaligned structures
|
||||
* Auto-reallocate structure arrays
|
||||
* Automatic handling of w32 UNICODE/ASCII variants
|
||||
* Automatic mapping of decorated w32 stdcall function names
|
||||
* Customizable, automatic type conversion of arguments and results (wmeissner)
|
||||
* Support char*[] arguments as Java String[]
|
||||
* Structure supports Callback members (wmeissner)
|
||||
* getByteBuffer from Pointer/Memory (wmeissner)
|
||||
* Allow GC of native libraries
|
||||
* Facilitate use from non-Java contexts (JRuby et al.) (wmeissner)
|
||||
* Improve library path searching (wmeissner)
|
||||
* Handle Structure[] arguments
|
||||
* Handle native long arguments and return values
|
||||
* Handle direct and array-based ByteBuffer arguments (wmeissner)
|
||||
* Change default w32 build to use GCC (it's free, yo)
|
||||
|
||||
Bug Fixes
|
||||
---------
|
||||
|
||||
* Structure.toArray failed to initialize members
|
||||
* Disallow explicit free of Structure/Memory
|
||||
* Ensure native libraries are only loaded once until released
|
||||
* Properly handle NULL when the return value is a Structure
|
||||
* Proper conversion to wchar_t on linux
|
||||
* Copy full length of Java strings to C strings instead of stopping when a NUL character is encountered
|
||||
|
||||
+504
@@ -0,0 +1,504 @@
|
||||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
Version 2.1, February 1999
|
||||
|
||||
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
|
||||
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
[This is the first released version of the Lesser GPL. It also counts
|
||||
as the successor of the GNU Library Public License, version 2, hence
|
||||
the version number 2.1.]
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
Licenses are intended to guarantee your freedom to share and change
|
||||
free software--to make sure the software is free for all its users.
|
||||
|
||||
This license, the Lesser General Public License, applies to some
|
||||
specially designated software packages--typically libraries--of the
|
||||
Free Software Foundation and other authors who decide to use it. You
|
||||
can use it too, but we suggest you first think carefully about whether
|
||||
this license or the ordinary General Public License is the better
|
||||
strategy to use in any particular case, based on the explanations below.
|
||||
|
||||
When we speak of free software, we are referring to freedom of use,
|
||||
not price. Our General Public Licenses are designed to make sure that
|
||||
you have the freedom to distribute copies of free software (and charge
|
||||
for this service if you wish); that you receive source code or can get
|
||||
it if you want it; that you can change the software and use pieces of
|
||||
it in new free programs; and that you are informed that you can do
|
||||
these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
distributors to deny you these rights or to ask you to surrender these
|
||||
rights. These restrictions translate to certain responsibilities for
|
||||
you if you distribute copies of the library or if you modify it.
|
||||
|
||||
For example, if you distribute copies of the library, whether gratis
|
||||
or for a fee, you must give the recipients all the rights that we gave
|
||||
you. You must make sure that they, too, receive or can get the source
|
||||
code. If you link other code with the library, you must provide
|
||||
complete object files to the recipients, so that they can relink them
|
||||
with the library after making changes to the library and recompiling
|
||||
it. And you must show them these terms so they know their rights.
|
||||
|
||||
We protect your rights with a two-step method: (1) we copyright the
|
||||
library, and (2) we offer you this license, which gives you legal
|
||||
permission to copy, distribute and/or modify the library.
|
||||
|
||||
To protect each distributor, we want to make it very clear that
|
||||
there is no warranty for the free library. Also, if the library is
|
||||
modified by someone else and passed on, the recipients should know
|
||||
that what they have is not the original version, so that the original
|
||||
author's reputation will not be affected by problems that might be
|
||||
introduced by others.
|
||||
|
||||
Finally, software patents pose a constant threat to the existence of
|
||||
any free program. We wish to make sure that a company cannot
|
||||
effectively restrict the users of a free program by obtaining a
|
||||
restrictive license from a patent holder. Therefore, we insist that
|
||||
any patent license obtained for a version of the library must be
|
||||
consistent with the full freedom of use specified in this license.
|
||||
|
||||
Most GNU software, including some libraries, is covered by the
|
||||
ordinary GNU General Public License. This license, the GNU Lesser
|
||||
General Public License, applies to certain designated libraries, and
|
||||
is quite different from the ordinary General Public License. We use
|
||||
this license for certain libraries in order to permit linking those
|
||||
libraries into non-free programs.
|
||||
|
||||
When a program is linked with a library, whether statically or using
|
||||
a shared library, the combination of the two is legally speaking a
|
||||
combined work, a derivative of the original library. The ordinary
|
||||
General Public License therefore permits such linking only if the
|
||||
entire combination fits its criteria of freedom. The Lesser General
|
||||
Public License permits more lax criteria for linking other code with
|
||||
the library.
|
||||
|
||||
We call this license the "Lesser" General Public License because it
|
||||
does Less to protect the user's freedom than the ordinary General
|
||||
Public License. It also provides other free software developers Less
|
||||
of an advantage over competing non-free programs. These disadvantages
|
||||
are the reason we use the ordinary General Public License for many
|
||||
libraries. However, the Lesser license provides advantages in certain
|
||||
special circumstances.
|
||||
|
||||
For example, on rare occasions, there may be a special need to
|
||||
encourage the widest possible use of a certain library, so that it becomes
|
||||
a de-facto standard. To achieve this, non-free programs must be
|
||||
allowed to use the library. A more frequent case is that a free
|
||||
library does the same job as widely used non-free libraries. In this
|
||||
case, there is little to gain by limiting the free library to free
|
||||
software only, so we use the Lesser General Public License.
|
||||
|
||||
In other cases, permission to use a particular library in non-free
|
||||
programs enables a greater number of people to use a large body of
|
||||
free software. For example, permission to use the GNU C Library in
|
||||
non-free programs enables many more people to use the whole GNU
|
||||
operating system, as well as its variant, the GNU/Linux operating
|
||||
system.
|
||||
|
||||
Although the Lesser General Public License is Less protective of the
|
||||
users' freedom, it does ensure that the user of a program that is
|
||||
linked with the Library has the freedom and the wherewithal to run
|
||||
that program using a modified version of the Library.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow. Pay close attention to the difference between a
|
||||
"work based on the library" and a "work that uses the library". The
|
||||
former contains code derived from the library, whereas the latter must
|
||||
be combined with the library in order to run.
|
||||
|
||||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License Agreement applies to any software library or other
|
||||
program which contains a notice placed by the copyright holder or
|
||||
other authorized party saying it may be distributed under the terms of
|
||||
this Lesser General Public License (also called "this License").
|
||||
Each licensee is addressed as "you".
|
||||
|
||||
A "library" means a collection of software functions and/or data
|
||||
prepared so as to be conveniently linked with application programs
|
||||
(which use some of those functions and data) to form executables.
|
||||
|
||||
The "Library", below, refers to any such software library or work
|
||||
which has been distributed under these terms. A "work based on the
|
||||
Library" means either the Library or any derivative work under
|
||||
copyright law: that is to say, a work containing the Library or a
|
||||
portion of it, either verbatim or with modifications and/or translated
|
||||
straightforwardly into another language. (Hereinafter, translation is
|
||||
included without limitation in the term "modification".)
|
||||
|
||||
"Source code" for a work means the preferred form of the work for
|
||||
making modifications to it. For a library, complete source code means
|
||||
all the source code for all modules it contains, plus any associated
|
||||
interface definition files, plus the scripts used to control compilation
|
||||
and installation of the library.
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running a program using the Library is not restricted, and output from
|
||||
such a program is covered only if its contents constitute a work based
|
||||
on the Library (independent of the use of the Library in a tool for
|
||||
writing it). Whether that is true depends on what the Library does
|
||||
and what the program that uses the Library does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Library's
|
||||
complete source code as you receive it, in any medium, provided that
|
||||
you conspicuously and appropriately publish on each copy an
|
||||
appropriate copyright notice and disclaimer of warranty; keep intact
|
||||
all the notices that refer to this License and to the absence of any
|
||||
warranty; and distribute a copy of this License along with the
|
||||
Library.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy,
|
||||
and you may at your option offer warranty protection in exchange for a
|
||||
fee.
|
||||
|
||||
2. You may modify your copy or copies of the Library or any portion
|
||||
of it, thus forming a work based on the Library, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
|
||||
a) The modified work must itself be a software library.
|
||||
|
||||
b) You must cause the files modified to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
c) You must cause the whole of the work to be licensed at no
|
||||
charge to all third parties under the terms of this License.
|
||||
|
||||
d) If a facility in the modified Library refers to a function or a
|
||||
table of data to be supplied by an application program that uses
|
||||
the facility, other than as an argument passed when the facility
|
||||
is invoked, then you must make a good faith effort to ensure that,
|
||||
in the event an application does not supply such function or
|
||||
table, the facility still operates, and performs whatever part of
|
||||
its purpose remains meaningful.
|
||||
|
||||
(For example, a function in a library to compute square roots has
|
||||
a purpose that is entirely well-defined independent of the
|
||||
application. Therefore, Subsection 2d requires that any
|
||||
application-supplied function or table used by this function must
|
||||
be optional: if the application does not supply it, the square
|
||||
root function must still compute square roots.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Library,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Library, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote
|
||||
it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Library.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Library
|
||||
with the Library (or with a work based on the Library) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
3. You may opt to apply the terms of the ordinary GNU General Public
|
||||
License instead of this License to a given copy of the Library. To do
|
||||
this, you must alter all the notices that refer to this License, so
|
||||
that they refer to the ordinary GNU General Public License, version 2,
|
||||
instead of to this License. (If a newer version than version 2 of the
|
||||
ordinary GNU General Public License has appeared, then you can specify
|
||||
that version instead if you wish.) Do not make any other change in
|
||||
these notices.
|
||||
|
||||
Once this change is made in a given copy, it is irreversible for
|
||||
that copy, so the ordinary GNU General Public License applies to all
|
||||
subsequent copies and derivative works made from that copy.
|
||||
|
||||
This option is useful when you wish to copy part of the code of
|
||||
the Library into a program that is not a library.
|
||||
|
||||
4. You may copy and distribute the Library (or a portion or
|
||||
derivative of it, under Section 2) in object code or executable form
|
||||
under the terms of Sections 1 and 2 above provided that you accompany
|
||||
it with the complete corresponding machine-readable source code, which
|
||||
must be distributed under the terms of Sections 1 and 2 above on a
|
||||
medium customarily used for software interchange.
|
||||
|
||||
If distribution of object code is made by offering access to copy
|
||||
from a designated place, then offering equivalent access to copy the
|
||||
source code from the same place satisfies the requirement to
|
||||
distribute the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
5. A program that contains no derivative of any portion of the
|
||||
Library, but is designed to work with the Library by being compiled or
|
||||
linked with it, is called a "work that uses the Library". Such a
|
||||
work, in isolation, is not a derivative work of the Library, and
|
||||
therefore falls outside the scope of this License.
|
||||
|
||||
However, linking a "work that uses the Library" with the Library
|
||||
creates an executable that is a derivative of the Library (because it
|
||||
contains portions of the Library), rather than a "work that uses the
|
||||
library". The executable is therefore covered by this License.
|
||||
Section 6 states terms for distribution of such executables.
|
||||
|
||||
When a "work that uses the Library" uses material from a header file
|
||||
that is part of the Library, the object code for the work may be a
|
||||
derivative work of the Library even though the source code is not.
|
||||
Whether this is true is especially significant if the work can be
|
||||
linked without the Library, or if the work is itself a library. The
|
||||
threshold for this to be true is not precisely defined by law.
|
||||
|
||||
If such an object file uses only numerical parameters, data
|
||||
structure layouts and accessors, and small macros and small inline
|
||||
functions (ten lines or less in length), then the use of the object
|
||||
file is unrestricted, regardless of whether it is legally a derivative
|
||||
work. (Executables containing this object code plus portions of the
|
||||
Library will still fall under Section 6.)
|
||||
|
||||
Otherwise, if the work is a derivative of the Library, you may
|
||||
distribute the object code for the work under the terms of Section 6.
|
||||
Any executables containing that work also fall under Section 6,
|
||||
whether or not they are linked directly with the Library itself.
|
||||
|
||||
6. As an exception to the Sections above, you may also combine or
|
||||
link a "work that uses the Library" with the Library to produce a
|
||||
work containing portions of the Library, and distribute that work
|
||||
under terms of your choice, provided that the terms permit
|
||||
modification of the work for the customer's own use and reverse
|
||||
engineering for debugging such modifications.
|
||||
|
||||
You must give prominent notice with each copy of the work that the
|
||||
Library is used in it and that the Library and its use are covered by
|
||||
this License. You must supply a copy of this License. If the work
|
||||
during execution displays copyright notices, you must include the
|
||||
copyright notice for the Library among them, as well as a reference
|
||||
directing the user to the copy of this License. Also, you must do one
|
||||
of these things:
|
||||
|
||||
a) Accompany the work with the complete corresponding
|
||||
machine-readable source code for the Library including whatever
|
||||
changes were used in the work (which must be distributed under
|
||||
Sections 1 and 2 above); and, if the work is an executable linked
|
||||
with the Library, with the complete machine-readable "work that
|
||||
uses the Library", as object code and/or source code, so that the
|
||||
user can modify the Library and then relink to produce a modified
|
||||
executable containing the modified Library. (It is understood
|
||||
that the user who changes the contents of definitions files in the
|
||||
Library will not necessarily be able to recompile the application
|
||||
to use the modified definitions.)
|
||||
|
||||
b) Use a suitable shared library mechanism for linking with the
|
||||
Library. A suitable mechanism is one that (1) uses at run time a
|
||||
copy of the library already present on the user's computer system,
|
||||
rather than copying library functions into the executable, and (2)
|
||||
will operate properly with a modified version of the library, if
|
||||
the user installs one, as long as the modified version is
|
||||
interface-compatible with the version that the work was made with.
|
||||
|
||||
c) Accompany the work with a written offer, valid for at
|
||||
least three years, to give the same user the materials
|
||||
specified in Subsection 6a, above, for a charge no more
|
||||
than the cost of performing this distribution.
|
||||
|
||||
d) If distribution of the work is made by offering access to copy
|
||||
from a designated place, offer equivalent access to copy the above
|
||||
specified materials from the same place.
|
||||
|
||||
e) Verify that the user has already received a copy of these
|
||||
materials or that you have already sent this user a copy.
|
||||
|
||||
For an executable, the required form of the "work that uses the
|
||||
Library" must include any data and utility programs needed for
|
||||
reproducing the executable from it. However, as a special exception,
|
||||
the materials to be distributed need not include anything that is
|
||||
normally distributed (in either source or binary form) with the major
|
||||
components (compiler, kernel, and so on) of the operating system on
|
||||
which the executable runs, unless that component itself accompanies
|
||||
the executable.
|
||||
|
||||
It may happen that this requirement contradicts the license
|
||||
restrictions of other proprietary libraries that do not normally
|
||||
accompany the operating system. Such a contradiction means you cannot
|
||||
use both them and the Library together in an executable that you
|
||||
distribute.
|
||||
|
||||
7. You may place library facilities that are a work based on the
|
||||
Library side-by-side in a single library together with other library
|
||||
facilities not covered by this License, and distribute such a combined
|
||||
library, provided that the separate distribution of the work based on
|
||||
the Library and of the other library facilities is otherwise
|
||||
permitted, and provided that you do these two things:
|
||||
|
||||
a) Accompany the combined library with a copy of the same work
|
||||
based on the Library, uncombined with any other library
|
||||
facilities. This must be distributed under the terms of the
|
||||
Sections above.
|
||||
|
||||
b) Give prominent notice with the combined library of the fact
|
||||
that part of it is a work based on the Library, and explaining
|
||||
where to find the accompanying uncombined form of the same work.
|
||||
|
||||
8. You may not copy, modify, sublicense, link with, or distribute
|
||||
the Library except as expressly provided under this License. Any
|
||||
attempt otherwise to copy, modify, sublicense, link with, or
|
||||
distribute the Library is void, and will automatically terminate your
|
||||
rights under this License. However, parties who have received copies,
|
||||
or rights, from you under this License will not have their licenses
|
||||
terminated so long as such parties remain in full compliance.
|
||||
|
||||
9. You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to modify or
|
||||
distribute the Library or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Library (or any work based on the
|
||||
Library), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Library or works based on it.
|
||||
|
||||
10. Each time you redistribute the Library (or any work based on the
|
||||
Library), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute, link with or modify the Library
|
||||
subject to these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties with
|
||||
this License.
|
||||
|
||||
11. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot
|
||||
distribute so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you
|
||||
may not distribute the Library at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Library by
|
||||
all those who receive copies directly or indirectly through you, then
|
||||
the only way you could satisfy both it and this License would be to
|
||||
refrain entirely from distribution of the Library.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under any
|
||||
particular circumstance, the balance of the section is intended to apply,
|
||||
and the section as a whole is intended to apply in other circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system which is
|
||||
implemented by public license practices. Many people have made
|
||||
generous contributions to the wide range of software distributed
|
||||
through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing
|
||||
to distribute software through any other system and a licensee cannot
|
||||
impose that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
12. If the distribution and/or use of the Library is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Library under this License may add
|
||||
an explicit geographical distribution limitation excluding those countries,
|
||||
so that distribution is permitted only in or among countries not thus
|
||||
excluded. In such case, this License incorporates the limitation as if
|
||||
written in the body of this License.
|
||||
|
||||
13. The Free Software Foundation may publish revised and/or new
|
||||
versions of the Lesser General Public License from time to time.
|
||||
Such new versions will be similar in spirit to the present version,
|
||||
but may differ in detail to address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Library
|
||||
specifies a version number of this License which applies to it and
|
||||
"any later version", you have the option of following the terms and
|
||||
conditions either of that version or of any later version published by
|
||||
the Free Software Foundation. If the Library does not specify a
|
||||
license version number, you may choose any version ever published by
|
||||
the Free Software Foundation.
|
||||
|
||||
14. If you wish to incorporate parts of the Library into other free
|
||||
programs whose distribution conditions are incompatible with these,
|
||||
write to the author to ask for permission. For software which is
|
||||
copyrighted by the Free Software Foundation, write to the Free
|
||||
Software Foundation; we sometimes make exceptions for this. Our
|
||||
decision will be guided by the two goals of preserving the free status
|
||||
of all derivatives of our free software and of promoting the sharing
|
||||
and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
|
||||
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
|
||||
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
|
||||
OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
|
||||
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
|
||||
LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
|
||||
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
|
||||
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
|
||||
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
|
||||
AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
|
||||
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
|
||||
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
|
||||
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
|
||||
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
|
||||
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
|
||||
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
|
||||
DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Libraries
|
||||
|
||||
If you develop a new library, and you want it to be of the greatest
|
||||
possible use to the public, we recommend making it free software that
|
||||
everyone can redistribute and change. You can do so by permitting
|
||||
redistribution under these terms (or, alternatively, under the terms of the
|
||||
ordinary General Public License).
|
||||
|
||||
To apply these terms, attach the following notices to the library. It is
|
||||
safest to attach them to the start of each source file to most effectively
|
||||
convey the exclusion of warranty; and each file should have at least the
|
||||
"copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the library's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or your
|
||||
school, if any, to sign a "copyright disclaimer" for the library, if
|
||||
necessary. Here is a sample; alter the names:
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the
|
||||
library `Frob' (a library for tweaking knobs) written by James Random Hacker.
|
||||
|
||||
<signature of Ty Coon>, 1 April 1990
|
||||
Ty Coon, President of Vice
|
||||
|
||||
That's all there is to it!
|
||||
|
||||
|
||||
+22
-18
@@ -1,21 +1,25 @@
|
||||
libffi - Copyright (c) 1996-2012 Anthony Green, Red Hat, Inc and others.
|
||||
See source files for details.
|
||||
JNA is dual-licensed under 2 alternative Open Source/Free
|
||||
licenses: LGPL 2.1 and Apache License 2.0. (starting with
|
||||
JNA version 4.0.0).
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
``Software''), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to
|
||||
the following conditions:
|
||||
What this means is that one can choose either one of these
|
||||
licenses (for purposes of re-distributing JNA; usually by
|
||||
including it as one of jars another application or
|
||||
library uses) by downloading corresponding jar file,
|
||||
using it, and living happily everafter.
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
You may obtain a copy of the LGPL License at:
|
||||
|
||||
THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
http://www.gnu.org/licenses/licenses.html
|
||||
|
||||
A copy is also included in the downloadable source code package
|
||||
containing JNA, in file "LGPL2.1", under the same directory
|
||||
as this file.
|
||||
|
||||
You may obtain a copy of the ASL License at:
|
||||
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
A copy is also included in the downloadable source code package
|
||||
containing JNA, in file "ASL2.0", under the same directory
|
||||
as this file.
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
This copy of JNA is licensed under the
|
||||
Apache (Software) License, version 2.0 ("the License").
|
||||
See the License for details about distribution rights, and the
|
||||
specific rights regarding derivate works.
|
||||
|
||||
You may obtain a copy of the License at:
|
||||
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
A copy is also included in the downloadable source code package
|
||||
containing JNA, in file "ASL2.0", under the same directory
|
||||
as this file.
|
||||
@@ -0,0 +1,13 @@
|
||||
This copy of JNA is licensed under the
|
||||
Lesser General Public License (LGPL), version 2.1 ("the License").
|
||||
See the License for details about distribution rights, and the
|
||||
specific rights regarding derivate works.
|
||||
|
||||
You may obtain a copy of the License at:
|
||||
|
||||
http://www.gnu.org/licenses/licenses.html
|
||||
|
||||
A copy is also included in the downloadable source code package
|
||||
containing JNA, in file "LGPL2.1", under the same directory
|
||||
as this file.
|
||||
|
||||
+33
@@ -0,0 +1,33 @@
|
||||
* RELATED and/or SIMILAR PROJECTS:
|
||||
* Feel free to add notes and/or descriptions here (this should probably go
|
||||
* on a wiki somewhere).
|
||||
----
|
||||
* nlink.dev.java.net:
|
||||
pros: simple definitions (same as jna)
|
||||
cons: w32 only
|
||||
* sf.net/projects/jnative:
|
||||
cons: boilerplate, manual code generation by calling setup methods
|
||||
pros: callbacks, byref args?
|
||||
* JNIWrapper: kinda like jnative (commercial), includes platform "packs"
|
||||
* coroutine for Java, like jnative (commercial)
|
||||
* jnieasy: c++ mappings (http://www.innowhere.com:8080/webapp/jsp/products/jnieasy/index.jsp?_page=products.jnieasy)
|
||||
* j2native (www.smardec.com)
|
||||
* j-interop.sf.net
|
||||
* jawinproject.sf.net (COM DLL access)
|
||||
* jacob-project.sf.net (COM DLL access)
|
||||
* nativecall.sf.net (minimal)
|
||||
* cxxwrap.sf.net
|
||||
* J/Direct (defunct)
|
||||
* NoodleGlue
|
||||
* SWIG
|
||||
* ctypes4j.sf.net
|
||||
* ctypes-java (out of date)
|
||||
* jnbridge
|
||||
* xFunction (http://excelsior-usa.com/xfunction.html, commercial, osx)
|
||||
* JACE c++ mappings
|
||||
* JAW Java API wrapper http://www.aplu.ch/home/apluhome.jsp?site=5
|
||||
|
||||
# OTHER REFERENCES
|
||||
# JNI options: http://staff.develop.com/halloway/JavaWin32.html
|
||||
# List of JNI alternatives: http://weblog.janek.org/Archive/2005/07/28/AlternativestoJavaNativeI.html
|
||||
|
||||
+120
@@ -0,0 +1,120 @@
|
||||

|
||||
|
||||
Java Native Access (JNA)
|
||||
========================
|
||||
|
||||
The definitive JNA reference (including an overview and usage details) is in the [JavaDoc](http://twall.github.com/jna/4.1.0). Please read the [overview](http://twall.github.io/jna/4.1.0/overview-summary.html#overview_description). Questions, comments, or exploratory conversations should begin on the [mailing list](http://groups.google.com/group/jna-users), although you may find it easier to find answers to already-solved problems on [StackOverflow](http://stackoverflow.com/questions/tagged/jna).
|
||||
|
||||
JNA provides Java programs easy access to native shared libraries without writing anything but Java code - no JNI or native code is required. This functionality is comparable to Windows' Platform/Invoke and Python's ctypes.
|
||||
|
||||
JNA allows you to call directly into native functions using natural Java method invocation. The Java call looks just like the call does in native code. Most calls require no special handling or configuration; no boilerplate or generated code is required.
|
||||
|
||||
JNA uses a small JNI library stub to dynamically invoke native code. The developer uses a Java interface to describe functions and structures in the target native library. This makes it quite easy to take advantage of native platform features without incurring the high overhead of configuring and building JNI code for multiple platforms.
|
||||
|
||||
While significant attention has been paid to performance, correctness and ease of use take priority.
|
||||
|
||||
In addition, JNA includes a platform library with many native functions already mapped as well as a set of utility interfaces that simplify native access.
|
||||
|
||||
Projects Using JNA
|
||||
==================
|
||||
JNA is a mature library with dozens of contributors and hundreds of commercial and non-commercial projects that use it. If you're using JNA, feel free to [tell us about it](http://groups.google.com/group/jna-users). Include some details about your company, project name, purpose and size and tell us how you use the library.
|
||||
|
||||
Download
|
||||
========
|
||||
|
||||
Version 4.1.0
|
||||
|
||||
* [jna.jar](https://maven.java.net/content/repositories/releases/net/java/dev/jna/jna/4.1.0/jna-4.1.0.jar)
|
||||
* [jna-platform.jar](https://maven.java.net/content/repositories/releases/net/java/dev/jna/jna-platform/4.1.0/jna-platform-4.1.0.jar)
|
||||
|
||||
Features
|
||||
========
|
||||
|
||||
* Automatic mapping from Java to native functions, with simple mappings for all primitive data types
|
||||
* Runs on most platforms which support Java
|
||||
* Automatic conversion between C and Java strings, with customizable encoding/decoding
|
||||
* Structure and Union arguments/return values, by reference and by value
|
||||
* Function Pointers, (callbacks from native code to Java) as arguments and/or members of a struct
|
||||
* Auto-generated Java proxies for native function pointers
|
||||
* By-reference (pointer-to-type) arguments
|
||||
* Java array and NIO Buffer arguments (primitive types and pointers) as pointer-to-buffer
|
||||
* Nested structures and arrays
|
||||
* Wide (wchar_t-based) strings
|
||||
* Native long support (32- or 64-bit as appropriate)
|
||||
* [Demo applications/examples](https://github.com/twall/jna/tree/master/contrib)
|
||||
* Supported on 1.4 or later JVMs, including JavaME (earlier VMs may work with stubbed NIO support)
|
||||
* Customizable marshalling/unmarshalling (argument and return value conversions)
|
||||
* Customizable mapping from Java method to native function name, and customizable invocation to simulate C preprocessor function macros
|
||||
* Support for automatic Windows ASCII/UNICODE function mappings
|
||||
* Varargs support
|
||||
* Type-safety for native pointers
|
||||
* VM crash protection (optional)
|
||||
* Optimized direct mapping for high-performance applications.
|
||||
* COM support for early and late binding.
|
||||
* COM/Typelib java code generator.
|
||||
|
||||
Community and Support
|
||||
=====================
|
||||
|
||||
All questions should be posted to the [jna-users Google group](http://groups.google.com/group/jna-users). Issues can be submitted [here on Github](https://github.com/twall/jna/issues).
|
||||
|
||||
When posting to the mailing list, please include the following:
|
||||
|
||||
* What OS/CPU/architecture you're using (e.g. Windows 7 64-bit)
|
||||
* Reference to your native interface definitions (i.e. C headers), if available
|
||||
* The JNA mapping you're trying to use
|
||||
* VM crash logs, if any
|
||||
* Example native usage, and your attempted Java usage
|
||||
|
||||
It's nearly impossible to indicate proper Java usage when there's no native
|
||||
reference to work from.
|
||||
|
||||
For commercial support, please contact twalljava [at] java [dot] net.
|
||||
|
||||
Using the Library
|
||||
=================
|
||||
|
||||
* [Getting Started](https://github.com/twall/jna/blob/master/www/GettingStarted.md)
|
||||
* [Mapping between Java and Native](https://github.com/twall/jna/blob/master/www/Mappings.md)
|
||||
* [Using Pointers and Arrays](https://github.com/twall/jna/blob/master/www/PointersAndArrays.md)
|
||||
* [Using Structures and Unions](https://github.com/twall/jna/blob/master/www/StructuresAndUnions.md)
|
||||
* [Using By-Reference Arguments](https://github.com/twall/jna/blob/master/www/ByRefArguments.md)
|
||||
* [Customization of Type Mapping](https://github.com/twall/jna/blob/master/www/CustomMappings.md)
|
||||
* [Callbacks/Function Pointers/Closures](https://github.com/twall/jna/blob/master/www/CallbacksAndClosures.md)
|
||||
* [Dynamically Typed Languages (JRuby/Jython)](https://github.com/twall/jna/blob/master/www/DynamicallyTypedLanguages.md)
|
||||
* [Platform Library](https://github.com/twall/jna/blob/master/www/PlatformLibrary.md)
|
||||
* [Direct Method Mapping](https://github.com/twall/jna/blob/master/www/DirectMapping.md) (Optimization)
|
||||
* [Frequently Asked Questions (FAQ)](https://github.com/twall/jna/blob/master/www/FrequentlyAskedQuestions.md)
|
||||
* [Avoiding Crashes](http://twall.github.com/jna/4.1.0/javadoc/overview-summary.html#crash-protection)
|
||||
|
||||
Primary Documentation (JavaDoc)
|
||||
===============================
|
||||
|
||||
The definitive JNA reference is in the [JavaDoc](http://twall.github.com/jna/4.1.0/).
|
||||
|
||||
Developers
|
||||
==========
|
||||
|
||||
* [Contributing to JNA](https://github.com/twall/jna/blob/master/www/Contributing.md)
|
||||
* [Setting up a Windows Development Environment](https://github.com/twall/jna/blob/master/www/WindowsDevelopmentEnvironment.md)
|
||||
* [Setting up an Android Development Environment](https://github.com/twall/jna/blob/master/www/AndroidDevelopmentEnvironment.md)
|
||||
* [Releasing JNA](https://github.com/twall/jna/blob/master/www/ReleasingJNA.md)
|
||||
* [Publishing to Maven Central](https://github.com/twall/jna/blob/master/www/PublishingToMavenCentral.md)
|
||||
|
||||
Contributing
|
||||
============
|
||||
|
||||
You're encouraged to contribute to JNA. Fork the code from [https://github.com/twall/jna](https://github.com/twall/jna) and submit pull requests.
|
||||
|
||||
For more information on setting up a development environment see [Contributing to JNA](https://github.com/twall/jna/blob/master/www/Contributing.md).
|
||||
|
||||
If you are interested in paid support, feel free to say so on the [jna-users mailing list](http://groups.google.com/group/jna-users). Most simple questions will be answered on the list, but more complicated work, new features or target platforms can be negotiated with any of the JNA developers (this is how several of JNA's features came into being). You may even encounter other users with the same need and be able to cost share the new development.
|
||||
|
||||
License
|
||||
=======
|
||||
|
||||
This library is licensed under the LGPL, version 2.1 or later, and (from version 4.0 onward) the Apache Software License, version 2.0. Commercial license arrangements are negotiable.
|
||||
|
||||
*NOTE: Oracle is not sponsoring this project, even though the package name (com.sun.jna) might imply otherwise.*
|
||||
|
||||
|
||||
+286
@@ -0,0 +1,286 @@
|
||||
# DESIGN GOALS/REQUIREMENTS
|
||||
o no permanent references to java objects in native code (hard to get rid of)
|
||||
this means no java object arguments to callbacks; use some sort of integer
|
||||
key instead (hashcode?) callbacks can hold local data anyway...
|
||||
o make simplest Java usage map to most common C usage
|
||||
- additional constructs provided for less-common cases
|
||||
(WString,Structure.ByValue/ByReference)
|
||||
o structure is treated as a pointer, except within a struct
|
||||
o primitive types are passed directly
|
||||
o arrays are treated as pointers, except within a struct
|
||||
- in structure (inline; otherwise pointer-to-X should be used)
|
||||
- as function argument (auto-convert to pointer via Memory)
|
||||
o pointer to type in struct should use PointerType or Structure.ByReference
|
||||
o "free" should be invisible wherever possible
|
||||
|
||||
# FUTURE DEMOS:
|
||||
* test keyboard keys' state (needs OSX impl)
|
||||
* get system process information, basic process control
|
||||
* additional file utilities (meta info, free space, etc)
|
||||
* enforce window minimum/maximum size (workaround java bug)
|
||||
|
||||
# TODO
|
||||
|
||||
* annotations/generics:
|
||||
o GetPrimitiveArrayCritical: use this if flagged (by annotation? method name?)
|
||||
o per-arg/return type marshalling
|
||||
o avoid casts in loadLibrary
|
||||
o wrap global variables w/type (set/get)
|
||||
o support annotations of parameters and return values w/o breaking
|
||||
1.4 compatibility (retroweaver?), e.g.
|
||||
-- retroweaver (requires retroweaver runtime classes to provide annotation
|
||||
features) not yet worth doing
|
||||
|
||||
void my_function(@MarshalAs(off_t)long arg);
|
||||
|
||||
trading off cruft in the interface def to avoid cruft in the usage:
|
||||
|
||||
my_function(0) versus my_function(new off_t(0))
|
||||
|
||||
this only really applies to NativeLong/IntegerType types that want to use a
|
||||
primitive value instead of creating an object instance.
|
||||
o flag string(/wstring)-returning methods which need to free their result
|
||||
to avoid leaking memory whan auto-creating strings from the result
|
||||
(since normally we don't take explicit ownership of any returned pointers)
|
||||
this is a special case for returned strings only, since other returned
|
||||
pointers are available to the user for later "freeing"
|
||||
Use a map on library creation, an iface for the library, or annotation
|
||||
NOTE: how many methods actually do this? strdup...
|
||||
Maybe make function return "Memory", which can then be converted to a
|
||||
Structure or some other type. Then memory will free itself when no longer
|
||||
referenced. (not really common)
|
||||
|
||||
|
||||
* eliminate type conversion contexts; these are almost entirely unused and
|
||||
more complicated than just wrapping a native mapping in a utility function
|
||||
* direct non-primitive array arguments (String[], Pointer[], NativeMapped[])
|
||||
|
||||
* auto-generate direct mappings/bindings on a per-method basis (perform a
|
||||
method register on first call to an interface-mapped function) with
|
||||
sufficient pre-processing to convert to primitives.
|
||||
|
||||
* dispose memory/callbacks in Native finalizer to ensure they run first
|
||||
(use referencequeue to run them when they become unreachable)
|
||||
|
||||
* make direct calls call back *once* to Java where conversion is required,
|
||||
and process all arguments from there (instead of potentially swapping back
|
||||
and forth multiple times). This also makes it easer to perform conversions
|
||||
(no native changes required).
|
||||
|
||||
* ppc64 direct/raw failures (multiple)
|
||||
* direct calls on ppc to varargs (callbacks) with FP args fail; avoid them for
|
||||
now
|
||||
* Callback.PostCallWrite.write() cf PostCallRead
|
||||
|
||||
* universal GCC build w/cross-compile (needs cross compilers...)
|
||||
* return Pointer.SIZE/LONG_SIZE/WCHAR_SIZE in bits (for consistency with 1.5)
|
||||
Long.SIZE, Integer.SIZE, et al.
|
||||
* interface "lvalue", which can provide a pointer to itself (reference() or
|
||||
addressOf())?
|
||||
* bitfields for structs (how?)
|
||||
|
||||
|
||||
# DONE
|
||||
* combine direct and interface mapping calling code where possible
|
||||
* DOCS: how to properly use W32API_DEFAULT_OPTIONS (A/W, String/WString)
|
||||
* make native dll extraction from jar public, to use with user dlls packaged
|
||||
in a jar
|
||||
* use consistent cpu references (x86->i386, x86_64->amd64)
|
||||
* osgi for osx
|
||||
* NO: make Pointer free-able (system allocates memory, client frees it); actually,
|
||||
this should probably be automatic so the user doesn't have to think about it.
|
||||
Maybe a custom type representing "function-allocated-pointer" or
|
||||
"pointer-requiring-free" (which is just Memory). For now, leave it up to
|
||||
the user to manage the pointer, since they have to define the free method
|
||||
anyway. use could always put a finalizer on a PointerType-derived type.
|
||||
- user can do this explicitly if needed
|
||||
* NO: use libffi java raw? (deprecated)
|
||||
* NO: MethodArgument/ReturnMapper: per method mapping of arguments/return type.
|
||||
Can use annotations as shorthand to initialize a map, but basically set up a
|
||||
per-NativeLibrary (or per-Function?) map of methods to mappers.
|
||||
|
||||
Requires separate compilation of annotation handling.
|
||||
* NO: packaging: 'types', 'convert/marshal' subpackages?
|
||||
note: marshal/unmarshal vs to/fromnative: to/fromnative is more
|
||||
explicit, since marshal/unmarshal doesn't indicate src/dst.
|
||||
o moving conversion contexts to subpackage cleans up top level
|
||||
substantially, but we probably don't want to move things like Structure and
|
||||
Pointer into a types subpackage (which would leave just a few top-level
|
||||
classes). Javadoc is cluttered by example classes anyway.
|
||||
* cache structure information per-class
|
||||
* fix setFieldOrder to *always* apply if used
|
||||
* Make a separate jar file for all OS-specific headers
|
||||
Maybe make interfaces per-header file (winbase, winnt, stdlib, etc),
|
||||
aggregated per-library (interface CLibrary extends stdlib, stdio, etc)
|
||||
(how useful would it really be, or is this just sorting legos?)
|
||||
o same for windowutils, fileutils, etc. (not useful)
|
||||
* check Structure "final" fields; should never write back to native memory
|
||||
* OSX ObjC access (see rococoa)
|
||||
* do Structure.write for any callback args
|
||||
* pointer.setValue(), to handle NativeMapped types and move read/writeValue
|
||||
methods out of Structure, to be used by Function w/NativeMapped[] parameter
|
||||
|
||||
* if method has "GetLastErrorException/ErrnoException" in its signature, use
|
||||
result codes + GetLastError/errno/errstr to auto-generate
|
||||
runtime exceptions? (cf P/Invoke; also useful for X11 return types)
|
||||
provide annotation/custom invocation handler/hook to examine return value and
|
||||
throw an exception if the return value indicates an error
|
||||
|
||||
o are error return values consistent (if so, a single handler works)?
|
||||
if null -> call GetLastError
|
||||
if nonzero ?
|
||||
o otherwise, need an ExceptionOnZero, ExceptionOnNonZero runtime, from which
|
||||
derive GetLastError/ErrnoExceptionOnZero/NZ
|
||||
* verify get/set methods vs read/write for performance (Pointer)?
|
||||
(see RawTest for performance comparisons)
|
||||
* Allow Buffer in Structures (and callbacks) (auto-wrap in direct byte buffer)?
|
||||
o this gets tricky when reading structs from native memory; we don't know if
|
||||
the value is already mapped to a buffer (cf CallbackReference)
|
||||
* standard types for various platforms: posix/types.h, w32 (DWORD, HANDLE)
|
||||
|
||||
* embed version in DLL ('depends'-done)/so (symlink?)
|
||||
* use libffi closure allocation/deallocation
|
||||
|
||||
* ensure Library options are passed to NativeFunctionHandler
|
||||
(needs getLibraryOptions(Class cls))
|
||||
|
||||
* handle array of Structure.ByReference as parameter/return value (cf Pointer[])
|
||||
* test performance of setByte/getByte and pass pointer field directly if it
|
||||
makes sense to do so (done, halves access time to use pointer field directly,
|
||||
slight variations on 1.4/1.5/1.6).
|
||||
* test callback arg/return value for callback type
|
||||
* structure by value in callback
|
||||
|
||||
* call native to fix up FFIType on creation (avoid multithreading problems)
|
||||
properly handle union by value (or punt; must pass union field instead)
|
||||
|
||||
* hash javah-generated headers; when changed, invalidate platform-specific
|
||||
|
||||
* add main class which spits out version information
|
||||
|
||||
* docs: split pages: FAQ
|
||||
FAQ: J2ME, new platform builds, stdcall
|
||||
|
||||
* struct by reference within structure
|
||||
* struct by value
|
||||
(how to do struct value return (vs struct pointer) (uncommon)?)
|
||||
(how to do struct value argument (vs struct pointer) (uncommon)?)
|
||||
* use appropriate size_t and off_t sizes (use long offsets everywhere in
|
||||
Pointer)
|
||||
* Callback/function pointer as return value (e.g. signal())
|
||||
* type safety between returned and passed in pointers (w32 API); advantage of
|
||||
deriving from Pointer is that type mapping can be made automatic, without an
|
||||
explicit type mapping defined.
|
||||
* catch native crash/exception/faults and re-throw as java exception
|
||||
this is mostly for debugging a new mapping to avoid crashing the VM
|
||||
could do setjmp/longjmp on *nix and catch C++ exception on w32
|
||||
* NativeMapped: provide interface to automatically convert custom Java
|
||||
type to/from native types.
|
||||
* update X11 libs for 64-bit
|
||||
* use libffi from gcc to handle calls and callbacks?
|
||||
or move callback asm templates into dispatch_<arch>.c
|
||||
* more tests for argument types (2 args, all permutations of basic data types)
|
||||
ensures native stack handling is done properly (handled by libffi)
|
||||
* universal OSX build w/cross-compile (hard to do with libffi)
|
||||
* use jna.encoding property to affect string encoding instead of just using
|
||||
the system default encoding.
|
||||
* change/augment getWindowHandle0 to provide any heavyweight component window
|
||||
* unions (copy-on-call is problematic: which member is active?) must require
|
||||
explicit write, either per member or whole object before export
|
||||
* rename Argument/Result Converter to be fromNative/toNative
|
||||
* split unit tests
|
||||
* auto-convert struct pointers in callback args to Java Structure
|
||||
(may need a proxy wrapper around callback to avoid excessive JNI)
|
||||
use proxy for callbacks to enable auto-conversion of arguments and/or return
|
||||
value (in java-land instead of C-land).
|
||||
* review/use refactor nativelibrary/function
|
||||
* auto-generate stdcall decorated symbols (try if undecorated lookup fails)
|
||||
* per-library jna.library.path: many libraries have a "standard" location (or
|
||||
several); let the library author indicate what these are (X11, for example)
|
||||
* return array of struct (annotation to indicate which argument has the
|
||||
length of the returned value might be nice) (this can now be done with a
|
||||
type mapper)
|
||||
* callbacks need a dispose if they are to live beyond the lifetime of the
|
||||
function to which they are passed; maybe a simpler callback interface for
|
||||
transient callbacks, and require callback+dispose for most callbacks?
|
||||
TransientCallback: callback
|
||||
NonTransientCallback: callback+dispose
|
||||
(callback is disposed when no longer referenced; user must ensure callback
|
||||
is not GC'd until it is removed as a native callback)
|
||||
* auto-convert strings in w32 functions ending in 'W'? would this introduce
|
||||
any ambiguity?
|
||||
* Dispose/unload library on GC (use ref queue)
|
||||
* fix dnd on linux (no hole?) (mostly fixed, still some artifacts)
|
||||
* transparent/shaped drag image
|
||||
* windows handles need to be Pointer (void*), not 'int'
|
||||
* other demos: move to trash, file change notification
|
||||
* tests for other primitive array types
|
||||
* build test dll/dispatch lib w/cygwin/gcc instead of msvc (?) under w32
|
||||
* nested struct alignment (4/8 byte? depends on first element?)
|
||||
* nested structs in structs: easier to define using struct; use pointer
|
||||
if you need a pointer
|
||||
struct auto-converts to pointer as argument, should be inline in struct
|
||||
(struct should require explicit pointer, argument should require explicit
|
||||
non-pointer) (maybe use object version of basic type as "pointer" version)
|
||||
* provide JNA-only search path for libraries
|
||||
* callbacks
|
||||
* move javah-generated files to own space
|
||||
* darwin/PPC asm layer
|
||||
* enable w32 build with either GCC or MSVC (GCC-built dll doesn't work yet)
|
||||
* support pointer to basic type argument (int *) w/type safety - what's the
|
||||
best API from a user perspective? new Pointer(int)? new Pointer<int>?
|
||||
Base class "pointer to" gets converted to Pointer in invocation handler;
|
||||
provide a getValue() to retrieve the result; otherwise the memory is opaque
|
||||
|
||||
o IntPtr, WCharPtr, CharPtr, ShortPtr, LongPtr, DoublePtr, FloatPtr,
|
||||
Handle (PtrPtr), getValue(), getPointer()
|
||||
o add getCharArray() et al. to Pointer?
|
||||
|
||||
* inline arrays of primitive types
|
||||
* remove debug flags (they're not useful)
|
||||
* Use WString to identify return type and arg
|
||||
* use interface to identify native, instead of annotation
|
||||
* isolate stdcall to w32 (should be private to platform)
|
||||
* generic gcc build/osx(ppc/x86)/linux
|
||||
* remove generics/enable build under 1.4
|
||||
* tests for structs
|
||||
* test float/double
|
||||
* offset placeholders for structs (explicit alignment)
|
||||
* vanilla ant build file
|
||||
* build native stuff from build.xml
|
||||
* implement basic junit tests
|
||||
* auto-align struct fields
|
||||
* handle long/byte/short
|
||||
* make annotations for native method names optional
|
||||
// hard clip for now, alpha transparency later
|
||||
// also allow ImageIcon to be used as clip (getImage())
|
||||
void setWindowMask(Window w, Shape clip);
|
||||
// needs:
|
||||
int findNativeWindow(Window w);
|
||||
|
||||
#MAYBE NOT
|
||||
* should structure offsets be 64-bit? technically yes, but in practice I don't
|
||||
think a structure that big actually works.
|
||||
* (maybe) move all native functions into Native (limit header files, easier
|
||||
management)
|
||||
* Does it make sense to define Int16/UInt16, Int32/UInt32, etc? Probably not
|
||||
the signed versions, but maybe the unsigned ones, to facilitate generating
|
||||
unsigned values (maybe just provide utilities to pack an unsigned int into a
|
||||
signed int). What about size_t, off_t, et al.? Would either need a
|
||||
bunch of native lookup functions (more accurate) or java-side conditionals
|
||||
(less robust but easier to change).
|
||||
o bounds checking is handled by IntegerType (pass in a long, get an
|
||||
exception if the value is out of bounds).
|
||||
o when used as struct fields, could allow detection of field order by order
|
||||
of initialization (requires all-or-nothing usage, though)
|
||||
* StringBuffer/StringBuilder as mutable char*/wchar_t* argument
|
||||
NOTE: byte[]/char[] is probably better; it's trivial to convert to String
|
||||
and native code can't change the size anyway
|
||||
* provide library load/unload hooks (Runnables in options?). Examples:
|
||||
o GetLastError (no longer needed)
|
||||
o WSAInit?
|
||||
* determine X11 display name from current java program (if any); null is ok
|
||||
since it uses getenv(DISPLAY), which is what java would do
|
||||
note: DISPLAY may be available in GraphicsDevice->getIDstring
|
||||
|
||||
|
||||
+1200
Diferenças do arquivo suprimidas por serem muito extensas
Carregar Diff
@@ -0,0 +1,4 @@
|
||||
This directory contains code which has been contributed by JNA users. If no
|
||||
tests are included, you should assume the code has only been checked for
|
||||
compile-time errors :)
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<classpath>
|
||||
<classpathentry kind="src" path=""/>
|
||||
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
|
||||
<classpathentry kind="lib" path="/jnalib/dist/jna.jar"/>
|
||||
<classpathentry kind="src" path="/platform"/>
|
||||
<classpathentry kind="output" path="bin"/>
|
||||
</classpath>
|
||||
@@ -0,0 +1,17 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<projectDescription>
|
||||
<name>alphamaskdemo</name>
|
||||
<comment></comment>
|
||||
<projects>
|
||||
</projects>
|
||||
<buildSpec>
|
||||
<buildCommand>
|
||||
<name>org.eclipse.jdt.core.javabuilder</name>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
</buildSpec>
|
||||
<natures>
|
||||
<nature>org.eclipse.jdt.core.javanature</nature>
|
||||
</natures>
|
||||
</projectDescription>
|
||||
@@ -0,0 +1,66 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project name="jnacontrib.alphamaskdemo" default="jar" basedir=".">
|
||||
<description>Builds, tests, and runs the project jnacontrib.alphamaskdemo.</description>
|
||||
<!-- Locations -->
|
||||
<property name="src" location="."/>
|
||||
<property name="build" location="build"/>
|
||||
<property name="jna-dist" location="../../dist"/>
|
||||
|
||||
<property name="classes" location="${build}/classes"/>
|
||||
<property name="jar" location="${build}/demo-alphamask.jar"/>
|
||||
<property name="file.reference.jna.jar" location="../../build/jna.jar"/>
|
||||
<property name="main-class" value="com.sun.jna.contrib.demo.AlphaMaskDemo" />
|
||||
|
||||
<path id="classpath">
|
||||
<fileset file="${file.reference.jna.jar}"/>
|
||||
<fileset dir="../platform/dist" includes="jna-platform.jar"/>
|
||||
</path>
|
||||
|
||||
<!-- Run Demo. -->
|
||||
<target name="run" depends="compile">
|
||||
<java classname="${main-class}" fork="true">
|
||||
<classpath>
|
||||
<pathelement location="${classes}" />
|
||||
<path refid="classpath"/>
|
||||
</classpath>
|
||||
</java>
|
||||
</target>
|
||||
|
||||
<!-- Delete class and jar files. -->
|
||||
<target name="clean">
|
||||
<delete dir="${classes}"/>
|
||||
<delete file="${jar}"/>
|
||||
<delete dir="${build}"/>
|
||||
</target>
|
||||
|
||||
<!-- Compile all classes. -->
|
||||
<target name="compile">
|
||||
<mkdir dir="${classes}"/>
|
||||
<!-- Compile the project. -->
|
||||
<javac srcdir="${src}" destdir="${classes}" target="1.5" source="1.5"
|
||||
encoding="UTF-8" debug="on" includeantruntime="false">
|
||||
<classpath>
|
||||
<path refid="classpath"/>
|
||||
</classpath>
|
||||
</javac>
|
||||
</target>
|
||||
|
||||
<!-- Create jar-file. -->
|
||||
<target name="jar" depends="compile">
|
||||
<!-- Copy all non-java files to classes. -->
|
||||
<copy todir="${classes}/com">
|
||||
<fileset dir="${src}/com">
|
||||
<exclude name="**/*.java"/>
|
||||
</fileset>
|
||||
</copy>
|
||||
<jar jarfile="${jar}" basedir="${classes}">
|
||||
<manifest>
|
||||
<attribute name="Main-Class" value="${main-class}"/>
|
||||
</manifest>
|
||||
<!-- platform -->
|
||||
<fileset dir="../platform/build/classes/com"/>
|
||||
<!-- jna -->
|
||||
<zipfileset src="${file.reference.jna.jar}"/>
|
||||
</jar>
|
||||
</target>
|
||||
</project>
|
||||
@@ -0,0 +1,530 @@
|
||||
/* Copyright (c) 2007-2008 Timothy Wall, All Rights Reserved
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
package com.sun.jna.contrib.demo;
|
||||
|
||||
import java.awt.BorderLayout;
|
||||
import java.awt.Color;
|
||||
import java.awt.Graphics;
|
||||
import java.awt.GraphicsConfiguration;
|
||||
import java.awt.GraphicsEnvironment;
|
||||
import java.awt.Image;
|
||||
import java.awt.Point;
|
||||
import java.awt.Rectangle;
|
||||
import java.awt.Toolkit;
|
||||
import java.awt.Window;
|
||||
import java.awt.datatransfer.DataFlavor;
|
||||
import java.awt.datatransfer.Transferable;
|
||||
import java.awt.datatransfer.UnsupportedFlavorException;
|
||||
import java.awt.event.MouseAdapter;
|
||||
import java.awt.event.MouseEvent;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.awt.image.ImageObserver;
|
||||
import java.awt.image.Raster;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.Reader;
|
||||
import java.net.URL;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import javax.swing.ImageIcon;
|
||||
import javax.swing.JComponent;
|
||||
import javax.swing.JFrame;
|
||||
import javax.swing.JLabel;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.JSlider;
|
||||
import javax.swing.JWindow;
|
||||
import javax.swing.SwingUtilities;
|
||||
import javax.swing.TransferHandler;
|
||||
import javax.swing.UIManager;
|
||||
import javax.swing.border.EmptyBorder;
|
||||
import javax.swing.event.ChangeEvent;
|
||||
import javax.swing.event.ChangeListener;
|
||||
import javax.swing.event.MouseInputAdapter;
|
||||
|
||||
import com.sun.jna.Native;
|
||||
import com.sun.jna.NativeLong;
|
||||
import com.sun.jna.Pointer;
|
||||
import com.sun.jna.platform.WindowUtils;
|
||||
import com.sun.jna.platform.unix.X11;
|
||||
import com.sun.jna.platform.unix.X11.Display;
|
||||
import com.sun.jna.platform.unix.X11.GC;
|
||||
import com.sun.jna.platform.win32.GDI32;
|
||||
import com.sun.jna.platform.win32.User32;
|
||||
import com.sun.jna.platform.win32.WinGDI;
|
||||
import com.sun.jna.platform.win32.WinUser;
|
||||
import com.sun.jna.platform.win32.WinDef.HBITMAP;
|
||||
import com.sun.jna.platform.win32.WinDef.HDC;
|
||||
import com.sun.jna.platform.win32.WinDef.HWND;
|
||||
import com.sun.jna.platform.win32.WinGDI.BITMAPINFO;
|
||||
import com.sun.jna.platform.win32.WinNT.HANDLE;
|
||||
import com.sun.jna.platform.win32.WinUser.BLENDFUNCTION;
|
||||
import com.sun.jna.platform.win32.WinDef.POINT;
|
||||
import com.sun.jna.platform.win32.WinUser.SIZE;
|
||||
import com.sun.jna.ptr.PointerByReference;
|
||||
|
||||
// TODO: put this into a reasonable API; right now this is pretty much
|
||||
// just hard-coded blitting of an image into a window
|
||||
// Thanks to Rui Lopes for the C# example on which this is based:
|
||||
// rui@ruilopes.com
|
||||
// http://www.codeproject.com/cs/media/perpxalpha_sharp.asp?df=100&forumid=3270&exp=0&select=773155
|
||||
public class AlphaMaskDemo implements Runnable {
|
||||
|
||||
private static final DataFlavor URL_FLAVOR =
|
||||
new DataFlavor("application/x-java-url; class=java.net.URL", "URL");
|
||||
private static final DataFlavor URI_LIST_FLAVOR =
|
||||
new DataFlavor("text/uri-list; class=java.lang.String", "URI list");
|
||||
|
||||
private JFrame frame;
|
||||
private JWindow alphaWindow;
|
||||
private float alpha = 1f;
|
||||
private Image image;
|
||||
|
||||
private void update() {
|
||||
update(false, true);
|
||||
}
|
||||
|
||||
private void update(boolean a, boolean i) {
|
||||
String os = System.getProperty("os.name");
|
||||
if (os.startsWith("Windows"))
|
||||
updateW32(a, i);
|
||||
else if (os.startsWith("Linux"))
|
||||
updateX11(a, i);
|
||||
else if (os.startsWith("Mac"))
|
||||
updateMac(a, i);
|
||||
}
|
||||
|
||||
private void updateMac(boolean a, boolean i) {
|
||||
if (!alphaWindow.isDisplayable()) {
|
||||
alphaWindow.pack();
|
||||
}
|
||||
if (a)
|
||||
WindowUtils.setWindowAlpha(alphaWindow, alpha);
|
||||
if (i) {
|
||||
alphaWindow.setBackground(new Color(0,0,0,0));
|
||||
alphaWindow.setContentPane(new JLabel(new ImageIcon(image)));
|
||||
alphaWindow.setSize(alphaWindow.getPreferredSize());
|
||||
}
|
||||
if (!alphaWindow.isVisible()) {
|
||||
Window parent = alphaWindow.getOwner();
|
||||
Point where = parent.getLocationOnScreen();
|
||||
where.translate(parent.getWidth(), 0);
|
||||
alphaWindow.setLocation(where);
|
||||
alphaWindow.setVisible(true);
|
||||
}
|
||||
}
|
||||
|
||||
private com.sun.jna.Memory buffer;
|
||||
private int[] pixels;
|
||||
private void updateX11(boolean a, boolean i) {
|
||||
X11 x11 = X11.INSTANCE;
|
||||
X11.Window win = X11.Window.None;
|
||||
Display dpy = x11.XOpenDisplay(null);
|
||||
try {
|
||||
if (!alphaWindow.isDisplayable()) {
|
||||
alphaWindow.pack();
|
||||
if (System.getProperty("java.version").matches("^1\\.4\\..*"))
|
||||
alphaWindow.setVisible(true);
|
||||
win = new X11.Window((int)Native.getWindowID(alphaWindow));
|
||||
Window parent = alphaWindow.getOwner();
|
||||
Point where = parent.getLocationOnScreen();
|
||||
where.translate(parent.getWidth(), 0);
|
||||
alphaWindow.removeAll();
|
||||
alphaWindow.setLocation(where);
|
||||
alphaWindow.setBackground(new Color(0,0,0,0));
|
||||
}
|
||||
else {
|
||||
win = new X11.Window((int)Native.getWindowID(alphaWindow));
|
||||
}
|
||||
|
||||
if (i) {
|
||||
int w = image.getWidth(null);
|
||||
int h = image.getHeight(null);
|
||||
alphaWindow.setSize(w, h);
|
||||
if (buffer == null || buffer.size() != w*h*4) {
|
||||
buffer = new com.sun.jna.Memory(w*h*4);
|
||||
pixels = new int[w*h];
|
||||
}
|
||||
|
||||
BufferedImage buf = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB_PRE);
|
||||
Graphics g = buf.getGraphics();
|
||||
g.drawImage(image, 0, 0, w, h, null);
|
||||
|
||||
long start = System.currentTimeMillis();
|
||||
long blitTime, putImageTime, write;
|
||||
GC gc = x11.XCreateGC(dpy, win, new NativeLong(0), null);
|
||||
long gcTime = System.currentTimeMillis();
|
||||
try {
|
||||
Raster raster = buf.getData();
|
||||
int[] pixel = new int[4];
|
||||
for (int y=0;y < h;y++) {
|
||||
for (int x=0;x < w;x++) {
|
||||
raster.getPixel(x, y, pixel);
|
||||
int alpha = (pixel[3]&0xFF)<<24;
|
||||
int red = (pixel[2]&0xFF);
|
||||
int green = (pixel[1]&0xFF)<<8;
|
||||
int blue = (pixel[0]&0xFF)<<16;
|
||||
pixels[y*w+x] = alpha|red|green|blue;
|
||||
}
|
||||
}
|
||||
blitTime = System.currentTimeMillis();
|
||||
X11.XWindowAttributes xwa = new X11.XWindowAttributes();
|
||||
x11.XGetWindowAttributes(dpy, win, xwa);
|
||||
X11.XImage image = x11.XCreateImage(dpy, xwa.visual,
|
||||
32, X11.ZPixmap,
|
||||
0, buffer, w, h, 32, w*4);
|
||||
buffer.write(0, pixels, 0, pixels.length);
|
||||
write = System.currentTimeMillis();
|
||||
x11.XPutImage(dpy, win, gc, image, 0,0,0,0,w,h);
|
||||
x11.XFree(image.getPointer());
|
||||
putImageTime = System.currentTimeMillis();
|
||||
}
|
||||
finally {
|
||||
if (gc != null)
|
||||
x11.XFreeGC(dpy, gc);
|
||||
}
|
||||
long end = System.currentTimeMillis();
|
||||
//System.out.println("gc: " + (gcTime-start) + "ms");
|
||||
//System.out.println("blit: " + (blitTime-gcTime) + "ms");
|
||||
//System.out.println("write: " + (write-blitTime) + "ms");
|
||||
//System.out.println("put image: " + (putImageTime-write) + "ms");
|
||||
//System.out.println("total: " + (end-start) + "ms");
|
||||
}
|
||||
}
|
||||
finally {
|
||||
if (dpy != null)
|
||||
x11.XCloseDisplay(dpy);
|
||||
}
|
||||
if (a)
|
||||
WindowUtils.setWindowAlpha(alphaWindow, alpha);
|
||||
|
||||
if (!alphaWindow.isVisible()) {
|
||||
alphaWindow.setVisible(true);
|
||||
// hack for initial refresh (X11)
|
||||
update(true, true);
|
||||
}
|
||||
}
|
||||
|
||||
private HWND getHwnd(Window w) {
|
||||
HWND hwnd = new HWND();
|
||||
hwnd.setPointer(Native.getWindowPointer(w));
|
||||
return hwnd;
|
||||
}
|
||||
|
||||
private void updateW32(boolean a, boolean i) {
|
||||
User32 user = User32.INSTANCE;
|
||||
GDI32 gdi = GDI32.INSTANCE;
|
||||
HWND hWnd = null;
|
||||
|
||||
if (!alphaWindow.isDisplayable()) {
|
||||
alphaWindow.pack();
|
||||
hWnd = getHwnd(alphaWindow);
|
||||
int flags = user.GetWindowLong(hWnd, WinUser.GWL_EXSTYLE);
|
||||
flags |= WinUser.WS_EX_LAYERED;
|
||||
user.SetWindowLong(hWnd, WinUser.GWL_EXSTYLE, flags);
|
||||
Window parent = alphaWindow.getOwner();
|
||||
Point where = parent.getLocationOnScreen();
|
||||
where.translate(parent.getWidth(), 0);
|
||||
alphaWindow.setLocation(where);
|
||||
}
|
||||
else {
|
||||
hWnd = getHwnd(alphaWindow);
|
||||
}
|
||||
|
||||
if (i) {
|
||||
int w = image.getWidth(null);
|
||||
int h = image.getHeight(null);
|
||||
HDC screenDC = user.GetDC(null);
|
||||
HDC memDC = gdi.CreateCompatibleDC(screenDC);
|
||||
HBITMAP hBitmap = null;
|
||||
HANDLE oldBitmap = null;
|
||||
|
||||
try {
|
||||
BufferedImage buf = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB_PRE);
|
||||
Graphics g = buf.getGraphics();
|
||||
g.drawImage(image, 0, 0, w, h, null);
|
||||
|
||||
BITMAPINFO bmi = new BITMAPINFO();
|
||||
bmi.bmiHeader.biWidth = w;
|
||||
bmi.bmiHeader.biHeight = h;
|
||||
bmi.bmiHeader.biPlanes = 1;
|
||||
bmi.bmiHeader.biBitCount = 32;
|
||||
bmi.bmiHeader.biCompression = WinGDI.BI_RGB;
|
||||
bmi.bmiHeader.biSizeImage = w * h * 4;
|
||||
|
||||
PointerByReference ppbits = new PointerByReference();
|
||||
hBitmap = gdi.CreateDIBSection(memDC, bmi, WinGDI.DIB_RGB_COLORS,
|
||||
ppbits, null, 0);
|
||||
oldBitmap = gdi.SelectObject(memDC, hBitmap);
|
||||
Pointer pbits = ppbits.getValue();
|
||||
|
||||
Raster raster = buf.getData();
|
||||
int[] pixel = new int[4];
|
||||
int[] bits = new int[w*h];
|
||||
for (int y=0;y < h;y++) {
|
||||
for (int x=0;x < w;x++) {
|
||||
raster.getPixel(x, h-y-1, pixel);
|
||||
int alpha = (pixel[3]&0xFF)<<24;
|
||||
int red = (pixel[2]&0xFF);
|
||||
int green = (pixel[1]&0xFF)<<8;
|
||||
int blue = (pixel[0]&0xFF)<<16;
|
||||
bits[x + y * w] = alpha|red|green|blue;
|
||||
}
|
||||
}
|
||||
pbits.write(0, bits, 0, bits.length);
|
||||
|
||||
SIZE size = new SIZE();
|
||||
size.cx = w;
|
||||
size.cy = h;
|
||||
POINT loc = new POINT();
|
||||
loc.x = alphaWindow.getX();
|
||||
loc.y = alphaWindow.getY();
|
||||
POINT srcLoc = new POINT();
|
||||
BLENDFUNCTION blend = new BLENDFUNCTION();
|
||||
blend.SourceConstantAlpha = (byte)(alpha * 255);
|
||||
blend.AlphaFormat = WinUser.AC_SRC_ALPHA;
|
||||
user.UpdateLayeredWindow(hWnd, screenDC, loc, size, memDC, srcLoc,
|
||||
0, blend, WinUser.ULW_ALPHA);
|
||||
}
|
||||
finally {
|
||||
user.ReleaseDC(null, screenDC);
|
||||
if (hBitmap != null) {
|
||||
gdi.SelectObject(memDC, oldBitmap);
|
||||
gdi.DeleteObject(hBitmap);
|
||||
}
|
||||
gdi.DeleteDC(memDC);
|
||||
}
|
||||
}
|
||||
else if (a) {
|
||||
BLENDFUNCTION blend = new BLENDFUNCTION();
|
||||
blend.SourceConstantAlpha = (byte)(alpha * 255);
|
||||
blend.AlphaFormat = WinUser.AC_SRC_ALPHA;
|
||||
user.UpdateLayeredWindow(hWnd, null, null, null, null, null,
|
||||
0, blend, WinUser.ULW_ALPHA);
|
||||
}
|
||||
|
||||
if (!alphaWindow.isVisible()) {
|
||||
alphaWindow.setVisible(true);
|
||||
}
|
||||
}
|
||||
|
||||
private ImageObserver observer = new ImageObserver() {
|
||||
public boolean imageUpdate(final Image img, int infoflags, int x, int y, int width, int height) {
|
||||
if ((infoflags & (ImageObserver.ALLBITS|ImageObserver.FRAMEBITS)) != 0) {
|
||||
SwingUtilities.invokeLater(new Runnable() {
|
||||
public void run() {
|
||||
setImage(img);
|
||||
}
|
||||
});
|
||||
return false;
|
||||
}
|
||||
else if ((infoflags & (ImageObserver.ERROR|ImageObserver.ABORT)) != 0) {
|
||||
System.out.println("Image load error: " + img);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
};
|
||||
private void setImage(final Image image) {
|
||||
int w = image.getWidth(observer);
|
||||
int h = image.getHeight(observer);
|
||||
if (w > 0 && h > 0) {
|
||||
this.image = image;
|
||||
frame.setIconImage(image);
|
||||
update(false, true);
|
||||
}
|
||||
}
|
||||
|
||||
private void setAlpha(float alpha) {
|
||||
this.alpha = alpha = Math.min(1f, Math.max(0f, alpha));
|
||||
update(true, false);
|
||||
}
|
||||
|
||||
public void run() {
|
||||
// Must find a graphics configuration with a depth of 32 bits
|
||||
GraphicsConfiguration gconfig = WindowUtils.getAlphaCompatibleGraphicsConfiguration();
|
||||
frame = new JFrame("Alpha Mask Demo");
|
||||
alphaWindow = new JWindow(frame, gconfig);
|
||||
MouseInputAdapter handler = new MouseInputAdapter() {
|
||||
private Point offset;
|
||||
public void mousePressed(MouseEvent e) {
|
||||
if (SwingUtilities.isLeftMouseButton(e))
|
||||
offset = e.getPoint();
|
||||
}
|
||||
public void mouseReleased(MouseEvent e) {
|
||||
offset = null;
|
||||
// hack (w32) calling this has the side effect of re-enabling
|
||||
// hit testing; not sure why it gets disabled
|
||||
if (System.getProperty("os.name").startsWith("Windows"))
|
||||
update(true, true);
|
||||
}
|
||||
public void mouseDragged(MouseEvent e) {
|
||||
if (offset != null) {
|
||||
Window w = (Window)e.getSource();
|
||||
Point where = e.getPoint();
|
||||
where.translate(-offset.x, -offset.y);
|
||||
Point loc = w.getLocationOnScreen();
|
||||
loc.translate(where.x, where.y);
|
||||
w.setLocation(loc.x, loc.y);
|
||||
}
|
||||
}
|
||||
};
|
||||
alphaWindow.addMouseListener(handler);
|
||||
alphaWindow.addMouseMotionListener(handler);
|
||||
JPanel p = new JPanel(new BorderLayout(8, 8));
|
||||
p.setBorder(new EmptyBorder(8, 8, 8, 8));
|
||||
p.setTransferHandler(new TransferHandler() {
|
||||
private static final long serialVersionUID = 1L;
|
||||
public boolean canImport(JComponent comp, DataFlavor[] transferFlavors) {
|
||||
List<DataFlavor> list = Arrays.asList(transferFlavors);
|
||||
if (list.contains(URL_FLAVOR)
|
||||
|| list.contains(URI_LIST_FLAVOR)
|
||||
|| list.contains(DataFlavor.imageFlavor)
|
||||
|| list.contains(DataFlavor.javaFileListFlavor)) {
|
||||
return true;
|
||||
}
|
||||
if (DataFlavor.selectBestTextFlavor(transferFlavors) != null) {
|
||||
return true;
|
||||
}
|
||||
System.out.println("No acceptable flavor found in "
|
||||
+ Arrays.asList(transferFlavors));
|
||||
return false;
|
||||
}
|
||||
public boolean importData(JComponent comp, Transferable t) {
|
||||
try {
|
||||
if (t.isDataFlavorSupported(URL_FLAVOR)) {
|
||||
URL url = (URL)t.getTransferData(URL_FLAVOR);
|
||||
setImage(Toolkit.getDefaultToolkit().getImage(url));
|
||||
return true;
|
||||
}
|
||||
if (t.isDataFlavorSupported(URI_LIST_FLAVOR)) {
|
||||
String s = (String)t.getTransferData(URI_LIST_FLAVOR);
|
||||
String[] uris = s.split("[\r\n]");
|
||||
if (uris.length > 0) {
|
||||
URL url = new URL(uris[0]);
|
||||
setImage(Toolkit.getDefaultToolkit().getImage(url));
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
if (t.isDataFlavorSupported(DataFlavor.imageFlavor)) {
|
||||
Image image = (Image)t.getTransferData(DataFlavor.imageFlavor);
|
||||
setImage(image);
|
||||
return true;
|
||||
}
|
||||
if (t.isDataFlavorSupported(DataFlavor.javaFileListFlavor)){
|
||||
List<File> files = (List<File>) t.getTransferData(DataFlavor.javaFileListFlavor);
|
||||
File f = files.get(0);
|
||||
URL url = new URL("file://" + f.toURI().toURL().getPath());
|
||||
Image image = Toolkit.getDefaultToolkit().getImage(url);
|
||||
setImage(image);
|
||||
return true;
|
||||
}
|
||||
DataFlavor flavor = DataFlavor.selectBestTextFlavor(t.getTransferDataFlavors());
|
||||
if (flavor != null) {
|
||||
Reader reader = flavor.getReaderForText(t);
|
||||
char[] buf = new char[512];
|
||||
StringBuilder b = new StringBuilder();
|
||||
int count;
|
||||
// excise excess NUL characters (bug in firefox, java
|
||||
// or my code, not sure which). someone got the
|
||||
// encoding wrong
|
||||
while ((count = reader.read(buf)) > 0) {
|
||||
for (int i=0;i < count;i++) {
|
||||
if (buf[i] != 0)
|
||||
b.append(buf, i, 1);
|
||||
}
|
||||
}
|
||||
String html = b.toString();
|
||||
Pattern p = Pattern.compile("<img.*src=\"([^\\\"\">]+)\"",
|
||||
Pattern.CANON_EQ|Pattern.UNICODE_CASE);
|
||||
Matcher m = p.matcher(html);
|
||||
if (m.find()) {
|
||||
URL url = new URL(m.group(1));
|
||||
System.out.println("Load image from " + url);
|
||||
Image image = Toolkit.getDefaultToolkit().getImage(url);
|
||||
setImage(image);
|
||||
return true;
|
||||
}
|
||||
System.out.println("Can't parse text: " + html);
|
||||
return false;
|
||||
}
|
||||
System.out.println("No flavor available: "
|
||||
+ Arrays.asList(t.getTransferDataFlavors()));
|
||||
}
|
||||
catch (UnsupportedFlavorException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
catch(Throwable e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
});
|
||||
p.add(new JLabel("<html><center>Drop an image with an alpha channel onto this window<br>"
|
||||
+ "You may also adjust the overall transparency with the slider</center></html>"),
|
||||
BorderLayout.NORTH);
|
||||
final JSlider slider = new JSlider(0, 255, 255);
|
||||
slider.addChangeListener(new ChangeListener() {
|
||||
public void stateChanged(ChangeEvent e) {
|
||||
int value = slider.getValue();
|
||||
setAlpha(value / 255f);
|
||||
}
|
||||
});
|
||||
p.add(slider, BorderLayout.SOUTH);
|
||||
|
||||
frame.getContentPane().add(p);
|
||||
frame.pack();
|
||||
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
|
||||
centerOnScreen(frame);
|
||||
frame.setVisible(true);
|
||||
p.addMouseListener(new MouseAdapter() {
|
||||
public void mousePressed(MouseEvent e) {
|
||||
update();
|
||||
}
|
||||
});
|
||||
|
||||
try {
|
||||
URL url = getClass().getResource("tardis.png");
|
||||
if (url != null) {
|
||||
setImage(Toolkit.getDefaultToolkit().getImage(url));
|
||||
}
|
||||
}
|
||||
catch(Exception e) { }
|
||||
}
|
||||
|
||||
/** Center the given {@link Window} on the default screen. */
|
||||
private static void centerOnScreen(Window window) {
|
||||
Point center = GraphicsEnvironment.getLocalGraphicsEnvironment().getCenterPoint();
|
||||
Rectangle max = GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds();
|
||||
int x = Math.max(center.x - Math.round(window.getWidth()/2f), max.x);
|
||||
int y = Math.max(center.y - Math.round(window.getHeight()/2f), max.y);
|
||||
window.setLocation(new Point(x, y));
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
try {
|
||||
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
|
||||
}
|
||||
catch (Exception e) {
|
||||
}
|
||||
SwingUtilities.invokeLater(new AlphaMaskDemo());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- Generic JNLP/Web Start Configuration -->
|
||||
<jnlp spec="1.0" codebase="http://abbot.sf.net/demo" href="AlphaMaskDemo.jnlp">
|
||||
<information>
|
||||
<title>Alpha Mask Demo</title>
|
||||
<vendor>Technomage</vendor>
|
||||
<homepage href="http://rabbit-hole.blogspot.com"/>
|
||||
<description>Demo of a per-pixel alpha masked window.</description>
|
||||
<description kind="short">Alpha Mask</description>
|
||||
</information>
|
||||
<resources>
|
||||
<j2se version="1.3+" href="http://java.sun.com/products/autodl/j2se"/>
|
||||
<!-- Required for window transparency -->
|
||||
<property name="sun.java2d.noddraw" value="true"/>
|
||||
<jar href="examples.jar" main="true"/>
|
||||
<jar href="jna.jar"/>
|
||||
</resources>
|
||||
<resources os="Windows" arch="x86">
|
||||
<nativelib href="win32-x86.jar"/>
|
||||
</resources>
|
||||
<resources os="Linux" arch="i386">
|
||||
<!-- Use 32-bit X11 libs on 64-bit systems (Ubuntu) -->
|
||||
<property name="jna.library.path" value="/usr/X11R6/lib:/usr/lib32:/usr/lib"/>
|
||||
<nativelib href="linux-i386.jar"/>
|
||||
</resources>
|
||||
<resources os="Mac">
|
||||
<nativelib href="darwin.jar"/>
|
||||
</resources>
|
||||
<application-desc main-class="com.sun.jna.examples.AlphaMaskDemo"/>
|
||||
<security>
|
||||
<all-permissions/>
|
||||
</security>
|
||||
</jnlp>
|
||||
@@ -0,0 +1,301 @@
|
||||
/*
|
||||
* Copyright (c) 2007-2008 Timothy Wall, All Rights Reserved 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.
|
||||
*/
|
||||
package com.sun.jna.contrib.demo;
|
||||
|
||||
import java.awt.BorderLayout;
|
||||
import java.awt.Cursor;
|
||||
import java.awt.GraphicsConfiguration;
|
||||
import java.awt.GraphicsEnvironment;
|
||||
import java.awt.Image;
|
||||
import java.awt.Point;
|
||||
import java.awt.Rectangle;
|
||||
import java.awt.Toolkit;
|
||||
import java.awt.Window;
|
||||
import java.awt.datatransfer.DataFlavor;
|
||||
import java.awt.datatransfer.Transferable;
|
||||
import java.awt.datatransfer.UnsupportedFlavorException;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
import java.awt.event.MouseEvent;
|
||||
import java.awt.image.ImageObserver;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.Reader;
|
||||
import java.net.URL;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import javax.swing.ImageIcon;
|
||||
import javax.swing.JButton;
|
||||
import javax.swing.JComponent;
|
||||
import javax.swing.JFrame;
|
||||
import javax.swing.JLabel;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.JSlider;
|
||||
import javax.swing.JWindow;
|
||||
import javax.swing.SwingConstants;
|
||||
import javax.swing.SwingUtilities;
|
||||
import javax.swing.TransferHandler;
|
||||
import javax.swing.UIManager;
|
||||
import javax.swing.border.EmptyBorder;
|
||||
import javax.swing.event.ChangeEvent;
|
||||
import javax.swing.event.ChangeListener;
|
||||
import javax.swing.event.MouseInputAdapter;
|
||||
|
||||
import com.sun.jna.platform.WindowUtils;
|
||||
|
||||
public class AlphaMaskDemo2 implements Runnable {
|
||||
private static final DataFlavor URL_FLAVOR =
|
||||
new DataFlavor("application/x-java-url; class=java.net.URL", "URL");
|
||||
private static final DataFlavor URI_LIST_FLAVOR =
|
||||
new DataFlavor("text/uri-list; class=java.lang.String", "URI list");
|
||||
private JFrame frame;
|
||||
private JWindow alphaWindow;
|
||||
private JLabel icon;
|
||||
private ImageObserver observer = new ImageObserver() {
|
||||
public boolean imageUpdate(final Image img, int infoflags, int x,
|
||||
int y, int width, int height) {
|
||||
if ((infoflags & (ImageObserver.ALLBITS | ImageObserver.FRAMEBITS)) != 0) {
|
||||
SwingUtilities.invokeLater(new Runnable() {
|
||||
public void run() {
|
||||
setImage(img);
|
||||
}
|
||||
});
|
||||
return false;
|
||||
}
|
||||
else if ((infoflags & (ImageObserver.ERROR | ImageObserver.ABORT)) != 0) {
|
||||
System.err.println("Image load error: " + img);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
private void setImage(final Image image) {
|
||||
final int w = image.getWidth(observer);
|
||||
final int h = image.getHeight(observer);
|
||||
if (w > 0 && h > 0) {
|
||||
frame.setIconImage(image);
|
||||
icon.setIcon(new ImageIcon(image));
|
||||
if (!alphaWindow.isVisible()) {
|
||||
alphaWindow.pack();
|
||||
alphaWindow.setVisible(true);
|
||||
}
|
||||
else {
|
||||
alphaWindow.setSize(alphaWindow.getPreferredSize());
|
||||
}
|
||||
icon.getParent().invalidate();
|
||||
icon.getParent().repaint();
|
||||
}
|
||||
}
|
||||
|
||||
public void run() {
|
||||
// Must find a graphics configuration with a depth of 32 bits
|
||||
GraphicsConfiguration gconfig = WindowUtils.getAlphaCompatibleGraphicsConfiguration();
|
||||
frame = new JFrame("Alpha Mask Demo");
|
||||
alphaWindow = new JWindow(frame, gconfig);
|
||||
icon = new JLabel();
|
||||
icon.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
|
||||
alphaWindow.getContentPane().add(icon);
|
||||
JButton quit = new JButton("Quit");
|
||||
JLabel label = new JLabel("Drag this window by its image");
|
||||
label.setHorizontalAlignment(SwingConstants.CENTER);
|
||||
alphaWindow.getContentPane().add(label, BorderLayout.NORTH);
|
||||
alphaWindow.getContentPane().add(quit, BorderLayout.SOUTH);
|
||||
quit.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
System.exit(0);
|
||||
}
|
||||
});
|
||||
MouseInputAdapter handler = new MouseInputAdapter() {
|
||||
private Point offset;
|
||||
|
||||
public void mousePressed(MouseEvent e) {
|
||||
if (SwingUtilities.isLeftMouseButton(e))
|
||||
offset = e.getPoint();
|
||||
}
|
||||
|
||||
public void mouseReleased(MouseEvent e) {
|
||||
offset = null;
|
||||
}
|
||||
|
||||
public void mouseDragged(MouseEvent e) {
|
||||
if (offset != null) {
|
||||
Window w = (Window)e.getSource();
|
||||
Point where = e.getPoint();
|
||||
where.translate(-offset.x, -offset.y);
|
||||
Point loc = w.getLocationOnScreen();
|
||||
loc.translate(where.x, where.y);
|
||||
w.setLocation(loc.x, loc.y);
|
||||
}
|
||||
}
|
||||
};
|
||||
alphaWindow.addMouseListener(handler);
|
||||
alphaWindow.addMouseMotionListener(handler);
|
||||
JPanel p = new JPanel(new BorderLayout(8, 8));
|
||||
p.setBorder(new EmptyBorder(8, 8, 8, 8));
|
||||
p.setTransferHandler(new TransferHandler() {
|
||||
private static final long serialVersionUID = 1L;
|
||||
public boolean canImport(JComponent comp,
|
||||
DataFlavor[] transferFlavors) {
|
||||
List<DataFlavor> list = Arrays.asList(transferFlavors);
|
||||
if (list.contains(URL_FLAVOR) || list.contains(URI_LIST_FLAVOR)
|
||||
|| list.contains(DataFlavor.imageFlavor)
|
||||
|| list.contains(DataFlavor.javaFileListFlavor)) {
|
||||
return true;
|
||||
}
|
||||
if (DataFlavor.selectBestTextFlavor(transferFlavors) != null) {
|
||||
return true;
|
||||
}
|
||||
System.err.println("No acceptable flavor found in "
|
||||
+ Arrays.asList(transferFlavors));
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean importData(JComponent comp, Transferable t) {
|
||||
try {
|
||||
if (t.isDataFlavorSupported(URL_FLAVOR)) {
|
||||
URL url = (URL)t.getTransferData(URL_FLAVOR);
|
||||
setImage(Toolkit.getDefaultToolkit().getImage(url));
|
||||
return true;
|
||||
}
|
||||
if (t.isDataFlavorSupported(URI_LIST_FLAVOR)) {
|
||||
String s = (String)t.getTransferData(URI_LIST_FLAVOR);
|
||||
String[] uris = s.split("[\r\n]");
|
||||
if (uris.length > 0) {
|
||||
URL url = new URL(uris[0]);
|
||||
setImage(Toolkit.getDefaultToolkit().getImage(url));
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
if (t.isDataFlavorSupported(DataFlavor.imageFlavor)) {
|
||||
Image image = (Image)t
|
||||
.getTransferData(DataFlavor.imageFlavor);
|
||||
setImage(image);
|
||||
return true;
|
||||
}
|
||||
if (t.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
|
||||
List<File> files = (List<File>) t.getTransferData(DataFlavor.javaFileListFlavor);
|
||||
File f = files.get(0);
|
||||
URL url = new URL("file://"
|
||||
+ f.toURI().toURL().getPath());
|
||||
Image image = Toolkit.getDefaultToolkit().getImage(url);
|
||||
setImage(image);
|
||||
return true;
|
||||
}
|
||||
DataFlavor flavor = DataFlavor
|
||||
.selectBestTextFlavor(t
|
||||
.getTransferDataFlavors());
|
||||
if (flavor != null) {
|
||||
Reader reader = flavor.getReaderForText(t);
|
||||
char[] buf = new char[512];
|
||||
StringBuilder b = new StringBuilder();
|
||||
int count;
|
||||
// excise excess NUL characters (bug in firefox,
|
||||
// java
|
||||
// or my code, not sure which). someone got the
|
||||
// encoding wrong
|
||||
while ((count = reader.read(buf)) > 0) {
|
||||
for (int i = 0; i < count; i++) {
|
||||
if (buf[i] != 0)
|
||||
b.append(buf, i, 1);
|
||||
}
|
||||
}
|
||||
String html = b.toString();
|
||||
Pattern p = Pattern
|
||||
.compile(
|
||||
"<img.*src=\"([^\\\"\">]+)\"",
|
||||
Pattern.CANON_EQ
|
||||
| Pattern.UNICODE_CASE);
|
||||
Matcher m = p.matcher(html);
|
||||
if (m.find()) {
|
||||
URL url = new URL(m.group(1));
|
||||
System.out.println("Load image from " + url);
|
||||
Image image = Toolkit.getDefaultToolkit()
|
||||
.getImage(url);
|
||||
setImage(image);
|
||||
return true;
|
||||
}
|
||||
System.err.println("Can't parse text: " + html);
|
||||
return false;
|
||||
}
|
||||
System.err.println("No flavor available: "
|
||||
+ Arrays.asList(t.getTransferDataFlavors()));
|
||||
}
|
||||
catch (UnsupportedFlavorException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
catch (Throwable e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
});
|
||||
p
|
||||
.add(
|
||||
new JLabel(
|
||||
"<html><center>Drop an image with an alpha channel onto this window<br>"
|
||||
+ "You may also adjust the overall transparency with the slider</center></html>"),
|
||||
BorderLayout.NORTH);
|
||||
p.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
|
||||
final JSlider slider = new JSlider(0, 255, 255);
|
||||
slider.addChangeListener(new ChangeListener() {
|
||||
public void stateChanged(ChangeEvent e) {
|
||||
int value = slider.getValue();
|
||||
WindowUtils.setWindowAlpha(alphaWindow, value / 255f);
|
||||
}
|
||||
});
|
||||
p.add(slider, BorderLayout.SOUTH);
|
||||
frame.getContentPane().add(p);
|
||||
frame.pack();
|
||||
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
|
||||
centerOnScreen(frame);
|
||||
frame.setVisible(true);
|
||||
WindowUtils.setWindowTransparent(alphaWindow, true);
|
||||
alphaWindow.setLocation(frame.getX() + frame.getWidth() + 4,
|
||||
frame.getY());
|
||||
try {
|
||||
URL url = getClass().getResource("tardis.png");
|
||||
if (url != null) {
|
||||
setImage(Toolkit.getDefaultToolkit().getImage(url));
|
||||
}
|
||||
}
|
||||
catch (Exception e) {
|
||||
}
|
||||
}
|
||||
|
||||
/** Center the given {@link Window} on the default screen. */
|
||||
private static void centerOnScreen(Window window) {
|
||||
Point center = GraphicsEnvironment.getLocalGraphicsEnvironment()
|
||||
.getCenterPoint();
|
||||
Rectangle max = GraphicsEnvironment.getLocalGraphicsEnvironment()
|
||||
.getMaximumWindowBounds();
|
||||
int x = Math.max(center.x - Math.round(window.getWidth() / 2f), max.x);
|
||||
int y = Math.max(center.y - Math.round(window.getHeight() / 2f), max.y);
|
||||
window.setLocation(new Point(x, y));
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
try {
|
||||
System.setProperty("sun.java2d.noddraw", "true");
|
||||
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
|
||||
}
|
||||
catch (Exception e) {
|
||||
}
|
||||
SwingUtilities.invokeLater(new AlphaMaskDemo2());
|
||||
}
|
||||
}
|
||||
Arquivo binário não exibido.
|
Depois Largura: | Altura: | Tamanho: 18 KiB |
@@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<classpath>
|
||||
<classpathentry kind="src" path=""/>
|
||||
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
|
||||
<classpathentry kind="src" path="/platform"/>
|
||||
<classpathentry kind="output" path="bin"/>
|
||||
</classpath>
|
||||
@@ -0,0 +1,17 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<projectDescription>
|
||||
<name>balloonmanagerdemo</name>
|
||||
<comment></comment>
|
||||
<projects>
|
||||
</projects>
|
||||
<buildSpec>
|
||||
<buildCommand>
|
||||
<name>org.eclipse.jdt.core.javabuilder</name>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
</buildSpec>
|
||||
<natures>
|
||||
<nature>org.eclipse.jdt.core.javanature</nature>
|
||||
</natures>
|
||||
</projectDescription>
|
||||
@@ -0,0 +1,68 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project name="jnacontrib.balloonmanagerdemo" default="jar" basedir=".">
|
||||
<description>Builds, tests, and runs the project jnacontrib.balloonmanagerdemo.</description>
|
||||
<!-- Locations -->
|
||||
<property name="src" location="."/>
|
||||
<property name="build" location="build"/>
|
||||
<property name="jna-dist" location="../../dist"/>
|
||||
|
||||
<property name="classes" location="${build}/classes"/>
|
||||
<property name="jar" location="${build}/demo-balloonmanager.jar"/>
|
||||
<property name="file.reference.jna.jar" location="../../build/jna.jar"/>
|
||||
<property name="main-class" value="com.sun.jna.contrib.demo.BalloonManagerDemo" />
|
||||
|
||||
<path id="classpath">
|
||||
<fileset file="${file.reference.jna.jar}"/>
|
||||
<fileset dir="../platform/dist" includes="jna-platform.jar"/>
|
||||
</path>
|
||||
|
||||
<!-- Run Demo. -->
|
||||
<target name="run" depends="compile">
|
||||
<java classname="${main-class}" fork="true">
|
||||
<classpath>
|
||||
<pathelement location="${classes}" />
|
||||
<path refid="classpath"/>
|
||||
</classpath>
|
||||
</java>
|
||||
</target>
|
||||
|
||||
<!-- Delete class and jar files. -->
|
||||
<target name="clean">
|
||||
<delete dir="${classes}"/>
|
||||
<delete file="${jar}"/>
|
||||
<delete dir="${build}"/>
|
||||
</target>
|
||||
|
||||
<!-- Compile all classes. -->
|
||||
<target name="compile">
|
||||
<mkdir dir="${classes}"/>
|
||||
<!-- Compile the project. -->
|
||||
<javac srcdir="${src}" destdir="${classes}" target="1.5" source="1.5"
|
||||
encoding="UTF-8" debug="on" includeantruntime="false">
|
||||
<classpath>
|
||||
<path refid="classpath"/>
|
||||
</classpath>
|
||||
</javac>
|
||||
</target>
|
||||
|
||||
<!-- Create jar-file. -->
|
||||
<target name="jar" depends="compile">
|
||||
|
||||
<!-- Copy all non-java files to classes. -->
|
||||
<copy todir="${classes}/com">
|
||||
<fileset dir="${src}/com">
|
||||
<exclude name="**/*.java"/>
|
||||
</fileset>
|
||||
</copy>
|
||||
|
||||
<jar jarfile="${jar}" basedir="${classes}">
|
||||
<manifest>
|
||||
<attribute name="Main-Class" value="${main-class}"/>
|
||||
</manifest>
|
||||
<!-- platform -->
|
||||
<fileset dir="../platform/build/classes/com"/>
|
||||
<!-- jna -->
|
||||
<zipfileset src="${file.reference.jna.jar}"/>
|
||||
</jar>
|
||||
</target>
|
||||
</project>
|
||||
@@ -0,0 +1,263 @@
|
||||
/*
|
||||
* Copyright (c) 2007 Timothy Wall, All Rights Reserved
|
||||
*
|
||||
* 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. <p/> 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.
|
||||
*/
|
||||
package com.sun.jna.contrib.demo;
|
||||
|
||||
import java.awt.BorderLayout;
|
||||
import java.awt.Color;
|
||||
import java.awt.Component;
|
||||
import java.awt.Dimension;
|
||||
import java.awt.GradientPaint;
|
||||
import java.awt.Graphics;
|
||||
import java.awt.Graphics2D;
|
||||
import java.awt.Point;
|
||||
import java.awt.Shape;
|
||||
import java.awt.Window;
|
||||
import java.awt.event.ComponentAdapter;
|
||||
import java.awt.event.ComponentEvent;
|
||||
import java.awt.event.ComponentListener;
|
||||
import java.awt.event.WindowAdapter;
|
||||
import java.awt.event.WindowEvent;
|
||||
import java.awt.geom.AffineTransform;
|
||||
import java.awt.geom.Area;
|
||||
import java.awt.geom.GeneralPath;
|
||||
import java.awt.geom.RoundRectangle2D;
|
||||
|
||||
import javax.swing.Box;
|
||||
import javax.swing.JWindow;
|
||||
import javax.swing.Popup;
|
||||
import javax.swing.SwingUtilities;
|
||||
|
||||
import com.sun.jna.platform.WindowUtils;
|
||||
|
||||
/**
|
||||
* Provides a popup balloon containing an arbitrary component. This provides
|
||||
* a form of content-specific decoration less transient than a tooltip, and less
|
||||
* heavyweight and more adaptable to changing content than a dedicated window.
|
||||
* Clients are responsible for invoking show and hide on the provided popup.
|
||||
*/
|
||||
// TODO: anchor balloon point
|
||||
// TODO: connect drop shadow and parent masks
|
||||
// TODO: proper preferred size for html
|
||||
// TODO: lightweight popups
|
||||
public class BalloonManager {
|
||||
|
||||
// Avoid using drop shadow in some instances
|
||||
private static boolean useDropShadow() {
|
||||
return WindowUtils.isWindowAlphaSupported();
|
||||
}
|
||||
|
||||
private static class DropShadow extends JWindow {
|
||||
private static final long serialVersionUID = 1L;
|
||||
private static final float SHADOW_ALPHA = .25f;
|
||||
private static final float YSCALE = .80f;
|
||||
private static final double ANGLE = 2*Math.PI/24;
|
||||
private static final Point OFFSET = new Point(8, 8);
|
||||
private static final Color COLOR = new Color(0, 0, 0, 50);
|
||||
|
||||
private Shape parentMask;
|
||||
private ComponentListener listener;
|
||||
public DropShadow(final Window parent, Shape mask) {
|
||||
super(parent);
|
||||
setFocusableWindowState(false);
|
||||
setName("###overrideRedirect###");
|
||||
|
||||
Point where = parent.isShowing()
|
||||
? parent.getLocationOnScreen() : parent.getLocation();
|
||||
setLocation(where.x + OFFSET.x, where.y + OFFSET.y);
|
||||
setBackground(COLOR);
|
||||
getContentPane().setBackground(COLOR);
|
||||
|
||||
parentMask = mask;
|
||||
parent.addComponentListener(listener = new ComponentAdapter() {
|
||||
public void componentMoved(ComponentEvent e) {
|
||||
Point where = getOwner().isShowing()
|
||||
? getOwner().getLocationOnScreen()
|
||||
: getOwner().getLocation();
|
||||
setLocation(where.x + OFFSET.x, where.y + OFFSET.y);
|
||||
}
|
||||
public void componentResized(ComponentEvent e) {
|
||||
Component c = e.getComponent();
|
||||
int extra = c.getWidth() + (int)Math.sin(ANGLE)*c.getHeight();
|
||||
setSize(c.getWidth() + extra, c.getHeight());
|
||||
WindowUtils.setWindowMask(DropShadow.this, getMask());
|
||||
}
|
||||
public void componentShown(ComponentEvent e) {
|
||||
if (!isVisible()) {
|
||||
pack();
|
||||
setVisible(true);
|
||||
}
|
||||
}
|
||||
});
|
||||
addWindowListener(new WindowAdapter() {
|
||||
public void windowClosed(WindowEvent e) {
|
||||
if (listener != null) {
|
||||
parent.removeComponentListener(listener);
|
||||
listener = null;
|
||||
}
|
||||
}
|
||||
});
|
||||
WindowUtils.setWindowMask(DropShadow.this, getMask());
|
||||
WindowUtils.setWindowAlpha(DropShadow.this, SHADOW_ALPHA);
|
||||
if (parent.isVisible()) {
|
||||
pack();
|
||||
setVisible(true);
|
||||
}
|
||||
}
|
||||
|
||||
public void paint(Graphics graphics) {
|
||||
Graphics2D g = (Graphics2D)graphics.create();
|
||||
// Workaround for OSX since we only get automatic clipping
|
||||
// on the content pane and below
|
||||
g.setClip(getMask());
|
||||
g.setPaint(new GradientPaint(0, getHeight()/2, new Color(0,0,0,0), getWidth(), getHeight()/2, new Color(0,0,0,255)));
|
||||
g.fillRect(0, 0, getWidth(), getHeight());
|
||||
g.dispose();
|
||||
}
|
||||
|
||||
public Dimension getPreferredSize() {
|
||||
Dimension size = getOwner().getPreferredSize();
|
||||
size.width += 100;
|
||||
size.height += 100;
|
||||
return size;
|
||||
}
|
||||
|
||||
private Shape getMask() {
|
||||
Area area = new Area(parentMask);
|
||||
Area clip = new Area(parentMask);
|
||||
|
||||
AffineTransform tx = new AffineTransform();
|
||||
tx.translate(Math.sin(ANGLE)*getOwner().getHeight(), 0);
|
||||
tx.shear(-Math.tan(ANGLE), 0);
|
||||
tx.scale(1, YSCALE);
|
||||
tx.translate(0, (1-YSCALE)*getOwner().getHeight());
|
||||
area.transform(tx);
|
||||
tx = new AffineTransform();
|
||||
tx.translate(-OFFSET.x, -OFFSET.y);
|
||||
clip.transform(tx);
|
||||
area.subtract(clip);
|
||||
return area;
|
||||
}
|
||||
}
|
||||
|
||||
private static final class BubbleWindow extends JWindow {
|
||||
private static final long serialVersionUID = 1L;
|
||||
private static final int Y_OFFSET = 50;
|
||||
private static final int ARC = 25;
|
||||
|
||||
private Point offset;
|
||||
private Area mask;
|
||||
private Dimension maskSize;
|
||||
private ComponentListener moveTracker = new ComponentAdapter() {
|
||||
public void componentMoved(ComponentEvent e) {
|
||||
Point where =
|
||||
e.getComponent().isShowing()
|
||||
? e.getComponent().getLocationOnScreen()
|
||||
: e.getComponent().getLocation();
|
||||
setLocation(where.x - offset.x, where.y - offset.y);
|
||||
// TODO preserve stacking order (linux)
|
||||
}
|
||||
};
|
||||
|
||||
public BubbleWindow(Window owner, Component content) {
|
||||
super(owner);
|
||||
setFocusableWindowState(false);
|
||||
setName("###overrideRedirect###");
|
||||
getContentPane().setBackground(Color.white);
|
||||
getContentPane().add(content, BorderLayout.CENTER);
|
||||
getContentPane().add(Box.createVerticalStrut(Y_OFFSET), BorderLayout.SOUTH);
|
||||
owner.addComponentListener(moveTracker);
|
||||
setSize(getPreferredSize());
|
||||
mask = new Area(getMask(getWidth(), getHeight()));
|
||||
maskSize = getSize();
|
||||
WindowUtils.setWindowMask(BubbleWindow.this, mask);
|
||||
if (useDropShadow()) {
|
||||
new DropShadow(this, mask);
|
||||
}
|
||||
}
|
||||
|
||||
public void setBounds(int x, int y, int w, int h) {
|
||||
super.setBounds(x, y, w, h);
|
||||
Dimension size = new Dimension(w, h);
|
||||
if (mask != null && !size.equals(maskSize)) {
|
||||
mask.subtract(mask);
|
||||
mask.add(new Area(getMask(w, h)));
|
||||
maskSize = size;
|
||||
}
|
||||
}
|
||||
|
||||
public void setAnchorLocation(int x, int y) {
|
||||
super.setLocation(x, y);
|
||||
Window owner = getOwner();
|
||||
if (owner != null) {
|
||||
Point ref = owner.isShowing()
|
||||
? owner.getLocationOnScreen() : owner.getLocation();
|
||||
offset = new Point(ref.x - x, ref.y - y);
|
||||
}
|
||||
}
|
||||
|
||||
public void dispose() {
|
||||
super.dispose();
|
||||
getOwner().removeComponentListener(moveTracker);
|
||||
}
|
||||
|
||||
private Shape getMask(int w, int h) {
|
||||
Shape shape = new RoundRectangle2D.Float(0, 0, w, h-Y_OFFSET,
|
||||
ARC, ARC);
|
||||
Area area = new Area(shape);
|
||||
GeneralPath path = new GeneralPath();
|
||||
path.moveTo(w/3, h-1);
|
||||
path.lineTo(w/2, h-1-Y_OFFSET);
|
||||
path.lineTo(w*2/3, h-1-Y_OFFSET);
|
||||
path.closePath();
|
||||
area.add(new Area(path));
|
||||
return area;
|
||||
}
|
||||
|
||||
public Dimension getPreferredSize() {
|
||||
Dimension size = super.getPreferredSize();
|
||||
size.height += Y_OFFSET;
|
||||
return size;
|
||||
}
|
||||
}
|
||||
|
||||
/** Get a balloon pointing to the given location. The coordinates are
|
||||
* relative to <code>owner</code>, which if null, indicates the coordinates
|
||||
* are absolute.
|
||||
*/
|
||||
public static Popup getBalloon(final Component owner, final Component content, int x, int y) {
|
||||
|
||||
// Simulate PopupFactory, ensuring we get a heavyweight "popup"
|
||||
final Point origin =
|
||||
owner == null ? new Point(0, 0)
|
||||
: (owner.isShowing()
|
||||
? owner.getLocationOnScreen() : owner.getLocation());
|
||||
final Window parent = owner != null
|
||||
? SwingUtilities.getWindowAncestor(owner) : null;
|
||||
origin.translate(x, y);
|
||||
return new Popup() {
|
||||
private BubbleWindow w;
|
||||
public void show() {
|
||||
w = new BubbleWindow(parent, content);
|
||||
w.pack();
|
||||
Point where = new Point(origin);
|
||||
where.translate(-w.getWidth()/3, -w.getHeight());
|
||||
w.setAnchorLocation(where.x, where.y);
|
||||
w.setVisible(true);
|
||||
}
|
||||
public void hide() {
|
||||
w.setVisible(false);
|
||||
w.dispose();
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,136 @@
|
||||
/* Copyright (c) 2007 Timothy Wall, All Rights Reserved
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
package com.sun.jna.contrib.demo;
|
||||
|
||||
import java.awt.BasicStroke;
|
||||
import java.awt.Color;
|
||||
import java.awt.Component;
|
||||
import java.awt.Dimension;
|
||||
import java.awt.Font;
|
||||
import java.awt.Graphics;
|
||||
import java.awt.Graphics2D;
|
||||
import java.awt.RenderingHints;
|
||||
import java.awt.event.MouseAdapter;
|
||||
import java.awt.event.MouseEvent;
|
||||
import java.awt.event.MouseListener;
|
||||
import java.awt.geom.Rectangle2D;
|
||||
|
||||
import javax.swing.Icon;
|
||||
import javax.swing.JFrame;
|
||||
import javax.swing.JLabel;
|
||||
import javax.swing.JOptionPane;
|
||||
import javax.swing.JScrollPane;
|
||||
import javax.swing.JTextArea;
|
||||
import javax.swing.Popup;
|
||||
import javax.swing.SwingConstants;
|
||||
import javax.swing.UIManager;
|
||||
import javax.swing.border.EmptyBorder;
|
||||
|
||||
import com.sun.jna.platform.WindowUtils;
|
||||
|
||||
/** Demonstration of BalloonManager. */
|
||||
public class BalloonManagerDemo {
|
||||
private static final int ICON_SIZE = 48;
|
||||
private static class InfoIcon implements Icon {
|
||||
public int getIconHeight() {
|
||||
return ICON_SIZE;
|
||||
}
|
||||
public int getIconWidth() {
|
||||
return ICON_SIZE;
|
||||
}
|
||||
public void paintIcon(Component c, Graphics graphics, int x, int y) {
|
||||
Font font = UIManager.getFont("TextField.font");
|
||||
Graphics2D g = (Graphics2D)graphics.create(x, y, getIconWidth(), getIconHeight());
|
||||
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
|
||||
g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
|
||||
g.setFont(font.deriveFont(Font.BOLD, getIconWidth()*3/4));
|
||||
g.setColor(Color.green.darker());
|
||||
final int SW = Math.max(getIconWidth()/10, 4);
|
||||
g.setStroke(new BasicStroke(SW));
|
||||
g.drawArc(SW/2, SW/2, getIconWidth()-SW-1, getIconHeight()-SW-1, 0, 360);
|
||||
Rectangle2D bounds =
|
||||
font.getStringBounds("i", g.getFontRenderContext());
|
||||
g.drawString("i", Math.round((getIconWidth() - bounds.getWidth())/2 - getIconWidth()/12),
|
||||
SW/2 + Math.round((getIconHeight()-bounds.getHeight())/2 - bounds.getY() + getIconHeight()/8));
|
||||
g.dispose();
|
||||
}
|
||||
}
|
||||
public static void main(String[] args) {
|
||||
try {
|
||||
System.setProperty("sun.java2d.noddraw", "true");
|
||||
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
|
||||
}
|
||||
catch(Exception e) {
|
||||
}
|
||||
JFrame f = new JFrame("Balloon Test");
|
||||
final String BALLOON_TEXT = "<html><center>"
|
||||
+ "This is some sample balloon text<br>"
|
||||
+ "which has been formatted with html.<br>"
|
||||
+ "Click to dismiss.</center></html>";
|
||||
final JLabel content = new JLabel(BALLOON_TEXT);
|
||||
content.setIconTextGap(10);
|
||||
content.setBorder(new EmptyBorder(0, 8, 0, 8));
|
||||
content.setSize(content.getPreferredSize());
|
||||
content.setIcon(new InfoIcon());
|
||||
JLabel label = new JLabel("Click anywhere for more information");
|
||||
label.setHorizontalAlignment(SwingConstants.CENTER);
|
||||
label.addMouseListener(new MouseAdapter() {
|
||||
private MouseListener listener = new MouseAdapter() {
|
||||
public void mousePressed(MouseEvent e) {
|
||||
hidePopup(e);
|
||||
}
|
||||
};
|
||||
private Popup popup;
|
||||
private void hidePopup(MouseEvent e) {
|
||||
e.getComponent().removeMouseListener(listener);
|
||||
if (popup != null)
|
||||
popup.hide();
|
||||
}
|
||||
public void mousePressed(MouseEvent e) {
|
||||
hidePopup(e);
|
||||
popup = BalloonManager.getBalloon(e.getComponent(), content, e.getX(), e.getY());
|
||||
popup.show();
|
||||
content.getParent().addMouseListener(listener);
|
||||
}
|
||||
});
|
||||
f.getContentPane().add(label);
|
||||
f.pack();
|
||||
f.setSize(new Dimension(300, 300));
|
||||
f.setLocation(100, 100);
|
||||
try {
|
||||
// Force a load of JNA
|
||||
WindowUtils.setWindowMask(f, WindowUtils.MASK_NONE);
|
||||
f.setVisible(true);
|
||||
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
|
||||
}
|
||||
catch(UnsatisfiedLinkError e) {
|
||||
e.printStackTrace();
|
||||
String msg = e.getMessage()
|
||||
+ "\nError loading the JNA library";
|
||||
JTextArea area = new JTextArea(msg);
|
||||
area.setOpaque(false);
|
||||
area.setFont(UIManager.getFont("Label.font"));
|
||||
area.setEditable(false);
|
||||
area.setColumns(80);
|
||||
area.setRows(8);
|
||||
area.setWrapStyleWord(true);
|
||||
area.setLineWrap(true);
|
||||
JOptionPane.showMessageDialog(null, new JScrollPane(area),
|
||||
"Library Load Error: "
|
||||
+ System.getProperty("os.name")
|
||||
+ "/" + System.getProperty("os.arch"),
|
||||
JOptionPane.ERROR_MESSAGE);
|
||||
System.exit(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<classpath>
|
||||
<classpathentry kind="src" path=""/>
|
||||
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
|
||||
<classpathentry kind="src" path="/platform"/>
|
||||
<classpathentry kind="output" path="bin"/>
|
||||
</classpath>
|
||||
@@ -0,0 +1,17 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<projectDescription>
|
||||
<name>balloontips</name>
|
||||
<comment></comment>
|
||||
<projects>
|
||||
</projects>
|
||||
<buildSpec>
|
||||
<buildCommand>
|
||||
<name>org.eclipse.jdt.core.javabuilder</name>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
</buildSpec>
|
||||
<natures>
|
||||
<nature>org.eclipse.jdt.core.javanature</nature>
|
||||
</natures>
|
||||
</projectDescription>
|
||||
@@ -0,0 +1,7 @@
|
||||
An implementation of balloon tips.
|
||||
|
||||
Compile the two classes in this directory. Requires Java 1.5+.
|
||||
|
||||
javac -cp examples.jar *.java
|
||||
java -cp .:examples.jar FilteredTextField
|
||||
|
||||
@@ -0,0 +1,68 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project name="jnacontrib.balloontipsdemo" default="jar" basedir=".">
|
||||
<description>Builds, tests, and runs the project jnacontrib.balloontipsdemo.</description>
|
||||
<!-- Locations -->
|
||||
<property name="src" location="."/>
|
||||
<property name="build" location="build"/>
|
||||
<property name="jna-dist" location="../../dist"/>
|
||||
|
||||
<property name="classes" location="${build}/classes"/>
|
||||
<property name="jar" location="${build}/demo-balloontips.jar"/>
|
||||
<property name="file.reference.jna.jar" location="../../build/jna.jar"/>
|
||||
<property name="main-class" value="com.sun.jna.contrib.demo.FilteredTextField" />
|
||||
|
||||
<path id="classpath">
|
||||
<fileset file="${file.reference.jna.jar}"/>
|
||||
<fileset dir="../platform/dist" includes="jna-platform.jar"/>
|
||||
</path>
|
||||
|
||||
<!-- Run Demo. -->
|
||||
<target name="run" depends="compile">
|
||||
<java classname="${main-class}" fork="true">
|
||||
<classpath>
|
||||
<pathelement location="${classes}" />
|
||||
<path refid="classpath"/>
|
||||
</classpath>
|
||||
</java>
|
||||
</target>
|
||||
|
||||
<!-- Delete class and jar files. -->
|
||||
<target name="clean">
|
||||
<delete dir="${classes}"/>
|
||||
<delete file="${jar}"/>
|
||||
<delete dir="${build}"/>
|
||||
</target>
|
||||
|
||||
<!-- Compile all classes. -->
|
||||
<target name="compile">
|
||||
<mkdir dir="${classes}"/>
|
||||
<!-- Compile the project. -->
|
||||
<javac srcdir="${src}" destdir="${classes}" target="1.5" source="1.5"
|
||||
encoding="UTF-8" debug="on" includeantruntime="false">
|
||||
<classpath>
|
||||
<path refid="classpath"/>
|
||||
</classpath>
|
||||
</javac>
|
||||
</target>
|
||||
|
||||
<!-- Create jar-file. -->
|
||||
<target name="jar" depends="compile">
|
||||
|
||||
<!-- Copy all non-java files to classes. -->
|
||||
<copy todir="${classes}/com">
|
||||
<fileset dir="${src}/com">
|
||||
<exclude name="**/*.java"/>
|
||||
</fileset>
|
||||
</copy>
|
||||
|
||||
<jar jarfile="${jar}" basedir="${classes}">
|
||||
<manifest>
|
||||
<attribute name="Main-Class" value="${main-class}"/>
|
||||
</manifest>
|
||||
<!-- platform -->
|
||||
<fileset dir="../platform/build/classes/com"/>
|
||||
<!-- jna -->
|
||||
<zipfileset src="${file.reference.jna.jar}"/>
|
||||
</jar>
|
||||
</target>
|
||||
</project>
|
||||
@@ -0,0 +1,519 @@
|
||||
package com.sun.jna.contrib.demo;
|
||||
|
||||
import java.awt.Color;
|
||||
import java.awt.Component;
|
||||
import java.awt.Dimension;
|
||||
import java.awt.Font;
|
||||
import java.awt.Graphics;
|
||||
import java.awt.GraphicsConfiguration;
|
||||
import java.awt.Insets;
|
||||
import java.awt.Point;
|
||||
import java.awt.Polygon;
|
||||
import java.awt.Rectangle;
|
||||
import java.awt.Shape;
|
||||
import java.awt.Toolkit;
|
||||
import java.awt.Window;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ComponentAdapter;
|
||||
import java.awt.event.ComponentEvent;
|
||||
import java.awt.event.FocusAdapter;
|
||||
import java.awt.event.FocusEvent;
|
||||
import java.awt.event.MouseAdapter;
|
||||
import java.awt.event.MouseEvent;
|
||||
import java.awt.geom.Area;
|
||||
import java.awt.geom.RoundRectangle2D;
|
||||
|
||||
import javax.swing.AbstractAction;
|
||||
import javax.swing.JLabel;
|
||||
import javax.swing.JWindow;
|
||||
import javax.swing.Popup;
|
||||
import javax.swing.SwingUtilities;
|
||||
import javax.swing.Timer;
|
||||
|
||||
import com.sun.jna.platform.WindowUtils;
|
||||
|
||||
/**
|
||||
* The BalloonTipManager class handles creation and disposal of balloon style
|
||||
* tips that are typically used to display warning/error information based on
|
||||
* results from input validation. The balloon tip location and direction are
|
||||
* computed based on the owner component location on the screen. The balloon
|
||||
* tip is only displayed for a limited amount of time that is configurable.
|
||||
* The balloon tip is also disposed when the owner component loses focus or the
|
||||
* mouse is pressed.
|
||||
*/
|
||||
public class BalloonTipManager {
|
||||
public static final Color DEFAULT_BORDER_COLOR = Color.BLACK;
|
||||
public static final Color DEFAULT_BACKGROUND_COLOR = new Color(255, 255, 225);
|
||||
public static final Color DEFAULT_TEXT_COLOR = Color.BLACK;
|
||||
|
||||
private static final Integer VPOS_ABOVE = 0; // Positioned above component.
|
||||
private static final Integer VPOS_BELOW = 1; // Positioned below component.
|
||||
private static final Integer HPOS_LEFT = 0; // Arrow is on the left side.
|
||||
private static final Integer HPOS_RIGHT = 1; // Arros is on the right side.
|
||||
|
||||
private static Integer vpos = null;
|
||||
private static Integer hpos = null;
|
||||
|
||||
private static Timer hidePopupTimer = null;
|
||||
private static boolean isShowing = false;
|
||||
|
||||
|
||||
/*
|
||||
* The BalloonTip class defines the look of the BalloonTip object.
|
||||
*/
|
||||
private static final class BalloonTip extends JWindow {
|
||||
private static final long serialVersionUID = 1L;
|
||||
private static final Integer HMARGIN = 10;
|
||||
private static final Integer VMARGIN = 6;
|
||||
private static final Integer VSPACER = 4;
|
||||
private static final int ARC_D = 16;
|
||||
|
||||
private Area mask = null;
|
||||
private Dimension maskSize = null;
|
||||
private String[] textList = null;
|
||||
|
||||
private Color backgroundColor = null;
|
||||
private Color borderColor = null;
|
||||
private Color textColor = null;
|
||||
|
||||
/**
|
||||
* Create a BalloonTip object.
|
||||
* @param owner the parent window for the components
|
||||
* @param content the string for the balloon tip
|
||||
* @param position the position for the balloon; either above or below the
|
||||
* owner component
|
||||
* @param origin the origin point for the balloon tip
|
||||
* @param bordercolor the background color for the balloon tip
|
||||
* @param backgroundcolor the border color for the balloon tip
|
||||
* @param textcolor the text color for the balloon tip
|
||||
*/
|
||||
public BalloonTip (
|
||||
Window owner, String content, Point origin, Color bordercolor,
|
||||
Color backgroundcolor, Color textcolor)
|
||||
{
|
||||
super(owner);
|
||||
textList = content.split("\n");
|
||||
borderColor = bordercolor;
|
||||
backgroundColor = backgroundcolor;
|
||||
textColor = textcolor;
|
||||
setFocusableWindowState(false);
|
||||
setName("###overrideRedirect###");
|
||||
setSize(getPreferredSize());
|
||||
}
|
||||
|
||||
/*
|
||||
* Sets the mask for the Balloon Tip.
|
||||
*/
|
||||
private void setWindowMask () {
|
||||
mask = new Area(getMask());
|
||||
maskSize = getSize();
|
||||
WindowUtils.setWindowMask(BalloonTip.this, mask);
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
* @see java.awt.Container#paint(java.awt.Graphics)
|
||||
*/
|
||||
public void paint (Graphics g) {
|
||||
super.paint(g);
|
||||
Dimension d = getMinimumWindowSize();
|
||||
int width = d.width + 2 * HMARGIN;
|
||||
int height = d.height + 2 * VMARGIN;
|
||||
int x = 0;
|
||||
int y = 0;
|
||||
if (vpos == VPOS_BELOW) {
|
||||
y += 15;
|
||||
}
|
||||
// Draw the filled rounded rectangle and clean up the missed pixels.
|
||||
g.setColor(backgroundColor);
|
||||
g.fillRoundRect(x, y, width, height, ARC_D, ARC_D);
|
||||
g.drawLine(x + 6, y + height - 1, x + 6, y + height - 1);
|
||||
g.drawLine(x + width - 1, y + 6, x + width - 1, y + 6);
|
||||
g.drawLine(x + width - 1, y + height - 6, x + width - 1, y + height - 7);
|
||||
g.drawLine(x + width - 2, y + height - 4, x + width - 4, y + height - 2);
|
||||
g.drawLine(x + width - 6, y + height - 1, x + width - 7, y + height - 1);
|
||||
g.clearRect(x + 2, y + 2, 1, 1);
|
||||
// Draw the border of the rounded rectangle.
|
||||
g.setColor(borderColor);
|
||||
g.drawRoundRect(x, y, width, height, ARC_D, ARC_D);
|
||||
// Draw the external triangle for the balloon.
|
||||
if (vpos == VPOS_BELOW) {
|
||||
if (hpos == HPOS_LEFT) {
|
||||
g.setColor(backgroundColor);
|
||||
int[] xPts = {16, 16, 31};
|
||||
int[] yPts = {0, 16, 16};
|
||||
g.fillPolygon(xPts, yPts, 3);
|
||||
g.setColor(borderColor);
|
||||
g.drawLine(16, 0, 16, 15);
|
||||
g.drawLine(16, 0, 31, 15);
|
||||
g.drawLine(16, 1, 30, 15);
|
||||
}
|
||||
else {
|
||||
g.setColor(backgroundColor);
|
||||
int[] xPts = {width - 16, width - 16, width - 31};
|
||||
int[] yPts = {0, 16, 16};
|
||||
g.fillPolygon(xPts, yPts, 3);
|
||||
g.setColor(borderColor);
|
||||
g.drawLine(width - 16, 0, width - 16, 15);
|
||||
g.drawLine(width - 16, 0, width - 31, 15);
|
||||
g.drawLine(width - 16, 1, width - 30, 15);
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (hpos == HPOS_LEFT) {
|
||||
g.setColor(backgroundColor);
|
||||
int[] xPts = {16, 16, 31};
|
||||
int[] yPts = {height, height + 16, height};
|
||||
g.fillPolygon(xPts, yPts, 3);
|
||||
g.setColor(borderColor);
|
||||
g.drawLine(16, height, 16, height + 15);
|
||||
g.drawLine(16, height + 15, 31, height);
|
||||
g.drawLine(16, height + 14, 30, height);
|
||||
}
|
||||
else {
|
||||
g.setColor(backgroundColor);
|
||||
int[] xPts = {width - 16, width - 16, width - 31};
|
||||
int[] yPts = {height, height + 16, height};
|
||||
g.fillPolygon(xPts, yPts, 3);
|
||||
g.setColor(borderColor);
|
||||
g.drawLine(width - 16, height, width - 16, height + 15);
|
||||
g.drawLine(width - 16, height + 15, width - 31, height);
|
||||
g.drawLine(width - 16, height + 14, width - 30, height);
|
||||
}
|
||||
}
|
||||
// Draw the inner component for the balloon.
|
||||
g.setColor(textColor);
|
||||
g.setFont(new Font("Tahoma", Font.PLAIN, 11));
|
||||
int stringY = y + VMARGIN / 2;
|
||||
for (int i = 0; i < textList.length; i++) {
|
||||
stringY += new JLabel(textList[i]).getPreferredSize().height;
|
||||
if (i > 0) {
|
||||
stringY += VSPACER;
|
||||
}
|
||||
g.drawString(textList[i], HMARGIN, stringY);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Returns the mask for the balloon tip window.
|
||||
*/
|
||||
private Shape getMask () {
|
||||
Dimension d = getMinimumWindowSize();
|
||||
int width = d.width + 2 * HMARGIN;
|
||||
int height = d.height + 2 * VMARGIN;
|
||||
int x = 0;
|
||||
int y = 0;
|
||||
if (vpos == VPOS_BELOW) {
|
||||
y += 15;
|
||||
}
|
||||
// Start by creating the area of the main rounded rectangle.
|
||||
Area area = new Area(
|
||||
new RoundRectangle2D.Float(x, y, width + 1, height + 1, ARC_D, ARC_D));
|
||||
// Add in the remaining pixels that are not included by default due to
|
||||
// the differences between Graphics drawing and Shape creation.
|
||||
area.add(new Area(new Rectangle(0, y + 6, 1, 2)));
|
||||
area.add(new Area(new Rectangle(0, y + height - 7, 1, 2)));
|
||||
area.add(new Area(new Rectangle(1, y + 4, 1, 1)));
|
||||
area.add(new Area(new Rectangle(1, y + height - 5, 1, 2)));
|
||||
area.add(new Area(new Rectangle(4, y + 1, 1, 1)));
|
||||
area.add(new Area(new Rectangle(6, y, 2, 1)));
|
||||
area.add(new Area(new Rectangle(width - 7, y, 2, 1)));
|
||||
// Subtract the extra pixels that are not included by default due to the
|
||||
// differences between Graphics drawing and Shape creation.
|
||||
area.subtract(new Area(new Rectangle(2, y + height - 2, 1, 1)));
|
||||
area.subtract(new Area(new Rectangle(3, y + height - 1, 1, 1)));
|
||||
area.subtract(new Area(new Rectangle(5, y + height, 1, 1)));
|
||||
area.subtract(new Area(new Rectangle(width - 5, y + height, 2, 1)));
|
||||
area.subtract(new Area(new Rectangle(width - 3, y + height - 1, 2, 1)));
|
||||
area.subtract(new Area(new Rectangle(width - 2, y + 2, 1, 1)));
|
||||
area.subtract(new Area(new Rectangle(width - 2, y + height - 2, 2, 1)));
|
||||
area.subtract(new Area(new Rectangle(width - 1, y + 3, 1, 1)));
|
||||
area.subtract(new Area(new Rectangle(width - 1, y + height - 3, 1, 1)));
|
||||
area.subtract(new Area(new Rectangle(width, y + 5, 1, 1)));
|
||||
area.subtract(new Area(new Rectangle(width, y + height - 5, 1, 2)));
|
||||
// Add in the triangle piece for the balloon.
|
||||
if (vpos == VPOS_BELOW) {
|
||||
if (hpos == HPOS_LEFT) {
|
||||
int[] xPts = {16, 16, 32};
|
||||
int[] yPts = {-1, 16, 16};
|
||||
area.add(new Area(new Polygon(xPts, yPts, 3)));
|
||||
}
|
||||
else {
|
||||
int[] xPts = {width - 15, width - 15, width - 32};
|
||||
int[] yPts = {-1, 16, 16};
|
||||
area.add(new Area(new Polygon(xPts, yPts, 3)));
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (hpos == HPOS_LEFT) {
|
||||
int[] xPts = {16, 16, 31};
|
||||
int[] yPts = {height, height + 16, height};
|
||||
area.add(new Area(new Polygon(xPts, yPts, 3)));
|
||||
}
|
||||
else {
|
||||
int[] xPts = {width - 15, width - 15, width - 32};
|
||||
int[] yPts = {height, height + 16, height};
|
||||
area.add(new Area(new Polygon(xPts, yPts, 3)));
|
||||
}
|
||||
}
|
||||
return area;
|
||||
}
|
||||
|
||||
/*
|
||||
* Returns the dimension of the window based on the preferred component
|
||||
* sizes.
|
||||
*/
|
||||
private Dimension getMinimumWindowSize () {
|
||||
int maxWidth = 0;
|
||||
int textHeight = 0;
|
||||
JLabel tempLabel = null;
|
||||
for (int i = 0; i < textList.length; i++) {
|
||||
tempLabel = new JLabel(textList[i]);
|
||||
maxWidth = Math.max(maxWidth, tempLabel.getPreferredSize().width);
|
||||
textHeight += tempLabel.getPreferredSize().height;
|
||||
}
|
||||
int w = Math.max(maxWidth, 32);
|
||||
int h = Math.max(textHeight + (textList.length - 1) * VSPACER, 8);
|
||||
return new Dimension(w, h);
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
* @see java.awt.Window#setBounds(int, int, int, int)
|
||||
*/
|
||||
public void setBounds (int x, int y, int w, int h) {
|
||||
super.setBounds(x, y, w, h);
|
||||
Dimension size = new Dimension(w, h);
|
||||
if (mask != null && !size.equals(maskSize)) {
|
||||
mask.subtract(mask);
|
||||
mask.add(new Area(getMask()));
|
||||
maskSize = size;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
* @see java.awt.Container#getPreferredSize()
|
||||
*/
|
||||
public Dimension getPreferredSize () {
|
||||
Dimension d = getMinimumWindowSize();
|
||||
int w = d.width + 2 * HMARGIN + 1;
|
||||
int h = d.height + 2 * VMARGIN + 16;
|
||||
return new Dimension(w, h);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the popup window of the balloon tip.
|
||||
* @param owner the owner component for the balloon tip
|
||||
* @param content the text string to display in the balloon tip
|
||||
* @param x the x coordinate for the origin for the balloon tip in relation
|
||||
* to the owner component
|
||||
* @param y the y coordinate for the origin for the balloon tip in relation
|
||||
* to the owner component
|
||||
* @param position the position for the balloon; either above or below the
|
||||
* owner component
|
||||
* @param duration the duration in milliseconds to display balloon tip
|
||||
* @return the popup window of the balloon tip
|
||||
*/
|
||||
public static Popup getBalloonTip (final Component owner,
|
||||
final String content, int x, int y, final int duration)
|
||||
{
|
||||
return getBalloonTip(owner, content, x, y, duration, DEFAULT_BORDER_COLOR,
|
||||
DEFAULT_BACKGROUND_COLOR, DEFAULT_TEXT_COLOR);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns whether the popup is showing or not.
|
||||
* @return true if the popup is showing, else false
|
||||
*/
|
||||
public static boolean isShowing () {
|
||||
return isShowing;
|
||||
}
|
||||
|
||||
/**
|
||||
* Restarts the popup timer.
|
||||
*/
|
||||
public static void restartTimer () {
|
||||
hidePopupTimer.restart();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the popup window of the balloon tip.
|
||||
* @param owner the owner component for the balloon tip
|
||||
* @param content the text string to display in the balloon tip
|
||||
* @param x the x coordinate for the origin for the balloon tip in relation
|
||||
* to the owner component
|
||||
* @param y the y coordinate for the origin for the balloon tip in relation
|
||||
* to the owner component
|
||||
* @param position the position for the balloon; either above or below the
|
||||
* owner component
|
||||
* @param duration the duration in milliseconds to display balloon tip
|
||||
* @param bordercolor the background color for the balloon tip
|
||||
* @param backgroundcolor the border color for the balloon tip
|
||||
* @param textcolor the text color for the balloon tip
|
||||
* @return the popup window of the balloon tip
|
||||
*/
|
||||
public static Popup getBalloonTip (final Component owner,
|
||||
final String content, int x, int y, final Integer duration,
|
||||
final Color bordercolor, final Color backgroundcolor,
|
||||
final Color textcolor)
|
||||
{
|
||||
final Point origin =
|
||||
owner == null ? new Point(0, 0) : owner.getLocationOnScreen();
|
||||
final Window parent =
|
||||
owner != null ? SwingUtilities.getWindowAncestor(owner) : null;
|
||||
final String text =
|
||||
content != null ? content : "";
|
||||
final Integer timerDuration =
|
||||
duration != null ? duration : 10000;
|
||||
origin.translate(x, y);
|
||||
vpos = VPOS_BELOW;
|
||||
hpos = HPOS_LEFT;
|
||||
return new Popup () {
|
||||
private BalloonTip bt = null;
|
||||
final ComponentEar componentEar = new ComponentEar();
|
||||
final MouseEar mouseEar = new MouseEar();
|
||||
final FocusEar focusEar = new FocusEar();
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
* @see javax.swing.Popup#show()
|
||||
*/
|
||||
public void show () {
|
||||
hidePopupTimer = new Timer(timerDuration, new TimerAction());
|
||||
bt = new BalloonTip(parent, text, origin, bordercolor,
|
||||
backgroundcolor, textcolor);
|
||||
bt.pack();
|
||||
Point pt = new Point(origin);
|
||||
pt.translate(10, owner.getHeight());
|
||||
bt.setLocation(getAdjustedOrigin(pt));
|
||||
bt.setWindowMask();
|
||||
bt.setVisible(true);
|
||||
owner.addFocusListener(focusEar);
|
||||
owner.addMouseListener(mouseEar);
|
||||
parent.addMouseListener(mouseEar);
|
||||
parent.addComponentListener(componentEar);
|
||||
hidePopupTimer.start();
|
||||
isShowing = true;
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
* @see javax.swing.Popup#hide()
|
||||
*/
|
||||
public void hide () {
|
||||
if (bt != null) {
|
||||
isShowing = false;
|
||||
hidePopupTimer.stop();
|
||||
parent.removeComponentListener(componentEar);
|
||||
parent.removeMouseListener(mouseEar);
|
||||
owner.removeMouseListener(mouseEar);
|
||||
owner.removeFocusListener(focusEar);
|
||||
bt.setVisible(false);
|
||||
bt.dispose();
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Adjust the location of the balloon popup so that is drawn completely
|
||||
* on the screen and specify the orientation.
|
||||
*/
|
||||
private Point getAdjustedOrigin (Point pt) {
|
||||
Point ret = new Point(pt.x, pt.y);
|
||||
GraphicsConfiguration gc = owner.getGraphicsConfiguration();
|
||||
Rectangle sBounds = gc.getBounds();
|
||||
Insets sInsets = Toolkit.getDefaultToolkit().getScreenInsets(gc);
|
||||
sBounds.x += sInsets.left;
|
||||
sBounds.y += sInsets.top;
|
||||
sBounds.width -= (sInsets.left + sInsets.right);
|
||||
sBounds.height -= (sInsets.top + sInsets.bottom);
|
||||
|
||||
if (ret.x < sBounds.x) {
|
||||
ret.x = sBounds.x;
|
||||
}
|
||||
else if (ret.x - sBounds.x + bt.getWidth() > sBounds.width) {
|
||||
ret.x = owner.getLocationOnScreen().x - bt.getWidth() + 43;
|
||||
}
|
||||
if (ret.x >= pt.x) {
|
||||
hpos = HPOS_LEFT;
|
||||
}
|
||||
else {
|
||||
hpos = HPOS_RIGHT;
|
||||
}
|
||||
|
||||
if (ret.y < sBounds.y) {
|
||||
ret.y = sBounds.y;
|
||||
}
|
||||
else if (ret.y - sBounds.y + bt.getHeight() > sBounds.height) {
|
||||
ret.y = owner.getLocationOnScreen().y - bt.getHeight();
|
||||
}
|
||||
if (ret.y >= pt.y) {
|
||||
vpos = VPOS_BELOW;
|
||||
}
|
||||
else {
|
||||
vpos = VPOS_ABOVE;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* This class handles actions from the balloon tip timer.
|
||||
*/
|
||||
@SuppressWarnings("serial")
|
||||
final class TimerAction extends AbstractAction {
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
* @see java.awt.event.ActionListener#actionPerformed(
|
||||
* java.awt.event.ActionEvent)
|
||||
*/
|
||||
public void actionPerformed (ActionEvent e) {
|
||||
hide();
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* This class handles events spawned from moving the component.
|
||||
*/
|
||||
final class ComponentEar extends ComponentAdapter {
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
* @see java.awt.event.ComponentAdapter#componentMoved(
|
||||
* java.awt.event.ComponentEvent)
|
||||
*/
|
||||
public void componentMoved (ComponentEvent e) {
|
||||
hide();
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* This class handles events spawned when a mouse button is pressed.
|
||||
*/
|
||||
final class MouseEar extends MouseAdapter {
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
* @see java.awt.event.MouseAdapter#mousePressed(
|
||||
* java.awt.event.MouseEvent)
|
||||
*/
|
||||
public void mousePressed (MouseEvent e) {
|
||||
hide();
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* This class handles events spawned when the component loses focus.
|
||||
*/
|
||||
final class FocusEar extends FocusAdapter {
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
* @see java.awt.event.FocusAdapter#focusLost(
|
||||
* java.awt.event.FocusEvent)
|
||||
*/
|
||||
public void focusLost (FocusEvent e) {
|
||||
hide();
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,424 @@
|
||||
package com.sun.jna.contrib.demo;
|
||||
|
||||
import java.awt.BorderLayout;
|
||||
import java.awt.Color;
|
||||
import java.awt.event.FocusAdapter;
|
||||
import java.awt.event.FocusEvent;
|
||||
import java.util.ArrayList;
|
||||
|
||||
import javax.swing.BorderFactory;
|
||||
import javax.swing.JFrame;
|
||||
import javax.swing.JLabel;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.JTextField;
|
||||
import javax.swing.Popup;
|
||||
import javax.swing.UIManager;
|
||||
import javax.swing.border.Border;
|
||||
import javax.swing.event.DocumentEvent;
|
||||
import javax.swing.event.DocumentListener;
|
||||
import javax.swing.text.AttributeSet;
|
||||
import javax.swing.text.BadLocationException;
|
||||
import javax.swing.text.Document;
|
||||
import javax.swing.text.PlainDocument;
|
||||
//TODO: FilteredTextField - Comment this class.
|
||||
/**
|
||||
* The FilteredTextField class is a JTextField that only allows specified
|
||||
* characters to be entered into it. The allowed characters can be added to
|
||||
* the text field, and entry validation is performed as each character is
|
||||
* typed. In addition, complete string validation is tested against a
|
||||
* configurable regular expression when leaving the field. If the string is
|
||||
* invalid the text field is bordered with a red line, and the user is notified
|
||||
* of the error upon returning to the text field. The text field can also be
|
||||
* configured to accept a limited number of characters.
|
||||
*/
|
||||
@SuppressWarnings("serial")
|
||||
public class FilteredTextField extends JTextField {
|
||||
public static final Character[] UPPERCASE_CHARS = {'A', 'B', 'C', 'D', 'E',
|
||||
'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
|
||||
'U', 'V', 'W', 'X', 'Y', 'Z'};
|
||||
public static final Character[] LOWERCASE_CHARS = {'a', 'b', 'c', 'd', 'e',
|
||||
'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
|
||||
'u', 'v', 'w', 'x', 'y', 'z'};
|
||||
public static final Character[] NUMERIC_CHARS = {'1', '2', '3', '4', '5',
|
||||
'6', '7', '8', '9', '0'};
|
||||
|
||||
private static final Integer ENTRY_BALLOON = 0;
|
||||
private static final Integer VALID_BALLOON = 1;
|
||||
private static final Integer LENGTH_BALLOON = 2;
|
||||
private static final Border RED_BORDER =
|
||||
BorderFactory.createLineBorder(Color.RED, 2);
|
||||
|
||||
private ArrayList<Character> allowable = new ArrayList<Character>();
|
||||
private int maximumLength = String.valueOf(Long.MAX_VALUE).length();
|
||||
|
||||
private Border defaultBorder = null;
|
||||
private boolean isValid = true;
|
||||
|
||||
private Popup balloon = null;
|
||||
private String entryError = null;
|
||||
private String validRegex = null;
|
||||
private String validError = null;
|
||||
private Color balloonBorderColor = null;
|
||||
private Color balloonBackgroundColor = null;
|
||||
private Color balloonTextColor = null;
|
||||
private Integer balloonDuration = null;
|
||||
|
||||
private Integer balloonType = null;
|
||||
|
||||
/**
|
||||
* Create a FilteredTextField.
|
||||
*/
|
||||
public FilteredTextField () {
|
||||
super();
|
||||
init();
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a FilteredTextField.
|
||||
* @param columns the number of columns to use to calculate the preferred
|
||||
* width
|
||||
*/
|
||||
public FilteredTextField (int columns) {
|
||||
super(columns);
|
||||
init();
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize the FilteredTextField.
|
||||
*/
|
||||
private void init () {
|
||||
defaultBorder = getBorder();
|
||||
entryError = "";
|
||||
validRegex = "";
|
||||
validError = "";
|
||||
balloonBorderColor = BalloonTipManager.DEFAULT_BORDER_COLOR;
|
||||
balloonBackgroundColor = BalloonTipManager.DEFAULT_BACKGROUND_COLOR;
|
||||
balloonTextColor = BalloonTipManager.DEFAULT_TEXT_COLOR;
|
||||
balloonDuration = 10000;
|
||||
balloonType = ENTRY_BALLOON;
|
||||
addFocusListener(new ValidationEar());
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the allowable character used for entry validation.
|
||||
* @param characters the allowable characters
|
||||
*/
|
||||
public void setCharacters (Character[] characters) {
|
||||
clearCharacters();
|
||||
for (int i = 0; i < characters.length; i++) {
|
||||
addCharacter(characters[i]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the character array to the list used for entry validation.
|
||||
* @param characters the character array
|
||||
*/
|
||||
public void addCharacters (Character[] characters) {
|
||||
for (int i = 0; i < characters.length; i++) {
|
||||
addCharacter(characters[i]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the character to the list used for entry validation.
|
||||
* @param characters the character
|
||||
*/
|
||||
public void addCharacter (Character character) {
|
||||
if (!allowable.contains(character)) {
|
||||
allowable.add(character);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Clears the list of allowable characters for entry validation.
|
||||
*/
|
||||
public void clearCharacters () {
|
||||
allowable.clear();
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes the character array from the list used for entry validation.
|
||||
* @param characters the character array
|
||||
*/
|
||||
public void removeCharacters (Character[] characters) {
|
||||
for (int i = 0; i < characters.length; i++) {
|
||||
removeCharacter(characters[i]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes the character from the list used for entry validation.
|
||||
* @param character the character
|
||||
*/
|
||||
public void removeCharacter (Character character) {
|
||||
if (allowable.contains(character)) {
|
||||
allowable.remove(character);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the maximum number of characters for the length of the entry string.
|
||||
* @param maximumLength the number of characters
|
||||
*/
|
||||
public void setMaximumLength (int maximumLength) {
|
||||
this.maximumLength = maximumLength;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the message that is displayed when there is an entry error.
|
||||
* @param entryError the entry error message
|
||||
*/
|
||||
public void setEntryError (String entryError) {
|
||||
this.entryError = entryError;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the regular expression that is used for string validation. String
|
||||
* validation is checked when exiting the text field.
|
||||
* @param validRegex the validation regular expression
|
||||
*/
|
||||
public void setValidRegex (String validRegex) {
|
||||
this.validRegex = validRegex;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the message that is displayed when there is a validation error.
|
||||
* @param validError the validation error message
|
||||
*/
|
||||
public void setValidError (String validError) {
|
||||
this.validError = validError;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the color to use for the balloon border.
|
||||
* @param borderColor the balloon border color
|
||||
*/
|
||||
public void setBalloonBorderColor (Color borderColor) {
|
||||
balloonBorderColor = borderColor;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the color to use for the balloon background.
|
||||
* @param backgroundColor the balloon background color
|
||||
*/
|
||||
public void setBalloonBackgroundColor (Color backgroundColor) {
|
||||
balloonBackgroundColor = backgroundColor;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the color to use for the balloon text.
|
||||
* @param textColor the balloon text color
|
||||
*/
|
||||
public void setBalloonTextColor (Color textColor) {
|
||||
balloonTextColor = textColor;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the time in milliseconds that the balloon is visible before
|
||||
* disappearing. This is the maximum time that the balloon will be visible,
|
||||
* as other events can also make the balloon disappear.
|
||||
* @param duration the time in milliseconds
|
||||
*/
|
||||
public void setBalloonDuration (Integer duration) {
|
||||
balloonDuration = duration;
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
* @see javax.swing.JTextField#createDefaultModel()
|
||||
*/
|
||||
protected Document createDefaultModel () {
|
||||
return new FilteredTextFieldDocument();
|
||||
}
|
||||
|
||||
/*
|
||||
* This class defines the document used for the FilteredTextField.
|
||||
*/
|
||||
private class FilteredTextFieldDocument extends PlainDocument {
|
||||
/*
|
||||
* Create a FilteredTextFieldDocument.
|
||||
*/
|
||||
public FilteredTextFieldDocument () {
|
||||
addDocumentListener(new FilteredTextFieldEar());
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
* @see javax.swing.text.PlainDocument#insertString(
|
||||
* int, java.lang.String, javax.swing.text.AttributeSet)
|
||||
*/
|
||||
public void insertString (int offset, String str, AttributeSet a)
|
||||
throws BadLocationException
|
||||
{
|
||||
if (balloon != null && BalloonTipManager.isShowing()) {
|
||||
if (balloonType == VALID_BALLOON) {
|
||||
balloon.hide();
|
||||
}
|
||||
}
|
||||
StringBuilder buffer =
|
||||
new StringBuilder(FilteredTextField.this.getText());
|
||||
if (offset >= 0 && offset <= buffer.length()) {
|
||||
buffer.insert(offset, str);
|
||||
String strBuf = buffer.toString();
|
||||
|
||||
if (buffer.length() > maximumLength) {
|
||||
if (balloon != null && BalloonTipManager.isShowing()) {
|
||||
if (balloonType == LENGTH_BALLOON) {
|
||||
BalloonTipManager.restartTimer();
|
||||
return;
|
||||
}
|
||||
else {
|
||||
balloon.hide();
|
||||
}
|
||||
}
|
||||
balloon = BalloonTipManager.getBalloonTip(FilteredTextField.this,
|
||||
"The number of characters must be less than or equal to " +
|
||||
maximumLength, 0, 0, balloonDuration, balloonBorderColor,
|
||||
balloonBackgroundColor, balloonTextColor);
|
||||
balloon.show();
|
||||
balloonType = LENGTH_BALLOON;
|
||||
return;
|
||||
}
|
||||
|
||||
if (strBuf == null || strBuf.equals("")) {
|
||||
remove(0, getLength());
|
||||
super.insertString(0, "", null);
|
||||
if (balloon != null && BalloonTipManager.isShowing()) {
|
||||
balloon.hide();
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (allowable.contains(str.charAt(0))) {
|
||||
super.insertString(offset, str, a);
|
||||
if (balloon != null && BalloonTipManager.isShowing()) {
|
||||
balloon.hide();
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (balloon != null && BalloonTipManager.isShowing()) {
|
||||
if (balloonType == ENTRY_BALLOON) {
|
||||
BalloonTipManager.restartTimer();
|
||||
return;
|
||||
}
|
||||
else {
|
||||
balloon.hide();
|
||||
}
|
||||
}
|
||||
balloon = BalloonTipManager.getBalloonTip(FilteredTextField.this,
|
||||
entryError, 0, 0, balloonDuration, balloonBorderColor,
|
||||
balloonBackgroundColor, balloonTextColor);
|
||||
balloon.show();
|
||||
balloonType = ENTRY_BALLOON;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* This listener class is needed to catch character removal events.
|
||||
*/
|
||||
private class FilteredTextFieldEar implements DocumentListener {
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
* @see javax.swing.event.DocumentListener#insertUpdate(
|
||||
* javax.swing.event.DocumentEvent)
|
||||
*/
|
||||
public void insertUpdate (DocumentEvent e) {/* N/A */}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
* @see javax.swing.event.DocumentListener#removeUpdate(
|
||||
* javax.swing.event.DocumentEvent)
|
||||
*/
|
||||
public void removeUpdate (DocumentEvent e) {
|
||||
if (balloon != null && BalloonTipManager.isShowing())
|
||||
{
|
||||
balloon.hide();
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
* @see javax.swing.event.DocumentListener#changedUpdate(
|
||||
* javax.swing.event.DocumentEvent)
|
||||
*/
|
||||
public void changedUpdate (DocumentEvent e) {/* N/A */}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* This listener class is used to determine whether the string is valid based
|
||||
* on a regular expression. The validation is tested when leaving the text
|
||||
* field, and notification is performed when returning to the text field.
|
||||
*/
|
||||
private class ValidationEar extends FocusAdapter {
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
* @see java.awt.event.FocusAdapter#focusLost(java.awt.event.FocusEvent)
|
||||
*/
|
||||
public void focusLost (FocusEvent e) {
|
||||
String entered = getText().trim();
|
||||
if (!entered.matches(validRegex)) {
|
||||
if (balloon != null) {
|
||||
balloon.hide();
|
||||
}
|
||||
setBorder(
|
||||
BorderFactory.createCompoundBorder(RED_BORDER, defaultBorder));
|
||||
isValid = false;
|
||||
}
|
||||
else {
|
||||
setBorder(defaultBorder);
|
||||
isValid = true;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
* @see java.awt.event.FocusAdapter#focusGained(java.awt.event.FocusEvent)
|
||||
*/
|
||||
public void focusGained (FocusEvent e) {
|
||||
if (!isValid) {
|
||||
balloon = BalloonTipManager.getBalloonTip(FilteredTextField.this,
|
||||
validError, 0, 0, balloonDuration, balloonBorderColor,
|
||||
balloonBackgroundColor, balloonTextColor);
|
||||
balloon.show();
|
||||
balloonType = VALID_BALLOON;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* A main entry point to test the FilteredTextField.
|
||||
* @param args application arguments
|
||||
*/
|
||||
public static void main (String[] args) {
|
||||
try {
|
||||
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
|
||||
}
|
||||
catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
JFrame jframe = new JFrame("Balloon Tips on FilteredTextField");
|
||||
jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
|
||||
jframe.setSize(400, 75);
|
||||
jframe.setLocation(400, 400);
|
||||
JPanel jpanel = new JPanel();
|
||||
jpanel.setLayout(new BorderLayout());
|
||||
FilteredTextField ftfield = new FilteredTextField(10);
|
||||
ftfield.setCharacters(LOWERCASE_CHARS);
|
||||
ftfield.addCharacter('-');
|
||||
ftfield.addCharacter('_');
|
||||
ftfield.addCharacter(' ');
|
||||
ftfield.setMaximumLength(10);
|
||||
ftfield.setEntryError(
|
||||
"Only lower case letters, hyphens, underscores, and spaces allowed.");
|
||||
ftfield.setValidRegex("^a+[a-z-_ ]*");
|
||||
ftfield.setValidError("The string must begin with the letter 'a'.");
|
||||
jpanel.add(new JLabel("Type some text into either field"), BorderLayout.NORTH);
|
||||
jpanel.add(ftfield, BorderLayout.CENTER);
|
||||
jpanel.add(new FilteredTextField(10), BorderLayout.SOUTH);
|
||||
jframe.getContentPane().add(jpanel);
|
||||
jframe.setVisible(true);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<classpath>
|
||||
<classpathentry kind="src" path=""/>
|
||||
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
|
||||
<classpathentry kind="lib" path="/jnalib/dist/jna.jar"/>
|
||||
<classpathentry kind="src" path="/platform"/>
|
||||
<classpathentry kind="output" path="bin"/>
|
||||
</classpath>
|
||||
@@ -0,0 +1,17 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<projectDescription>
|
||||
<name>dnddemo</name>
|
||||
<comment></comment>
|
||||
<projects>
|
||||
</projects>
|
||||
<buildSpec>
|
||||
<buildCommand>
|
||||
<name>org.eclipse.jdt.core.javabuilder</name>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
</buildSpec>
|
||||
<natures>
|
||||
<nature>org.eclipse.jdt.core.javanature</nature>
|
||||
</natures>
|
||||
</projectDescription>
|
||||
@@ -0,0 +1,68 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project name="jnacontrib.dnddemo" default="jar" basedir=".">
|
||||
<description>Builds, tests, and runs the project jnacontrib.dnddemo.</description>
|
||||
<!-- Locations -->
|
||||
<property name="src" location="."/>
|
||||
<property name="build" location="build"/>
|
||||
<property name="jna-dist" location="../../dist"/>
|
||||
|
||||
<property name="classes" location="${build}/classes"/>
|
||||
<property name="jar" location="${build}/demo-dnd.jar"/>
|
||||
<property name="file.reference.jna.jar" location="../../build/jna.jar"/>
|
||||
<property name="main-class" value="com.sun.jna.contrib.demo.GhostedDragImageDemo" />
|
||||
|
||||
<path id="classpath">
|
||||
<fileset file="${file.reference.jna.jar}"/>
|
||||
<fileset dir="../platform/dist" includes="jna-platform.jar"/>
|
||||
</path>
|
||||
|
||||
<!-- Run Demo. -->
|
||||
<target name="run" depends="compile">
|
||||
<java classname="${main-class}" fork="true">
|
||||
<classpath>
|
||||
<pathelement location="${classes}" />
|
||||
<path refid="classpath"/>
|
||||
</classpath>
|
||||
</java>
|
||||
</target>
|
||||
|
||||
<!-- Delete class and jar files. -->
|
||||
<target name="clean">
|
||||
<delete dir="${classes}"/>
|
||||
<delete file="${jar}"/>
|
||||
<delete dir="${build}"/>
|
||||
</target>
|
||||
|
||||
<!-- Compile all classes. -->
|
||||
<target name="compile">
|
||||
<mkdir dir="${classes}"/>
|
||||
<!-- Compile the project. -->
|
||||
<javac srcdir="${src}" destdir="${classes}" target="1.5" source="1.5"
|
||||
encoding="UTF-8" debug="on" includeantruntime="false">
|
||||
<classpath>
|
||||
<path refid="classpath"/>
|
||||
</classpath>
|
||||
</javac>
|
||||
</target>
|
||||
|
||||
<!-- Create jar-file. -->
|
||||
<target name="jar" depends="compile">
|
||||
|
||||
<!-- Copy all non-java files to classes. -->
|
||||
<copy todir="${classes}/com">
|
||||
<fileset dir="${src}/com">
|
||||
<exclude name="**/*.java"/>
|
||||
</fileset>
|
||||
</copy>
|
||||
|
||||
<jar jarfile="${jar}" basedir="${classes}">
|
||||
<manifest>
|
||||
<attribute name="Main-Class" value="${main-class}"/>
|
||||
</manifest>
|
||||
<!-- platform -->
|
||||
<fileset dir="../platform/build/classes/com"/>
|
||||
<!-- jna -->
|
||||
<zipfileset src="${file.reference.jna.jar}"/>
|
||||
</jar>
|
||||
</target>
|
||||
</project>
|
||||
@@ -0,0 +1,140 @@
|
||||
/* Copyright (c) 2007 Timothy Wall, All Rights Reserved
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
package com.sun.jna.contrib.demo;
|
||||
|
||||
import java.awt.Image;
|
||||
import java.awt.Point;
|
||||
import java.awt.datatransfer.Clipboard;
|
||||
import java.awt.datatransfer.ClipboardOwner;
|
||||
import java.awt.datatransfer.DataFlavor;
|
||||
import java.awt.datatransfer.Transferable;
|
||||
import java.awt.datatransfer.UnsupportedFlavorException;
|
||||
import java.awt.dnd.DnDConstants;
|
||||
import java.awt.dnd.DragGestureEvent;
|
||||
import java.awt.dnd.DragSourceDropEvent;
|
||||
import java.awt.dnd.DropTargetDropEvent;
|
||||
import java.io.IOException;
|
||||
import java.net.URL;
|
||||
|
||||
import javax.swing.Icon;
|
||||
import javax.swing.ImageIcon;
|
||||
import javax.swing.JFrame;
|
||||
import javax.swing.JLabel;
|
||||
import javax.swing.UIManager;
|
||||
|
||||
import com.sun.jna.platform.dnd.DragHandler;
|
||||
import com.sun.jna.platform.dnd.DropHandler;
|
||||
|
||||
|
||||
/** Demonstrate ghosted drag images. Unfortunately, Swing drag support hides
|
||||
* the hooks we need to move the drag image around, so we don't use it and
|
||||
* roll our own.
|
||||
*/
|
||||
public class GhostedDragImageDemo {
|
||||
|
||||
public static class ImageSelection implements Transferable, ClipboardOwner {
|
||||
public static final DataFlavor IMAGE_FLAVOR = DataFlavor.imageFlavor;
|
||||
private static final DataFlavor[] FLAVORS = { IMAGE_FLAVOR };
|
||||
|
||||
private Image image;
|
||||
public ImageSelection(Image image) {
|
||||
this.image = image;
|
||||
}
|
||||
public void lostOwnership(Clipboard clipboard, Transferable transferable) {
|
||||
// don't care
|
||||
}
|
||||
public Object getTransferData(DataFlavor flavor) {
|
||||
return isDataFlavorSupported(flavor) ? image : null;
|
||||
}
|
||||
public DataFlavor[] getTransferDataFlavors() { return FLAVORS; }
|
||||
public boolean isDataFlavorSupported(DataFlavor flavor) {
|
||||
return flavor.equals(IMAGE_FLAVOR);
|
||||
}
|
||||
}
|
||||
|
||||
public static class DragLabel extends JLabel {
|
||||
private static final long serialVersionUID = 1L;
|
||||
private boolean dragging;
|
||||
public DragLabel(Icon icon) {
|
||||
super(icon);
|
||||
new DragHandler(this, DnDConstants.ACTION_COPY_OR_MOVE) {
|
||||
protected Icon getDragIcon(DragGestureEvent e, Point imageOffset) {
|
||||
dragging = true;
|
||||
return getIcon();
|
||||
}
|
||||
public void dragDropEnd(DragSourceDropEvent e) {
|
||||
super.dragDropEnd(e);
|
||||
if (e.getDropSuccess() && getDropAction(e) == MOVE) {
|
||||
if (dragging) {
|
||||
setIcon(null);
|
||||
dragging = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
protected Transferable getTransferable(DragGestureEvent e) {
|
||||
ImageIcon icon = (ImageIcon)getIcon();
|
||||
if (icon != null) {
|
||||
return new ImageSelection(icon.getImage());
|
||||
}
|
||||
return null;
|
||||
}
|
||||
};
|
||||
DataFlavor[] flavors = new DataFlavor[] { DataFlavor.imageFlavor };
|
||||
new DropHandler(this, DnDConstants.ACTION_COPY_OR_MOVE, flavors) {
|
||||
protected void drop(DropTargetDropEvent e, int action) throws UnsupportedFlavorException, IOException {
|
||||
final Image image = (Image)e.getTransferable().getTransferData(DataFlavor.imageFlavor);
|
||||
dragging = false;
|
||||
setIcon(new ImageIcon(image));
|
||||
}
|
||||
};
|
||||
}
|
||||
public void setIcon(Icon icon) {
|
||||
super.setIcon(icon);
|
||||
if (icon == null) {
|
||||
setText("Empty");
|
||||
}
|
||||
else {
|
||||
setText(null);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
try {
|
||||
System.setProperty("sun.java2d.noddraw", "true");
|
||||
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
|
||||
JFrame f1 = new JFrame("Drag this");
|
||||
JFrame f2 = new JFrame("Over here");
|
||||
URL url = GhostedDragImageDemo.class.getResource("toucan.png");
|
||||
if (url == null)
|
||||
throw new RuntimeException("Icon not found");
|
||||
Icon icon = new ImageIcon(url);
|
||||
f1.getContentPane().add(new DragLabel(icon));
|
||||
JLabel label2 = new DragLabel(icon);
|
||||
f2.getContentPane().add(label2);
|
||||
f1.setLocation(100, 100);
|
||||
f1.pack();
|
||||
f1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
|
||||
f2.setLocation(300, 100);
|
||||
f2.pack();
|
||||
label2.setIcon(null);
|
||||
f2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
|
||||
f2.setVisible(true);
|
||||
f1.setVisible(true);
|
||||
}
|
||||
catch(Throwable t){
|
||||
t.printStackTrace();
|
||||
System.exit(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
Arquivo binário não exibido.
|
Depois Largura: | Altura: | Tamanho: 28 KiB |
@@ -0,0 +1,13 @@
|
||||
<html>
|
||||
<head>
|
||||
<!--
|
||||
Copyright (c) 2007 Timothy Wall
|
||||
-->
|
||||
</head>
|
||||
<body bgcolor="white">
|
||||
|
||||
<!-- One sentence summary -->
|
||||
Cross-platform ghosted drag image implementation with demo application.
|
||||
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,206 @@
|
||||
/*
|
||||
* Copyright 2014 Martin Steiger
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.sun.jna.contrib.demo;
|
||||
|
||||
import com.sun.jna.Memory;
|
||||
import com.sun.jna.platform.EnumUtils;
|
||||
import com.sun.jna.platform.win32.Dxva2;
|
||||
import com.sun.jna.platform.win32.HighLevelMonitorConfigurationAPI;
|
||||
import com.sun.jna.platform.win32.HighLevelMonitorConfigurationAPI.MC_COLOR_TEMPERATURE;
|
||||
import com.sun.jna.platform.win32.HighLevelMonitorConfigurationAPI.MC_DISPLAY_TECHNOLOGY_TYPE;
|
||||
import com.sun.jna.platform.win32.HighLevelMonitorConfigurationAPI.MC_DRIVE_TYPE;
|
||||
import com.sun.jna.platform.win32.HighLevelMonitorConfigurationAPI.MC_GAIN_TYPE;
|
||||
import com.sun.jna.platform.win32.HighLevelMonitorConfigurationAPI.MC_POSITION_TYPE;
|
||||
import com.sun.jna.platform.win32.HighLevelMonitorConfigurationAPI.MC_SIZE_TYPE;
|
||||
import com.sun.jna.platform.win32.LowLevelMonitorConfigurationAPI.MC_TIMING_REPORT;
|
||||
import com.sun.jna.platform.win32.PhysicalMonitorEnumerationAPI.PHYSICAL_MONITOR;
|
||||
import com.sun.jna.platform.win32.User32;
|
||||
import com.sun.jna.platform.win32.WTypes.LPSTR;
|
||||
import com.sun.jna.platform.win32.WinDef.DWORD;
|
||||
import com.sun.jna.platform.win32.WinDef.DWORDByReference;
|
||||
import com.sun.jna.platform.win32.WinDef.HDC;
|
||||
import com.sun.jna.platform.win32.WinDef.LPARAM;
|
||||
import com.sun.jna.platform.win32.WinDef.RECT;
|
||||
import com.sun.jna.platform.win32.WinNT.HANDLE;
|
||||
import com.sun.jna.platform.win32.WinUser;
|
||||
import com.sun.jna.platform.win32.WinUser.HMONITOR;
|
||||
import com.sun.jna.platform.win32.WinUser.MONITORENUMPROC;
|
||||
import com.sun.jna.platform.win32.WinUser.MONITORINFOEX;
|
||||
|
||||
/**
|
||||
* A small demo that tests the Win32 monitor API.
|
||||
* All available physical and virtual monitors are enumerated and
|
||||
* their capabilities printed to stdout
|
||||
* @author Martin Steiger
|
||||
*/
|
||||
public class MonitorInfoDemo
|
||||
{
|
||||
/**
|
||||
* @param args (ignored)
|
||||
*/
|
||||
public static void main(String[] args)
|
||||
{
|
||||
System.out.println("Installed Physical Monitors: " + User32.INSTANCE.GetSystemMetrics(WinUser.SM_CMONITORS));
|
||||
|
||||
User32.INSTANCE.EnumDisplayMonitors(null, null, new MONITORENUMPROC() {
|
||||
|
||||
@Override
|
||||
public int apply(HMONITOR hMonitor, HDC hdc, RECT rect, LPARAM lparam)
|
||||
{
|
||||
enumerate(hMonitor);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
}, new LPARAM(0));
|
||||
}
|
||||
|
||||
static void enumerate(HMONITOR hMonitor)
|
||||
{
|
||||
System.out.println("Found HMONITOR: " + hMonitor.getPointer().toString());
|
||||
|
||||
MONITORINFOEX info = new MONITORINFOEX();
|
||||
User32.INSTANCE.GetMonitorInfo(hMonitor, info);
|
||||
System.out.println("Screen " + info.rcMonitor);
|
||||
System.out.println("Work area " + info.rcWork);
|
||||
boolean isPrimary = (info.dwFlags & WinUser.MONITORINFOF_PRIMARY) != 0;
|
||||
System.out.println("Primary? " + (isPrimary ? "yes" : "no"));
|
||||
System.out.println("Device " + new String(info.szDevice));
|
||||
|
||||
DWORDByReference pdwNumberOfPhysicalMonitors = new DWORDByReference();
|
||||
Dxva2.INSTANCE.GetNumberOfPhysicalMonitorsFromHMONITOR(hMonitor, pdwNumberOfPhysicalMonitors);
|
||||
int monitorCount = pdwNumberOfPhysicalMonitors.getValue().intValue();
|
||||
|
||||
System.out.println("HMONITOR is linked to " + monitorCount + " physical monitors");
|
||||
|
||||
PHYSICAL_MONITOR[] physMons = new PHYSICAL_MONITOR[monitorCount];
|
||||
Dxva2.INSTANCE.GetPhysicalMonitorsFromHMONITOR(hMonitor, monitorCount, physMons);
|
||||
|
||||
for (int i = 0; i < monitorCount; i++)
|
||||
{
|
||||
HANDLE hPhysicalMonitor = physMons[0].hPhysicalMonitor;
|
||||
System.out.println("Monitor " + i + " - " + new String(physMons[i].szPhysicalMonitorDescription));
|
||||
|
||||
enumeratePhysicalMonitor(hPhysicalMonitor);
|
||||
}
|
||||
|
||||
Dxva2.INSTANCE.DestroyPhysicalMonitors(monitorCount, physMons);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param hPhysicalMonitor
|
||||
*/
|
||||
private static void enumeratePhysicalMonitor(HANDLE hPhysicalMonitor)
|
||||
{
|
||||
MC_DISPLAY_TECHNOLOGY_TYPE.ByReference techType = new MC_DISPLAY_TECHNOLOGY_TYPE.ByReference();
|
||||
Dxva2.INSTANCE.GetMonitorTechnologyType(hPhysicalMonitor, techType);
|
||||
System.out.println("TECHTYPE: " + techType.getValue());
|
||||
|
||||
DWORDByReference temps = new DWORDByReference();
|
||||
DWORDByReference caps = new DWORDByReference();
|
||||
Dxva2.INSTANCE.GetMonitorCapabilities(hPhysicalMonitor, caps, temps);
|
||||
System.out.println("CAPS " + EnumUtils.setFromInteger(caps.getValue().intValue(), HighLevelMonitorConfigurationAPI.MC_CAPS.class));
|
||||
System.out.println("Temps " + temps.getValue());
|
||||
|
||||
// Brightness
|
||||
DWORDByReference pdwMinimumBrightness = new DWORDByReference();
|
||||
DWORDByReference pdwCurrentBrightness = new DWORDByReference();
|
||||
DWORDByReference pdwMaximumBrightness = new DWORDByReference();
|
||||
Dxva2.INSTANCE.GetMonitorBrightness(hPhysicalMonitor, pdwMinimumBrightness, pdwCurrentBrightness, pdwMaximumBrightness);
|
||||
|
||||
System.out.println("Brightness Min: " + pdwMinimumBrightness.getValue());
|
||||
System.out.println("Brightness Current: " + pdwCurrentBrightness.getValue());
|
||||
System.out.println("Brightness Max: " + pdwMaximumBrightness.getValue());
|
||||
|
||||
// Contrast
|
||||
DWORDByReference pdwMinimumContrast = new DWORDByReference();
|
||||
DWORDByReference pdwCurrentContrast = new DWORDByReference();
|
||||
DWORDByReference pdwMaximumContrast = new DWORDByReference();
|
||||
Dxva2.INSTANCE.GetMonitorContrast(hPhysicalMonitor, pdwMinimumContrast, pdwCurrentContrast, pdwMaximumContrast);
|
||||
|
||||
System.out.println("Contrast Min: " + pdwMinimumContrast.getValue());
|
||||
System.out.println("Contrast Current: " + pdwCurrentContrast.getValue());
|
||||
System.out.println("Contrast Max: " + pdwMaximumContrast.getValue());
|
||||
|
||||
// Temperature
|
||||
MC_COLOR_TEMPERATURE.ByReference pctCurrentColorTemperature = new MC_COLOR_TEMPERATURE.ByReference();
|
||||
Dxva2.INSTANCE.GetMonitorColorTemperature(hPhysicalMonitor, pctCurrentColorTemperature);
|
||||
System.out.println("Current Temp: " + pctCurrentColorTemperature.getValue());
|
||||
|
||||
// Capabilities string
|
||||
DWORDByReference pdwCapabilitiesStringLengthInCharacters = new DWORDByReference();
|
||||
Dxva2.INSTANCE.GetCapabilitiesStringLength(hPhysicalMonitor, pdwCapabilitiesStringLengthInCharacters);
|
||||
DWORD capStrLen = pdwCapabilitiesStringLengthInCharacters.getValue();
|
||||
|
||||
LPSTR pszASCIICapabilitiesString = new LPSTR(new Memory(capStrLen.intValue()));
|
||||
Dxva2.INSTANCE.CapabilitiesRequestAndCapabilitiesReply(hPhysicalMonitor, pszASCIICapabilitiesString, capStrLen);
|
||||
System.out.println("Cap-String:" + new String(pszASCIICapabilitiesString.getPointer().getString(0)));
|
||||
|
||||
// Position
|
||||
MC_POSITION_TYPE ptPositionType = MC_POSITION_TYPE.MC_HORIZONTAL_POSITION;
|
||||
DWORDByReference pdwMinimumPosition = new DWORDByReference();
|
||||
DWORDByReference pdwCurrentPosition = new DWORDByReference();
|
||||
DWORDByReference pdwMaximumPosition = new DWORDByReference();
|
||||
Dxva2.INSTANCE.GetMonitorDisplayAreaPosition(hPhysicalMonitor, ptPositionType, pdwMinimumPosition, pdwCurrentPosition, pdwMaximumPosition);
|
||||
|
||||
System.out.println("Position (horz) Min: " + pdwMinimumPosition.getValue());
|
||||
System.out.println("Position (horz) Current: " + pdwCurrentPosition.getValue());
|
||||
System.out.println("Position (horz) Max: " + pdwMaximumPosition.getValue());
|
||||
|
||||
// Size
|
||||
MC_SIZE_TYPE ptSizeType = MC_SIZE_TYPE.MC_WIDTH;
|
||||
DWORDByReference pdwMinimumSize = new DWORDByReference();
|
||||
DWORDByReference pdwCurrentSize = new DWORDByReference();
|
||||
DWORDByReference pdwMaximumSize = new DWORDByReference();
|
||||
Dxva2.INSTANCE.GetMonitorDisplayAreaSize(hPhysicalMonitor, ptSizeType, pdwMinimumSize, pdwCurrentSize, pdwMaximumSize);
|
||||
|
||||
System.out.println("Width Min: " + pdwMinimumSize.getValue());
|
||||
System.out.println("Width Current: " + pdwCurrentSize.getValue());
|
||||
System.out.println("Width Max: " + pdwMaximumSize.getValue());
|
||||
|
||||
// Gain
|
||||
MC_GAIN_TYPE ptGainType = MC_GAIN_TYPE.MC_RED_GAIN;
|
||||
DWORDByReference pdwMinimumGain = new DWORDByReference();
|
||||
DWORDByReference pdwCurrentGain = new DWORDByReference();
|
||||
DWORDByReference pdwMaximumGain = new DWORDByReference();
|
||||
Dxva2.INSTANCE.GetMonitorRedGreenOrBlueGain(hPhysicalMonitor, ptGainType, pdwMinimumGain, pdwCurrentGain, pdwMaximumGain);
|
||||
|
||||
System.out.println("Red Gain Min: " + pdwMinimumSize.getValue());
|
||||
System.out.println("Red Gain Current: " + pdwCurrentSize.getValue());
|
||||
System.out.println("Red Gain Max: " + pdwMaximumSize.getValue());
|
||||
|
||||
// Drive
|
||||
MC_DRIVE_TYPE ptDriveType = MC_DRIVE_TYPE.MC_RED_DRIVE;
|
||||
DWORDByReference pdwMinimumDrive = new DWORDByReference();
|
||||
DWORDByReference pdwCurrentDrive = new DWORDByReference();
|
||||
DWORDByReference pdwMaximumDrive = new DWORDByReference();
|
||||
Dxva2.INSTANCE.GetMonitorRedGreenOrBlueDrive(hPhysicalMonitor, ptDriveType, pdwMinimumDrive, pdwCurrentDrive, pdwMaximumDrive);
|
||||
|
||||
System.out.println("Red Drive Min: " + pdwMinimumSize.getValue());
|
||||
System.out.println("Red Drive Current: " + pdwCurrentSize.getValue());
|
||||
System.out.println("Red Drive Max: " + pdwMaximumSize.getValue());
|
||||
|
||||
// Timing Report
|
||||
MC_TIMING_REPORT pmtrMonitorTimingReport = new MC_TIMING_REPORT();
|
||||
Dxva2.INSTANCE.GetTimingReport(hPhysicalMonitor, pmtrMonitorTimingReport);
|
||||
System.out.println("HorizontalFrequencyInHZ " + pmtrMonitorTimingReport.dwHorizontalFrequencyInHZ);
|
||||
System.out.println("VerticalFrequencyInHZ " + pmtrMonitorTimingReport.dwVerticalFrequencyInHZ);
|
||||
|
||||
System.out.println("--------------------------------------");
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<classpath>
|
||||
<classpathentry kind="src" path="src"/>
|
||||
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/>
|
||||
<classpathentry combineaccessrules="false" kind="src" path="/jnalib"/>
|
||||
<classpathentry kind="var" path="JNA_LIB"/>
|
||||
<classpathentry kind="output" path="bin"/>
|
||||
</classpath>
|
||||
@@ -0,0 +1,17 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<projectDescription>
|
||||
<name>msoffice</name>
|
||||
<comment></comment>
|
||||
<projects>
|
||||
</projects>
|
||||
<buildSpec>
|
||||
<buildCommand>
|
||||
<name>org.eclipse.jdt.core.javabuilder</name>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
</buildSpec>
|
||||
<natures>
|
||||
<nature>org.eclipse.jdt.core.javanature</nature>
|
||||
</natures>
|
||||
</projectDescription>
|
||||
Arquivo binário não exibido.
Arquivo binário não exibido.
@@ -0,0 +1,43 @@
|
||||
package com.sun.jna.platform.win32.COM;
|
||||
|
||||
import java.io.FileWriter;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
|
||||
import com.sun.jna.platform.win32.COM.COMUtils;
|
||||
import com.sun.jna.platform.win32.COM.COMUtils.COMInfo;
|
||||
|
||||
public class COMInfoUtil {
|
||||
|
||||
public static void main(String[] args) {
|
||||
FileWriter writer = null;
|
||||
try {
|
||||
String filename = "C:\\TEMP\\CLSIDs.txt";
|
||||
ArrayList<COMInfo> comInfos = COMUtils.getAllCOMInfoOnSystem();
|
||||
writer = new FileWriter(filename);
|
||||
|
||||
for (COMInfo comInfo : comInfos) {
|
||||
String result = "CLSID: " + comInfo.clsid + "\n";
|
||||
result += "InprocHandler32: " + comInfo.inprocHandler32 + "\n";
|
||||
result += "InprocServer32: " + comInfo.inprocServer32 + "\n";
|
||||
result += "LocalServer32: " + comInfo.localServer32 + "\n";
|
||||
result += "ProgID: " + comInfo.progID + "\n";
|
||||
result += "ProgTypeLibID: " + comInfo.typeLib + "\n";
|
||||
|
||||
writer.write(result + "\n");
|
||||
}
|
||||
|
||||
System.out.println("file written to: " + filename);
|
||||
System.out.println("Found CLSID`s on the system: "
|
||||
+ comInfos.size());
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
} finally {
|
||||
try {
|
||||
writer.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,97 @@
|
||||
package com.sun.jna.platform.win32.COM.office;
|
||||
|
||||
import com.sun.jna.platform.win32.Variant.VARIANT;
|
||||
import com.sun.jna.platform.win32.COM.COMException;
|
||||
import com.sun.jna.platform.win32.COM.COMLateBindingObject;
|
||||
import com.sun.jna.platform.win32.COM.IDispatch;
|
||||
|
||||
public class MSExcel extends COMLateBindingObject {
|
||||
|
||||
public MSExcel() throws COMException {
|
||||
super("Excel.Application", false);
|
||||
}
|
||||
|
||||
public MSExcel(boolean visible) throws COMException {
|
||||
this();
|
||||
this.setVisible(visible);
|
||||
}
|
||||
|
||||
public void setVisible(boolean bVisible) throws COMException {
|
||||
this.setProperty("Visible", bVisible);
|
||||
}
|
||||
|
||||
public String getVersion() throws COMException {
|
||||
return this.getStringProperty("Version");
|
||||
}
|
||||
|
||||
public void newExcelBook() throws COMException {
|
||||
this.invokeNoReply("Add", getWorkbooks());
|
||||
}
|
||||
|
||||
public void openExcelBook(String filename, boolean bVisible)
|
||||
throws COMException {
|
||||
// OpenDocument
|
||||
this.invokeNoReply("Open", getWorkbooks(), new VARIANT(filename));
|
||||
}
|
||||
|
||||
public void closeActiveWorkbook(boolean bSave) throws COMException {
|
||||
this.invokeNoReply("Close", getActiveWorkbook(), new VARIANT(bSave));
|
||||
}
|
||||
|
||||
public void quit() throws COMException {
|
||||
this.invokeNoReply("Quit");
|
||||
}
|
||||
|
||||
public void insertValue(String range, String value) throws COMException {
|
||||
Range pRange = new Range(this.getAutomationProperty("Range",
|
||||
this.getActiveSheet(), new VARIANT(range)));
|
||||
this.setProperty("Value", pRange, new VARIANT(value));
|
||||
}
|
||||
|
||||
public Application getApplication() {
|
||||
return new Application(this.getAutomationProperty("Application"));
|
||||
}
|
||||
|
||||
public ActiveWorkbook getActiveWorkbook() {
|
||||
return new ActiveWorkbook(this.getAutomationProperty("ActiveWorkbook"));
|
||||
}
|
||||
|
||||
public Workbooks getWorkbooks() {
|
||||
return new Workbooks(this.getAutomationProperty("WorkBooks"));
|
||||
}
|
||||
|
||||
public ActiveSheet getActiveSheet() {
|
||||
return new ActiveSheet(this.getAutomationProperty("ActiveSheet"));
|
||||
}
|
||||
|
||||
public class Application extends COMLateBindingObject {
|
||||
|
||||
public Application(IDispatch iDispatch) throws COMException {
|
||||
super(iDispatch);
|
||||
}
|
||||
}
|
||||
|
||||
public class Workbooks extends COMLateBindingObject {
|
||||
public Workbooks(IDispatch iDispatch) throws COMException {
|
||||
super(iDispatch);
|
||||
}
|
||||
}
|
||||
|
||||
public class ActiveWorkbook extends COMLateBindingObject {
|
||||
public ActiveWorkbook(IDispatch iDispatch) throws COMException {
|
||||
super(iDispatch);
|
||||
}
|
||||
}
|
||||
|
||||
public class ActiveSheet extends COMLateBindingObject {
|
||||
public ActiveSheet(IDispatch iDispatch) throws COMException {
|
||||
super(iDispatch);
|
||||
}
|
||||
}
|
||||
|
||||
public class Range extends COMLateBindingObject {
|
||||
public Range(IDispatch iDispatch) throws COMException {
|
||||
super(iDispatch);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,123 @@
|
||||
package com.sun.jna.platform.win32.COM.office;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
import com.sun.jna.platform.win32.COM.COMException;
|
||||
import com.sun.jna.platform.win32.WinDef.LONG;
|
||||
|
||||
public class MSOfficeDemo {
|
||||
|
||||
/**
|
||||
* @param args
|
||||
*/
|
||||
public static void main(String[] args) {
|
||||
new MSOfficeDemo();
|
||||
}
|
||||
|
||||
private String currentWorkingDir = new File("").getAbsolutePath()
|
||||
+ File.separator;
|
||||
|
||||
public MSOfficeDemo() {
|
||||
this.testMSWord();
|
||||
// this.testMSExcel();
|
||||
}
|
||||
|
||||
public void testMSWord() {
|
||||
MSWord msWord = null;
|
||||
|
||||
// http://msdn.microsoft.com/en-us/library/office/ff839952(v=office.15).aspx
|
||||
LONG wdFormatPDF = new LONG(17); // PDF format.
|
||||
LONG wdFormatRTF = new LONG(6); // Rich text format (RTF).
|
||||
LONG wdFormatHTML = new LONG(8); // Standard HTML format.
|
||||
LONG wdFormatDocument = new LONG(0); // Microsoft Office Word 97 - 2003 binary file format.
|
||||
LONG wdFormatDocumentDefault = new LONG(16); // Word default document file format. For Word 2010, this is the DOCX format.
|
||||
|
||||
// http://msdn.microsoft.com/en-us/library/office/ff838709(v=office.15).aspx
|
||||
LONG wdOriginalDocumentFormat = new LONG(1); // Original document format.
|
||||
LONG wdPromptUser = new LONG(2); // Prompt user to select a document format.
|
||||
LONG wdWordDocument = new LONG(0); // Microsoft Word document format.
|
||||
|
||||
try {
|
||||
msWord = new MSWord();
|
||||
System.out.println("MSWord version: " + msWord.getVersion());
|
||||
|
||||
msWord.setVisible(true);
|
||||
// msWord.newDocument();
|
||||
msWord.openDocument(currentWorkingDir + "jnatest.doc", true);
|
||||
msWord.insertText("Hello from JNA! \n\n");
|
||||
// wait 10sec. before closing
|
||||
Thread.currentThread().sleep(1000);
|
||||
// save in different formats
|
||||
// pdf format is only supported in MSWord 2007 and above
|
||||
msWord.SaveAs("C:\\TEMP\\jnatestSaveAs.doc", wdFormatDocument);
|
||||
msWord.SaveAs("C:\\TEMP\\jnatestSaveAs.pdf", wdFormatPDF);
|
||||
msWord.SaveAs("C:\\TEMP\\jnatestSaveAs.rtf", wdFormatRTF);
|
||||
msWord.SaveAs("C:\\TEMP\\jnatestSaveAs.html", wdFormatHTML);
|
||||
// close and save the document
|
||||
msWord.closeActiveDocument(false);
|
||||
msWord.newDocument();
|
||||
// msWord.openDocument(currentWorkingDir + "jnatest.doc", true);
|
||||
msWord.insertText("Hello from JNA! \n Please notice that JNA can control MS Word via the new COM interface! \nHere we are creating a new word document and we save it to the 'TEMP' directory!");
|
||||
// save with no user prompt
|
||||
msWord.SaveAs("C:\\TEMP\\jnatestNewDoc1.docx", wdFormatDocumentDefault);
|
||||
msWord.SaveAs("C:\\TEMP\\jnatestNewDoc2.docx", wdFormatDocumentDefault);
|
||||
msWord.SaveAs("C:\\TEMP\\jnatestNewDoc3.docx", wdFormatDocumentDefault);
|
||||
// close and save the document
|
||||
msWord.closeActiveDocument(false);
|
||||
// open 3 documents
|
||||
msWord.openDocument("C:\\TEMP\\jnatestNewDoc1.docx", true);
|
||||
msWord.insertText("Hello some changes from JNA!\n");
|
||||
msWord.openDocument("C:\\TEMP\\jnatestNewDoc2.docx", true);
|
||||
msWord.insertText("Hello some changes from JNA!\n");
|
||||
msWord.openDocument("C:\\TEMP\\jnatestNewDoc3.docx", true);
|
||||
msWord.insertText("Hello some changes from JNA!\n");
|
||||
// save the document and prompt the user
|
||||
msWord.Save(false, wdPromptUser);
|
||||
// wait then close word
|
||||
msWord.quit();
|
||||
} catch(InterruptedException ie) {
|
||||
ie.printStackTrace();
|
||||
} catch (COMException e) {
|
||||
if (e.getExcepInfo() != null) {
|
||||
System.out
|
||||
.println("bstrSource: " + e.getExcepInfo().bstrSource);
|
||||
System.out.println("bstrDescription: "
|
||||
+ e.getExcepInfo().bstrDescription);
|
||||
}
|
||||
|
||||
// print stack trace
|
||||
e.printStackTrace();
|
||||
|
||||
if (msWord != null)
|
||||
msWord.quit();
|
||||
}
|
||||
}
|
||||
|
||||
public void testMSExcel() {
|
||||
MSExcel msExcel = null;
|
||||
|
||||
try {
|
||||
msExcel = new MSExcel();
|
||||
System.out.println("MSExcel version: " + msExcel.getVersion());
|
||||
msExcel.setVisible(true);
|
||||
// msExcel.newExcelBook();
|
||||
msExcel.openExcelBook(currentWorkingDir + "jnatest.xls", true);
|
||||
msExcel.insertValue("A1", "Hello from JNA!");
|
||||
// wait 10sec. before closing
|
||||
Thread.currentThread().sleep(10000);
|
||||
// close and save the active sheet
|
||||
msExcel.closeActiveWorkbook(true);
|
||||
msExcel.setVisible(true);
|
||||
// msExcel.newExcelBook();
|
||||
msExcel.openExcelBook(currentWorkingDir + "jnatest.xls", true);
|
||||
msExcel.insertValue("A1", "Hello from JNA!");
|
||||
// close and save the active sheet
|
||||
msExcel.closeActiveWorkbook(true);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
|
||||
if (msExcel != null)
|
||||
msExcel.quit();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,107 @@
|
||||
package com.sun.jna.platform.win32.COM.office;
|
||||
|
||||
import com.sun.jna.platform.win32.Variant.VARIANT;
|
||||
import com.sun.jna.platform.win32.COM.COMException;
|
||||
import com.sun.jna.platform.win32.COM.COMLateBindingObject;
|
||||
import com.sun.jna.platform.win32.COM.IDispatch;
|
||||
import com.sun.jna.platform.win32.WinDef.LONG;
|
||||
|
||||
public class MSWord extends COMLateBindingObject {
|
||||
|
||||
public MSWord() throws COMException {
|
||||
super("Word.Application", false);
|
||||
}
|
||||
|
||||
public MSWord(boolean visible) throws COMException {
|
||||
this();
|
||||
this.setVisible(visible);
|
||||
}
|
||||
|
||||
public void setVisible(boolean bVisible) throws COMException {
|
||||
this.setProperty("Visible", bVisible);
|
||||
}
|
||||
|
||||
public String getVersion() throws COMException {
|
||||
return this.getStringProperty("Version");
|
||||
}
|
||||
|
||||
public void newDocument() throws COMException {
|
||||
this.invokeNoReply("Add", getDocuments());
|
||||
}
|
||||
|
||||
public void openDocument(String filename, boolean bVisible)
|
||||
throws COMException {
|
||||
// OpenDocument
|
||||
this.invokeNoReply("Open", getDocuments(), new VARIANT(filename));
|
||||
}
|
||||
|
||||
public void closeActiveDocument(boolean bSave) throws COMException {
|
||||
this.invokeNoReply("Close", getActiveDocument(), new VARIANT(bSave));
|
||||
}
|
||||
|
||||
public void quit() throws COMException {
|
||||
this.invokeNoReply("Quit");
|
||||
}
|
||||
|
||||
public void insertText(String text) throws COMException {
|
||||
Selection pSelection = new Selection(this.getAutomationProperty(
|
||||
"Selection", this.getIDispatch()));
|
||||
this.invokeNoReply("TypeText", pSelection, new VARIANT(text));
|
||||
}
|
||||
|
||||
public void Save(boolean bNoPrompt, LONG originalFormat) throws COMException {
|
||||
VARIANT vtNoPrompt = new VARIANT(bNoPrompt);
|
||||
VARIANT vtOriginalFormat = new VARIANT(originalFormat);
|
||||
|
||||
this.invokeNoReply("Save", this.getDocuments(),
|
||||
vtNoPrompt, vtOriginalFormat);
|
||||
}
|
||||
|
||||
public void SaveAs(String FileName, LONG FileFormat) throws COMException {
|
||||
VARIANT vtFileName = new VARIANT(FileName);
|
||||
VARIANT vtFileFormat = new VARIANT(FileFormat);
|
||||
|
||||
this.invokeNoReply("SaveAs", this.getActiveDocument(),
|
||||
vtFileName, vtFileFormat);
|
||||
}
|
||||
|
||||
public ActiveDocument getActiveDocument() {
|
||||
return new ActiveDocument(this.getAutomationProperty("ActiveDocument"));
|
||||
}
|
||||
|
||||
public Documents getDocuments() {
|
||||
// GetDocuments
|
||||
Documents pDocuments = new Documents(this.getAutomationProperty(
|
||||
"Documents", this.getApplication().getIDispatch()));
|
||||
|
||||
return pDocuments;
|
||||
}
|
||||
|
||||
public Application getApplication() {
|
||||
return new Application(this.getAutomationProperty("Application"));
|
||||
}
|
||||
|
||||
public class Application extends COMLateBindingObject {
|
||||
public Application(IDispatch iDispatch) throws COMException {
|
||||
super(iDispatch);
|
||||
}
|
||||
}
|
||||
|
||||
public class Documents extends COMLateBindingObject {
|
||||
public Documents(IDispatch iDispatch) throws COMException {
|
||||
super(iDispatch);
|
||||
}
|
||||
}
|
||||
|
||||
public class ActiveDocument extends COMLateBindingObject {
|
||||
public ActiveDocument(IDispatch iDispatch) throws COMException {
|
||||
super(iDispatch);
|
||||
}
|
||||
}
|
||||
|
||||
public class Selection extends COMLateBindingObject {
|
||||
public Selection(IDispatch iDispatch) throws COMException {
|
||||
super(iDispatch);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<classpath>
|
||||
<classpathentry kind="src" path="src"/>
|
||||
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
|
||||
<classpathentry combineaccessrules="false" kind="src" path="/jnalib"/>
|
||||
<classpathentry kind="lib" path="C:/GitHub/jna-3.5.1.jar"/>
|
||||
<classpathentry kind="output" path="bin"/>
|
||||
</classpath>
|
||||
@@ -0,0 +1,17 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<projectDescription>
|
||||
<name>native_window_msg</name>
|
||||
<comment></comment>
|
||||
<projects>
|
||||
</projects>
|
||||
<buildSpec>
|
||||
<buildCommand>
|
||||
<name>org.eclipse.jdt.core.javabuilder</name>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
</buildSpec>
|
||||
<natures>
|
||||
<nature>org.eclipse.jdt.core.javanature</nature>
|
||||
</natures>
|
||||
</projectDescription>
|
||||
@@ -0,0 +1,381 @@
|
||||
/* Copyright (c) 2012 Tobias Wolf, All Rights Reserved
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
package com.sun.jna.platform.win32;
|
||||
|
||||
import com.sun.jna.WString;
|
||||
import com.sun.jna.platform.win32.DBT;
|
||||
import com.sun.jna.platform.win32.DBT.DEV_BROADCAST_DEVICEINTERFACE;
|
||||
import com.sun.jna.platform.win32.DBT.DEV_BROADCAST_HANDLE;
|
||||
import com.sun.jna.platform.win32.DBT.DEV_BROADCAST_HDR;
|
||||
import com.sun.jna.platform.win32.DBT.DEV_BROADCAST_OEM;
|
||||
import com.sun.jna.platform.win32.DBT.DEV_BROADCAST_PORT;
|
||||
import com.sun.jna.platform.win32.DBT.DEV_BROADCAST_VOLUME;
|
||||
import com.sun.jna.platform.win32.Kernel32;
|
||||
import com.sun.jna.platform.win32.User32;
|
||||
import com.sun.jna.platform.win32.WinDef.HMODULE;
|
||||
import com.sun.jna.platform.win32.WinDef.HWND;
|
||||
import com.sun.jna.platform.win32.WinDef.LPARAM;
|
||||
import com.sun.jna.platform.win32.WinDef.LRESULT;
|
||||
import com.sun.jna.platform.win32.WinDef.WPARAM;
|
||||
import com.sun.jna.platform.win32.WinUser;
|
||||
import com.sun.jna.platform.win32.WinUser.HDEVNOTIFY;
|
||||
import com.sun.jna.platform.win32.WinUser.MSG;
|
||||
import com.sun.jna.platform.win32.WinUser.WNDCLASSEX;
|
||||
import com.sun.jna.platform.win32.WinUser.WindowProc;
|
||||
import com.sun.jna.platform.win32.Wtsapi32;
|
||||
|
||||
// TODO: Auto-generated Javadoc
|
||||
/**
|
||||
* The Class Win32WindowTest.
|
||||
*/
|
||||
public class Win32WindowDemo implements WindowProc {
|
||||
|
||||
/**
|
||||
* Instantiates a new win32 window test.
|
||||
*/
|
||||
public Win32WindowDemo() {
|
||||
// define new window class
|
||||
WString windowClass = new WString("MyWindowClass");
|
||||
HMODULE hInst = Kernel32.INSTANCE.GetModuleHandle("");
|
||||
|
||||
WNDCLASSEX wClass = new WNDCLASSEX();
|
||||
wClass.hInstance = hInst;
|
||||
wClass.lpfnWndProc = Win32WindowDemo.this;
|
||||
wClass.lpszClassName = windowClass;
|
||||
|
||||
// register window class
|
||||
User32.INSTANCE.RegisterClassEx(wClass);
|
||||
getLastError();
|
||||
|
||||
// create new window
|
||||
HWND hWnd = User32.INSTANCE
|
||||
.CreateWindowEx(
|
||||
User32.WS_EX_TOPMOST,
|
||||
windowClass,
|
||||
"My hidden helper window, used only to catch the windows events",
|
||||
0, 0, 0, 0, 0,
|
||||
null, // WM_DEVICECHANGE contradicts parent=WinUser.HWND_MESSAGE
|
||||
null, hInst, null);
|
||||
|
||||
getLastError();
|
||||
System.out.println("window sucessfully created! window hwnd: "
|
||||
+ hWnd.getPointer().toString());
|
||||
|
||||
Wtsapi32.INSTANCE.WTSRegisterSessionNotification(hWnd,
|
||||
Wtsapi32.NOTIFY_FOR_THIS_SESSION);
|
||||
|
||||
/* this filters for all device classes */
|
||||
// DEV_BROADCAST_HDR notificationFilter = new DEV_BROADCAST_HDR();
|
||||
// notificationFilter.dbch_devicetype = DBT.DBT_DEVTYP_DEVICEINTERFACE;
|
||||
|
||||
/* this filters for all usb device classes */
|
||||
DEV_BROADCAST_DEVICEINTERFACE notificationFilter = new DEV_BROADCAST_DEVICEINTERFACE();
|
||||
notificationFilter.dbcc_size = notificationFilter.size();
|
||||
notificationFilter.dbcc_devicetype = DBT.DBT_DEVTYP_DEVICEINTERFACE;
|
||||
notificationFilter.dbcc_classguid = DBT.GUID_DEVINTERFACE_USB_DEVICE;
|
||||
|
||||
/*
|
||||
* use User32.DEVICE_NOTIFY_ALL_INTERFACE_CLASSES instead of
|
||||
* DEVICE_NOTIFY_WINDOW_HANDLE to ignore the dbcc_classguid value
|
||||
*/
|
||||
HDEVNOTIFY hDevNotify = User32.INSTANCE.RegisterDeviceNotification(
|
||||
hWnd, notificationFilter, User32.DEVICE_NOTIFY_WINDOW_HANDLE);
|
||||
|
||||
getLastError();
|
||||
if (hDevNotify != null)
|
||||
System.out.println("RegisterDeviceNotification was sucessfully!");
|
||||
|
||||
MSG msg = new MSG();
|
||||
while (User32.INSTANCE.GetMessage(msg, hWnd, 0, 0) != 0) {
|
||||
User32.INSTANCE.TranslateMessage(msg);
|
||||
User32.INSTANCE.DispatchMessage(msg);
|
||||
}
|
||||
|
||||
User32.INSTANCE.UnregisterDeviceNotification(hDevNotify);
|
||||
Wtsapi32.INSTANCE.WTSUnRegisterSessionNotification(hWnd);
|
||||
User32.INSTANCE.UnregisterClass(windowClass, hInst);
|
||||
User32.INSTANCE.DestroyWindow(hWnd);
|
||||
|
||||
System.out.println("program exit!");
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @see
|
||||
* com.sun.jna.platform.win32.User32.WindowProc#callback(com.sun.jna.platform
|
||||
* .win32.WinDef.HWND, int, com.sun.jna.platform.win32.WinDef.WPARAM,
|
||||
* com.sun.jna.platform.win32.WinDef.LPARAM)
|
||||
*/
|
||||
public LRESULT callback(HWND hwnd, int uMsg, WPARAM wParam, LPARAM lParam) {
|
||||
switch (uMsg) {
|
||||
case WinUser.WM_CREATE: {
|
||||
onCreate(wParam, lParam);
|
||||
return new LRESULT(0);
|
||||
}
|
||||
case WinUser.WM_DESTROY: {
|
||||
User32.INSTANCE.PostQuitMessage(0);
|
||||
return new LRESULT(0);
|
||||
}
|
||||
case WinUser.WM_SESSION_CHANGE: {
|
||||
this.onSessionChange(wParam, lParam);
|
||||
return new LRESULT(0);
|
||||
}
|
||||
case WinUser.WM_DEVICECHANGE: {
|
||||
LRESULT lResult = this.onDeviceChange(wParam, lParam);
|
||||
return lResult != null ? lResult :
|
||||
User32.INSTANCE.DefWindowProc(hwnd, uMsg, wParam, lParam);
|
||||
}
|
||||
default:
|
||||
return User32.INSTANCE.DefWindowProc(hwnd, uMsg, wParam, lParam);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the last error.
|
||||
*
|
||||
* @return the last error
|
||||
*/
|
||||
public int getLastError() {
|
||||
int rc = Kernel32.INSTANCE.GetLastError();
|
||||
|
||||
if (rc != 0)
|
||||
System.out.println("error: " + rc);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
/**
|
||||
* On session change.
|
||||
*
|
||||
* @param wParam
|
||||
* the w param
|
||||
* @param lParam
|
||||
* the l param
|
||||
*/
|
||||
protected void onSessionChange(WPARAM wParam, LPARAM lParam) {
|
||||
switch (wParam.intValue()) {
|
||||
case Wtsapi32.WTS_CONSOLE_CONNECT: {
|
||||
this.onConsoleConnect(lParam.intValue());
|
||||
break;
|
||||
}
|
||||
case Wtsapi32.WTS_CONSOLE_DISCONNECT: {
|
||||
this.onConsoleDisconnect(lParam.intValue());
|
||||
break;
|
||||
}
|
||||
case Wtsapi32.WTS_SESSION_LOGON: {
|
||||
this.onMachineLogon(lParam.intValue());
|
||||
break;
|
||||
}
|
||||
case Wtsapi32.WTS_SESSION_LOGOFF: {
|
||||
this.onMachineLogoff(lParam.intValue());
|
||||
break;
|
||||
}
|
||||
case Wtsapi32.WTS_SESSION_LOCK: {
|
||||
this.onMachineLocked(lParam.intValue());
|
||||
break;
|
||||
}
|
||||
case Wtsapi32.WTS_SESSION_UNLOCK: {
|
||||
this.onMachineUnlocked(lParam.intValue());
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* On console connect.
|
||||
*
|
||||
* @param sessionId
|
||||
* the session id
|
||||
*/
|
||||
protected void onConsoleConnect(int sessionId) {
|
||||
System.out.println("onConsoleConnect: " + sessionId);
|
||||
}
|
||||
|
||||
/**
|
||||
* On console disconnect.
|
||||
*
|
||||
* @param sessionId
|
||||
* the session id
|
||||
*/
|
||||
protected void onConsoleDisconnect(int sessionId) {
|
||||
System.out.println("onConsoleDisconnect: " + sessionId);
|
||||
}
|
||||
|
||||
/**
|
||||
* On machine locked.
|
||||
*
|
||||
* @param sessionId
|
||||
* the session id
|
||||
*/
|
||||
protected void onMachineLocked(int sessionId) {
|
||||
System.out.println("onMachineLocked: " + sessionId);
|
||||
}
|
||||
|
||||
/**
|
||||
* On machine unlocked.
|
||||
*
|
||||
* @param sessionId
|
||||
* the session id
|
||||
*/
|
||||
protected void onMachineUnlocked(int sessionId) {
|
||||
System.out.println("onMachineUnlocked: " + sessionId);
|
||||
}
|
||||
|
||||
/**
|
||||
* On machine logon.
|
||||
*
|
||||
* @param sessionId
|
||||
* the session id
|
||||
*/
|
||||
protected void onMachineLogon(int sessionId) {
|
||||
System.out.println("onMachineLogon: " + sessionId);
|
||||
}
|
||||
|
||||
/**
|
||||
* On machine logoff.
|
||||
*
|
||||
* @param sessionId
|
||||
* the session id
|
||||
*/
|
||||
protected void onMachineLogoff(int sessionId) {
|
||||
System.out.println("onMachineLogoff: " + sessionId);
|
||||
}
|
||||
|
||||
/**
|
||||
* On device change.
|
||||
*
|
||||
* @param wParam
|
||||
* the w param
|
||||
* @param lParam
|
||||
* the l param
|
||||
* @return the result. Null if the message is not processed.
|
||||
*/
|
||||
protected LRESULT onDeviceChange(WPARAM wParam, LPARAM lParam) {
|
||||
switch (wParam.intValue()) {
|
||||
case DBT.DBT_DEVICEARRIVAL: {
|
||||
return onDeviceChangeArrival(lParam);
|
||||
}
|
||||
case DBT.DBT_DEVICEREMOVECOMPLETE: {
|
||||
return onDeviceChangeRemoveComplete(lParam);
|
||||
}
|
||||
case DBT.DBT_DEVNODES_CHANGED: {
|
||||
//lParam is 0 for this wParam
|
||||
return onDeviceChangeNodesChanged();
|
||||
}
|
||||
default:
|
||||
System.out
|
||||
.println("Message WM_DEVICECHANGE message received, value unhandled.");
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
protected LRESULT onDeviceChangeArrivalOrRemoveComplete(LPARAM lParam, String action) {
|
||||
DEV_BROADCAST_HDR bhdr = new DEV_BROADCAST_HDR(lParam.longValue());
|
||||
switch (bhdr.dbch_devicetype) {
|
||||
case DBT.DBT_DEVTYP_DEVICEINTERFACE: {
|
||||
// see http://msdn.microsoft.com/en-us/library/windows/desktop/aa363244.aspx
|
||||
DEV_BROADCAST_DEVICEINTERFACE bdif = new DEV_BROADCAST_DEVICEINTERFACE(bhdr.getPointer());
|
||||
System.out.println("BROADCAST_DEVICEINTERFACE: " + action);
|
||||
System.out.println("dbcc_devicetype: " + bdif.dbcc_devicetype);
|
||||
System.out.println("dbcc_name: " + bdif.getDbcc_name());
|
||||
System.out.println("dbcc_classguid: "
|
||||
+ bdif.dbcc_classguid.toGuidString());
|
||||
break;
|
||||
}
|
||||
case DBT.DBT_DEVTYP_HANDLE: {
|
||||
// see http://msdn.microsoft.com/en-us/library/windows/desktop/aa363245.aspx
|
||||
DEV_BROADCAST_HANDLE bhd = new DEV_BROADCAST_HANDLE(bhdr.getPointer());
|
||||
System.out.println("BROADCAST_HANDLE: " + action);
|
||||
break;
|
||||
}
|
||||
case DBT.DBT_DEVTYP_OEM: {
|
||||
// see http://msdn.microsoft.com/en-us/library/windows/desktop/aa363247.aspx
|
||||
DEV_BROADCAST_OEM boem = new DEV_BROADCAST_OEM(bhdr.getPointer());
|
||||
System.out.println("BROADCAST_OEM: " + action);
|
||||
break;
|
||||
}
|
||||
case DBT.DBT_DEVTYP_PORT: {
|
||||
// see http://msdn.microsoft.com/en-us/library/windows/desktop/aa363248.aspx
|
||||
DEV_BROADCAST_PORT bpt = new DEV_BROADCAST_PORT(bhdr.getPointer());
|
||||
System.out.println("BROADCAST_PORT: " + action);
|
||||
break;
|
||||
}
|
||||
case DBT.DBT_DEVTYP_VOLUME: {
|
||||
// see http://msdn.microsoft.com/en-us/library/windows/desktop/aa363249.aspx
|
||||
DEV_BROADCAST_VOLUME bvl = new DEV_BROADCAST_VOLUME(bhdr.getPointer());
|
||||
int logicalDriveAffected = bvl.dbcv_unitmask;
|
||||
short flag = bvl.dbcv_flags;
|
||||
boolean isMediaNotPhysical = 0 != (flag & DBT.DBTF_MEDIA/*value is 1*/);
|
||||
boolean isNet = 0 != (flag & DBT.DBTF_NET/*value is 2*/);
|
||||
System.out.println(action);
|
||||
int driveLetterIndex = 0;
|
||||
while (logicalDriveAffected != 0) {
|
||||
if (0 != (logicalDriveAffected & 1)) {
|
||||
System.out.println("Logical Drive Letter: " +
|
||||
((char) ('A' + driveLetterIndex)));
|
||||
}
|
||||
logicalDriveAffected >>>= 1;
|
||||
driveLetterIndex++;
|
||||
}
|
||||
System.out.println("isMediaNotPhysical:"+isMediaNotPhysical);
|
||||
System.out.println("isNet:"+isNet);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
// return TRUE means processed message for this wParam.
|
||||
// see http://msdn.microsoft.com/en-us/library/windows/desktop/aa363205.aspx
|
||||
// see http://msdn.microsoft.com/en-us/library/windows/desktop/aa363208.aspx
|
||||
return new LRESULT(1);
|
||||
}
|
||||
|
||||
protected LRESULT onDeviceChangeArrival(LPARAM lParam) {
|
||||
return onDeviceChangeArrivalOrRemoveComplete(lParam, "Arrival");
|
||||
}
|
||||
|
||||
protected LRESULT onDeviceChangeRemoveComplete(LPARAM lParam) {
|
||||
return onDeviceChangeArrivalOrRemoveComplete(lParam, "Remove Complete");
|
||||
}
|
||||
|
||||
protected LRESULT onDeviceChangeNodesChanged() {
|
||||
System.out.println("Message DBT_DEVNODES_CHANGED");
|
||||
// return TRUE means processed message for this wParam.
|
||||
// see http://msdn.microsoft.com/en-us/library/windows/desktop/aa363211.aspx
|
||||
return new LRESULT(1);
|
||||
}
|
||||
|
||||
/**
|
||||
* On create.
|
||||
*
|
||||
* @param wParam
|
||||
* the w param
|
||||
* @param lParam
|
||||
* the l param
|
||||
*/
|
||||
protected void onCreate(WPARAM wParam, LPARAM lParam) {
|
||||
System.out.println("onCreate: WM_CREATE");
|
||||
}
|
||||
|
||||
/**
|
||||
* The main method.
|
||||
*
|
||||
* @param args
|
||||
* the arguments
|
||||
*/
|
||||
public static void main(String[] args) {
|
||||
new Win32WindowDemo();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<classpath>
|
||||
<classpathentry kind="src" path="src"/>
|
||||
<classpathentry kind="src" output="build.eclipse/contrib-test-classes" path="test"/>
|
||||
<classpathentry exported="true" kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
|
||||
<classpathentry combineaccessrules="false" kind="src" path="/jnalib"/>
|
||||
<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/3"/>
|
||||
<classpathentry kind="lib" path="/jnalib/dist/jna.jar"/>
|
||||
<classpathentry kind="output" path="bin"/>
|
||||
</classpath>
|
||||
@@ -0,0 +1,17 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<projectDescription>
|
||||
<name>ntservice</name>
|
||||
<comment></comment>
|
||||
<projects>
|
||||
</projects>
|
||||
<buildSpec>
|
||||
<buildCommand>
|
||||
<name>org.eclipse.jdt.core.javabuilder</name>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
</buildSpec>
|
||||
<natures>
|
||||
<nature>org.eclipse.jdt.core.javanature</nature>
|
||||
</natures>
|
||||
</projectDescription>
|
||||
@@ -0,0 +1,60 @@
|
||||
Copyright (c) 2007 Thomas Boerkel, All Rights Reserved
|
||||
|
||||
Disclaimer:
|
||||
===========
|
||||
This code 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 code 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.
|
||||
|
||||
|
||||
Description:
|
||||
============
|
||||
|
||||
Accounts.java:
|
||||
--------------
|
||||
Static methods for getting information about Win32 accounts (users
|
||||
and groups).
|
||||
- list all domain users
|
||||
- list all domain groups
|
||||
- list all local or domain groups where a user belongs to
|
||||
- get account by SID
|
||||
- get SID of account
|
||||
- get domain controller name
|
||||
- get domain name
|
||||
|
||||
Registry.java:
|
||||
--------------
|
||||
Static methods for reading and manipulating the Windows Registry.
|
||||
Only String and DWORD values supported, but could be easily
|
||||
extended.
|
||||
- create key
|
||||
- delete key
|
||||
- delete value
|
||||
- read value
|
||||
- get all sub keys of a key
|
||||
- get all values of a key
|
||||
- set value
|
||||
- check existence of value
|
||||
|
||||
Win32Service.java:
|
||||
------------------
|
||||
Abstract class to wrap a Win32 service. Derive from this class
|
||||
to build your own service. Supports only one type of service and
|
||||
startup, but could be easily extended.
|
||||
- install service
|
||||
- uninstall service
|
||||
- start service
|
||||
- stop service
|
||||
- callback for service start request (onStart), should spawn a thread
|
||||
- callback for service stop request (onStop)
|
||||
|
||||
TestService.java:
|
||||
-----------------
|
||||
Very simple example of an implementation of Win32Service.java.
|
||||
Does nothing but starting and stopping (no "useful" work).
|
||||
@@ -0,0 +1,69 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- You may freely edit this file. See commented blocks below for -->
|
||||
<!-- some examples of how to customize the build. -->
|
||||
<!-- (If you delete it and reopen the project it will be recreated.) -->
|
||||
<project name="JnaContrib" default="default" basedir=".">
|
||||
<description>Builds, tests, and runs the project JnaContrib.</description>
|
||||
<import file="nbproject/build-impl.xml"/>
|
||||
<!--
|
||||
|
||||
There exist several targets which are by default empty and which can be
|
||||
used for execution of your tasks. These targets are usually executed
|
||||
before and after some main targets. They are:
|
||||
|
||||
-pre-init: called before initialization of project properties
|
||||
-post-init: called after initialization of project properties
|
||||
-pre-compile: called before javac compilation
|
||||
-post-compile: called after javac compilation
|
||||
-pre-compile-single: called before javac compilation of single file
|
||||
-post-compile-single: called after javac compilation of single file
|
||||
-pre-compile-test: called before javac compilation of JUnit tests
|
||||
-post-compile-test: called after javac compilation of JUnit tests
|
||||
-pre-compile-test-single: called before javac compilation of single JUnit test
|
||||
-post-compile-test-single: called after javac compilation of single JUunit test
|
||||
-pre-jar: called before JAR building
|
||||
-post-jar: called after JAR building
|
||||
-post-clean: called after cleaning build products
|
||||
|
||||
(Targets beginning with '-' are not intended to be called on their own.)
|
||||
|
||||
Example of inserting an obfuscator after compilation could look like this:
|
||||
|
||||
<target name="-post-compile">
|
||||
<obfuscate>
|
||||
<fileset dir="${build.classes.dir}"/>
|
||||
</obfuscate>
|
||||
</target>
|
||||
|
||||
For list of available properties check the imported
|
||||
nbproject/build-impl.xml file.
|
||||
|
||||
|
||||
Another way to customize the build is by overriding existing main targets.
|
||||
The targets of interest are:
|
||||
|
||||
-init-macrodef-javac: defines macro for javac compilation
|
||||
-init-macrodef-junit: defines macro for junit execution
|
||||
-init-macrodef-debug: defines macro for class debugging
|
||||
-init-macrodef-java: defines macro for class execution
|
||||
-do-jar-with-manifest: JAR building (if you are using a manifest)
|
||||
-do-jar-without-manifest: JAR building (if you are not using a manifest)
|
||||
run: execution of project
|
||||
-javadoc-build: Javadoc generation
|
||||
test-report: JUnit report generation
|
||||
|
||||
An example of overriding the target for project execution could look like this:
|
||||
|
||||
<target name="run" depends="JnaContrib-impl.jar">
|
||||
<exec dir="bin" executable="launcher.exe">
|
||||
<arg file="${dist.jar}"/>
|
||||
</exec>
|
||||
</target>
|
||||
|
||||
Notice that the overridden target depends on the jar target and not only on
|
||||
the compile target as the regular run target does. Again, for a list of available
|
||||
properties which you can use, check the target you are overriding in the
|
||||
nbproject/build-impl.xml file.
|
||||
|
||||
-->
|
||||
</project>
|
||||
@@ -0,0 +1,3 @@
|
||||
Manifest-Version: 1.0
|
||||
X-COMMENT: Main-Class will be added automatically by build
|
||||
|
||||
@@ -0,0 +1,541 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
*** GENERATED FROM project.xml - DO NOT EDIT ***
|
||||
*** EDIT ../build.xml INSTEAD ***
|
||||
|
||||
For the purpose of easier reading the script
|
||||
is divided into following sections:
|
||||
|
||||
- initialization
|
||||
- compilation
|
||||
- jar
|
||||
- execution
|
||||
- debugging
|
||||
- javadoc
|
||||
- junit compilation
|
||||
- junit execution
|
||||
- junit debugging
|
||||
- applet
|
||||
- cleanup
|
||||
|
||||
-->
|
||||
<project name="ntservice-impl" default="default" basedir=".." xmlns:j2seproject3="http://www.netbeans.org/ns/j2se-project/3" xmlns:j2seproject2="http://www.netbeans.org/ns/j2se-project/2" xmlns:j2seproject1="http://www.netbeans.org/ns/j2se-project/1" xmlns:jaxws="http://www.netbeans.org/ns/jax-ws/1">
|
||||
<target name="default" depends="test,jar,javadoc" description="Build and test whole project."/>
|
||||
<!--
|
||||
======================
|
||||
INITIALIZATION SECTION
|
||||
======================
|
||||
-->
|
||||
<target name="-pre-init">
|
||||
<!-- Empty placeholder for easier customization. -->
|
||||
<!-- You can override this target in the ../build.xml file. -->
|
||||
</target>
|
||||
<target name="-init-private" depends="-pre-init">
|
||||
<property file="nbproject/private/private.properties"/>
|
||||
</target>
|
||||
<target name="-init-user" depends="-pre-init,-init-private">
|
||||
<property file="${user.properties.file}"/>
|
||||
<!-- The two properties below are usually overridden -->
|
||||
<!-- by the active platform. Just a fallback. -->
|
||||
<property name="default.javac.source" value="1.4"/>
|
||||
<property name="default.javac.target" value="1.4"/>
|
||||
</target>
|
||||
<target name="-init-project" depends="-pre-init,-init-private,-init-user">
|
||||
<property file="nbproject/project.properties"/>
|
||||
</target>
|
||||
<target name="-do-init" depends="-pre-init,-init-private,-init-user,-init-project,-init-macrodef-property">
|
||||
<available file="${manifest.file}" property="manifest.available"/>
|
||||
<condition property="manifest.available+main.class">
|
||||
<and>
|
||||
<isset property="manifest.available"/>
|
||||
<isset property="main.class"/>
|
||||
<not>
|
||||
<equals arg1="${main.class}" arg2="" trim="true"/>
|
||||
</not>
|
||||
</and>
|
||||
</condition>
|
||||
<condition property="manifest.available+main.class+mkdist.available">
|
||||
<and>
|
||||
<istrue value="${manifest.available+main.class}"/>
|
||||
<isset property="libs.CopyLibs.classpath"/>
|
||||
</and>
|
||||
</condition>
|
||||
<condition property="have.tests">
|
||||
<or>
|
||||
<available file="${test.src.dir}"/>
|
||||
</or>
|
||||
</condition>
|
||||
<condition property="have.sources">
|
||||
<or>
|
||||
<available file="${src.dir}"/>
|
||||
</or>
|
||||
</condition>
|
||||
<condition property="netbeans.home+have.tests">
|
||||
<and>
|
||||
<isset property="netbeans.home"/>
|
||||
<isset property="have.tests"/>
|
||||
</and>
|
||||
</condition>
|
||||
<condition property="no.javadoc.preview">
|
||||
<isfalse value="${javadoc.preview}"/>
|
||||
</condition>
|
||||
<property name="run.jvmargs" value=""/>
|
||||
<property name="javac.compilerargs" value=""/>
|
||||
<property name="work.dir" value="${basedir}"/>
|
||||
<condition property="no.deps">
|
||||
<and>
|
||||
<istrue value="${no.dependencies}"/>
|
||||
</and>
|
||||
</condition>
|
||||
<property name="javac.debug" value="true"/>
|
||||
<property name="javadoc.preview" value="true"/>
|
||||
</target>
|
||||
<target name="-post-init">
|
||||
<!-- Empty placeholder for easier customization. -->
|
||||
<!-- You can override this target in the ../build.xml file. -->
|
||||
</target>
|
||||
<target name="-init-check" depends="-pre-init,-init-private,-init-user,-init-project,-do-init">
|
||||
<fail unless="src.dir">Must set src.dir</fail>
|
||||
<fail unless="test.src.dir">Must set test.src.dir</fail>
|
||||
<fail unless="build.dir">Must set build.dir</fail>
|
||||
<fail unless="dist.dir">Must set dist.dir</fail>
|
||||
<fail unless="build.classes.dir">Must set build.classes.dir</fail>
|
||||
<fail unless="dist.javadoc.dir">Must set dist.javadoc.dir</fail>
|
||||
<fail unless="build.test.classes.dir">Must set build.test.classes.dir</fail>
|
||||
<fail unless="build.test.results.dir">Must set build.test.results.dir</fail>
|
||||
<fail unless="build.classes.excludes">Must set build.classes.excludes</fail>
|
||||
<fail unless="dist.jar">Must set dist.jar</fail>
|
||||
</target>
|
||||
<target name="-init-macrodef-property">
|
||||
<macrodef name="property" uri="http://www.netbeans.org/ns/j2se-project/1">
|
||||
<attribute name="name"/>
|
||||
<attribute name="value"/>
|
||||
<sequential>
|
||||
<property name="@{name}" value="${@{value}}"/>
|
||||
</sequential>
|
||||
</macrodef>
|
||||
</target>
|
||||
<target name="-init-macrodef-javac">
|
||||
<macrodef name="javac" uri="http://www.netbeans.org/ns/j2se-project/3">
|
||||
<attribute name="srcdir" default="${src.dir}"/>
|
||||
<attribute name="destdir" default="${build.classes.dir}"/>
|
||||
<attribute name="classpath" default="${javac.classpath}"/>
|
||||
<attribute name="debug" default="${javac.debug}"/>
|
||||
<element name="customize" optional="true"/>
|
||||
<sequential>
|
||||
<javac srcdir="@{srcdir}" destdir="@{destdir}" debug="@{debug}" deprecation="${javac.deprecation}" source="${javac.source}" target="${javac.target}" includeantruntime="false">
|
||||
<classpath>
|
||||
<path path="@{classpath}"/>
|
||||
</classpath>
|
||||
<compilerarg line="${javac.compilerargs}"/>
|
||||
<customize/>
|
||||
</javac>
|
||||
</sequential>
|
||||
</macrodef>
|
||||
</target>
|
||||
<target name="-init-macrodef-junit">
|
||||
<macrodef name="junit" uri="http://www.netbeans.org/ns/j2se-project/3">
|
||||
<attribute name="includes" default="**/*Test.java"/>
|
||||
<sequential>
|
||||
<junit showoutput="true" fork="true" dir="${basedir}" failureproperty="tests.failed" errorproperty="tests.failed">
|
||||
<batchtest todir="${build.test.results.dir}">
|
||||
<fileset dir="${test.src.dir}" includes="@{includes}"/>
|
||||
</batchtest>
|
||||
<classpath>
|
||||
<path path="${run.test.classpath}"/>
|
||||
</classpath>
|
||||
<syspropertyset>
|
||||
<propertyref prefix="test-sys-prop."/>
|
||||
<mapper type="glob" from="test-sys-prop.*" to="*"/>
|
||||
</syspropertyset>
|
||||
<formatter type="brief" usefile="false"/>
|
||||
<formatter type="xml"/>
|
||||
<jvmarg line="${run.jvmargs}"/>
|
||||
</junit>
|
||||
</sequential>
|
||||
</macrodef>
|
||||
</target>
|
||||
<target name="-init-macrodef-nbjpda">
|
||||
<macrodef name="nbjpdastart" uri="http://www.netbeans.org/ns/j2se-project/1">
|
||||
<attribute name="name" default="${main.class}"/>
|
||||
<attribute name="classpath" default="${debug.classpath}"/>
|
||||
<attribute name="stopclassname" default=""/>
|
||||
<sequential>
|
||||
<nbjpdastart transport="dt_socket" addressproperty="jpda.address" name="@{name}" stopclassname="@{stopclassname}">
|
||||
<classpath>
|
||||
<path path="@{classpath}"/>
|
||||
</classpath>
|
||||
</nbjpdastart>
|
||||
</sequential>
|
||||
</macrodef>
|
||||
<macrodef name="nbjpdareload" uri="http://www.netbeans.org/ns/j2se-project/1">
|
||||
<attribute name="dir" default="${build.classes.dir}"/>
|
||||
<sequential>
|
||||
<nbjpdareload>
|
||||
<fileset includes="${fix.includes}*.class" dir="@{dir}"/>
|
||||
</nbjpdareload>
|
||||
</sequential>
|
||||
</macrodef>
|
||||
</target>
|
||||
<target name="-init-macrodef-debug">
|
||||
<macrodef name="debug" uri="http://www.netbeans.org/ns/j2se-project/3">
|
||||
<attribute name="classname" default="${main.class}"/>
|
||||
<attribute name="classpath" default="${debug.classpath}"/>
|
||||
<element name="customize" optional="true"/>
|
||||
<sequential>
|
||||
<java fork="true" classname="@{classname}" dir="${work.dir}">
|
||||
<jvmarg value="-Xdebug"/>
|
||||
<jvmarg value="-Xnoagent"/>
|
||||
<jvmarg value="-Djava.compiler=none"/>
|
||||
<jvmarg value="-Xrunjdwp:transport=dt_socket,address=${jpda.address}"/>
|
||||
<jvmarg line="${run.jvmargs}"/>
|
||||
<classpath>
|
||||
<path path="@{classpath}"/>
|
||||
</classpath>
|
||||
<syspropertyset>
|
||||
<propertyref prefix="run-sys-prop."/>
|
||||
<mapper type="glob" from="run-sys-prop.*" to="*"/>
|
||||
</syspropertyset>
|
||||
<customize/>
|
||||
</java>
|
||||
</sequential>
|
||||
</macrodef>
|
||||
</target>
|
||||
<target name="-init-macrodef-java">
|
||||
<macrodef name="java" uri="http://www.netbeans.org/ns/j2se-project/1">
|
||||
<attribute name="classname" default="${main.class}"/>
|
||||
<element name="customize" optional="true"/>
|
||||
<sequential>
|
||||
<java fork="true" classname="@{classname}" dir="${work.dir}">
|
||||
<jvmarg line="${run.jvmargs}"/>
|
||||
<classpath>
|
||||
<path path="${run.classpath}"/>
|
||||
</classpath>
|
||||
<syspropertyset>
|
||||
<propertyref prefix="run-sys-prop."/>
|
||||
<mapper type="glob" from="run-sys-prop.*" to="*"/>
|
||||
</syspropertyset>
|
||||
<customize/>
|
||||
</java>
|
||||
</sequential>
|
||||
</macrodef>
|
||||
</target>
|
||||
<target name="-init-presetdef-jar">
|
||||
<presetdef name="jar" uri="http://www.netbeans.org/ns/j2se-project/1">
|
||||
<jar jarfile="${dist.jar}" compress="${jar.compress}">
|
||||
<j2seproject1:fileset dir="${build.classes.dir}"/>
|
||||
</jar>
|
||||
</presetdef>
|
||||
</target>
|
||||
<target name="init" depends="-pre-init,-init-private,-init-user,-init-project,-do-init,-post-init,-init-check,-init-macrodef-property,-init-macrodef-javac,-init-macrodef-junit,-init-macrodef-nbjpda,-init-macrodef-debug,-init-macrodef-java,-init-presetdef-jar"/>
|
||||
<!--
|
||||
===================
|
||||
COMPILATION SECTION
|
||||
===================
|
||||
-->
|
||||
<target name="deps-jar" depends="init" unless="no.deps"/>
|
||||
<target name="-pre-pre-compile" depends="init,deps-jar">
|
||||
<mkdir dir="${build.classes.dir}"/>
|
||||
</target>
|
||||
<target name="-pre-compile">
|
||||
<!-- Empty placeholder for easier customization. -->
|
||||
<!-- You can override this target in the ../build.xml file. -->
|
||||
</target>
|
||||
<target name="-do-compile" depends="init,deps-jar,-pre-pre-compile,-pre-compile" if="have.sources">
|
||||
<j2seproject3:javac/>
|
||||
<copy todir="${build.classes.dir}">
|
||||
<fileset dir="${src.dir}" excludes="${build.classes.excludes}"/>
|
||||
</copy>
|
||||
</target>
|
||||
<target name="-post-compile">
|
||||
<!-- Empty placeholder for easier customization. -->
|
||||
<!-- You can override this target in the ../build.xml file. -->
|
||||
</target>
|
||||
<target name="compile" depends="init,deps-jar,-pre-pre-compile,-pre-compile,-do-compile,-post-compile" description="Compile project."/>
|
||||
<target name="-pre-compile-single">
|
||||
<!-- Empty placeholder for easier customization. -->
|
||||
<!-- You can override this target in the ../build.xml file. -->
|
||||
</target>
|
||||
<target name="-do-compile-single" depends="init,deps-jar,-pre-pre-compile">
|
||||
<fail unless="javac.includes">Must select some files in the IDE or set javac.includes</fail>
|
||||
<j2seproject3:javac>
|
||||
<customize>
|
||||
<patternset includes="${javac.includes}"/>
|
||||
</customize>
|
||||
</j2seproject3:javac>
|
||||
</target>
|
||||
<target name="-post-compile-single">
|
||||
<!-- Empty placeholder for easier customization. -->
|
||||
<!-- You can override this target in the ../build.xml file. -->
|
||||
</target>
|
||||
<target name="compile-single" depends="init,deps-jar,-pre-pre-compile,-pre-compile-single,-do-compile-single,-post-compile-single"/>
|
||||
<!--
|
||||
====================
|
||||
JAR BUILDING SECTION
|
||||
====================
|
||||
-->
|
||||
<target name="-pre-pre-jar" depends="init">
|
||||
<dirname property="dist.jar.dir" file="${dist.jar}"/>
|
||||
<mkdir dir="${dist.jar.dir}"/>
|
||||
</target>
|
||||
<target name="-pre-jar">
|
||||
<!-- Empty placeholder for easier customization. -->
|
||||
<!-- You can override this target in the ../build.xml file. -->
|
||||
</target>
|
||||
<target name="-do-jar-without-manifest" depends="init,compile,-pre-pre-jar,-pre-jar" unless="manifest.available">
|
||||
<j2seproject1:jar/>
|
||||
</target>
|
||||
<target name="-do-jar-with-manifest" depends="init,compile,-pre-pre-jar,-pre-jar" if="manifest.available" unless="manifest.available+main.class">
|
||||
<j2seproject1:jar manifest="${manifest.file}"/>
|
||||
</target>
|
||||
<target name="-do-jar-with-mainclass" depends="init,compile,-pre-pre-jar,-pre-jar" if="manifest.available+main.class" unless="manifest.available+main.class+mkdist.available">
|
||||
<j2seproject1:jar manifest="${manifest.file}">
|
||||
<j2seproject1:manifest>
|
||||
<j2seproject1:attribute name="Main-Class" value="${main.class}"/>
|
||||
</j2seproject1:manifest>
|
||||
</j2seproject1:jar>
|
||||
<echo>To run this application from the command line without Ant, try:</echo>
|
||||
<property name="build.classes.dir.resolved" location="${build.classes.dir}"/>
|
||||
<property name="dist.jar.resolved" location="${dist.jar}"/>
|
||||
<pathconvert property="run.classpath.with.dist.jar">
|
||||
<path path="${run.classpath}"/>
|
||||
<map from="${build.classes.dir.resolved}" to="${dist.jar.resolved}"/>
|
||||
</pathconvert>
|
||||
<echo>java -cp "${run.classpath.with.dist.jar}" ${main.class}</echo>
|
||||
</target>
|
||||
<target name="-do-jar-with-libraries" depends="init,compile,-pre-pre-jar,-pre-jar" if="manifest.available+main.class+mkdist.available">
|
||||
<property name="build.classes.dir.resolved" location="${build.classes.dir}"/>
|
||||
<pathconvert property="run.classpath.without.build.classes.dir">
|
||||
<path path="${run.classpath}"/>
|
||||
<map from="${build.classes.dir.resolved}" to=""/>
|
||||
</pathconvert>
|
||||
<pathconvert property="jar.classpath" pathsep=" ">
|
||||
<path path="${run.classpath.without.build.classes.dir}"/>
|
||||
<chainedmapper>
|
||||
<flattenmapper/>
|
||||
<globmapper from="*" to="lib/*"/>
|
||||
</chainedmapper>
|
||||
</pathconvert>
|
||||
<taskdef classname="org.netbeans.modules.java.j2seproject.copylibstask.CopyLibs" name="copylibs" classpath="${libs.CopyLibs.classpath}"/>
|
||||
<copylibs manifest="${manifest.file}" runtimeclasspath="${run.classpath.without.build.classes.dir}" jarfile="${dist.jar}" compress="${jar.compress}">
|
||||
<fileset dir="${build.classes.dir}"/>
|
||||
<manifest>
|
||||
<attribute name="Main-Class" value="${main.class}"/>
|
||||
<attribute name="Class-Path" value="${jar.classpath}"/>
|
||||
</manifest>
|
||||
</copylibs>
|
||||
<echo>To run this application from the command line without Ant, try:</echo>
|
||||
<property name="dist.jar.resolved" location="${dist.jar}"/>
|
||||
<echo>java -jar "${dist.jar.resolved}"</echo>
|
||||
</target>
|
||||
<target name="-post-jar">
|
||||
<!-- Empty placeholder for easier customization. -->
|
||||
<!-- You can override this target in the ../build.xml file. -->
|
||||
</target>
|
||||
<target name="jar" depends="init,compile,-pre-jar,-do-jar-with-manifest,-do-jar-without-manifest,-do-jar-with-mainclass,-do-jar-with-libraries,-post-jar" description="Build JAR."/>
|
||||
<!--
|
||||
=================
|
||||
EXECUTION SECTION
|
||||
=================
|
||||
-->
|
||||
<target name="run" depends="init,compile" description="Run a main class.">
|
||||
<j2seproject1:java>
|
||||
<customize>
|
||||
<arg line="${application.args}"/>
|
||||
</customize>
|
||||
</j2seproject1:java>
|
||||
</target>
|
||||
<target name="run-single" depends="init,compile-single">
|
||||
<fail unless="run.class">Must select one file in the IDE or set run.class</fail>
|
||||
<j2seproject1:java classname="${run.class}"/>
|
||||
</target>
|
||||
<!--
|
||||
=================
|
||||
DEBUGGING SECTION
|
||||
=================
|
||||
-->
|
||||
<target name="-debug-start-debugger" if="netbeans.home" depends="init">
|
||||
<j2seproject1:nbjpdastart name="${debug.class}"/>
|
||||
</target>
|
||||
<target name="-debug-start-debuggee" depends="init,compile">
|
||||
<j2seproject3:debug>
|
||||
<customize>
|
||||
<arg line="${application.args}"/>
|
||||
</customize>
|
||||
</j2seproject3:debug>
|
||||
</target>
|
||||
<target name="debug" if="netbeans.home" depends="init,compile,-debug-start-debugger,-debug-start-debuggee" description="Debug project in IDE."/>
|
||||
<target name="-debug-start-debugger-stepinto" if="netbeans.home" depends="init">
|
||||
<j2seproject1:nbjpdastart stopclassname="${main.class}"/>
|
||||
</target>
|
||||
<target name="debug-stepinto" if="netbeans.home" depends="init,compile,-debug-start-debugger-stepinto,-debug-start-debuggee"/>
|
||||
<target name="-debug-start-debuggee-single" if="netbeans.home" depends="init,compile-single">
|
||||
<fail unless="debug.class">Must select one file in the IDE or set debug.class</fail>
|
||||
<j2seproject3:debug classname="${debug.class}"/>
|
||||
</target>
|
||||
<target name="debug-single" if="netbeans.home" depends="init,compile-single,-debug-start-debugger,-debug-start-debuggee-single"/>
|
||||
<target name="-pre-debug-fix" depends="init">
|
||||
<fail unless="fix.includes">Must set fix.includes</fail>
|
||||
<property name="javac.includes" value="${fix.includes}.java"/>
|
||||
</target>
|
||||
<target name="-do-debug-fix" if="netbeans.home" depends="init,-pre-debug-fix,compile-single">
|
||||
<j2seproject1:nbjpdareload/>
|
||||
</target>
|
||||
<target name="debug-fix" if="netbeans.home" depends="init,-pre-debug-fix,-do-debug-fix"/>
|
||||
<!--
|
||||
===============
|
||||
JAVADOC SECTION
|
||||
===============
|
||||
-->
|
||||
<target name="-javadoc-build" depends="init">
|
||||
<mkdir dir="${dist.javadoc.dir}"/>
|
||||
<javadoc destdir="${dist.javadoc.dir}" source="${javac.source}" notree="${javadoc.notree}" use="${javadoc.use}" nonavbar="${javadoc.nonavbar}" noindex="${javadoc.noindex}" splitindex="${javadoc.splitindex}" author="${javadoc.author}" version="${javadoc.version}" windowtitle="${javadoc.windowtitle}" private="${javadoc.private}" additionalparam="${javadoc.additionalparam}" failonerror="true" useexternalfile="true">
|
||||
<classpath>
|
||||
<path path="${javac.classpath}"/>
|
||||
</classpath>
|
||||
<sourcepath>
|
||||
<pathelement location="${src.dir}"/>
|
||||
</sourcepath>
|
||||
<packageset dir="${src.dir}" includes="*/**"/>
|
||||
<fileset dir="${src.dir}" includes="*.java"/>
|
||||
</javadoc>
|
||||
</target>
|
||||
<target name="-javadoc-browse" if="netbeans.home" unless="no.javadoc.preview" depends="init,-javadoc-build">
|
||||
<nbbrowse file="${dist.javadoc.dir}/index.html"/>
|
||||
</target>
|
||||
<target name="javadoc" depends="init,-javadoc-build,-javadoc-browse" description="Build Javadoc."/>
|
||||
<!--
|
||||
=========================
|
||||
JUNIT COMPILATION SECTION
|
||||
=========================
|
||||
-->
|
||||
<target name="-pre-pre-compile-test" if="have.tests" depends="init,compile">
|
||||
<mkdir dir="${build.test.classes.dir}"/>
|
||||
</target>
|
||||
<target name="-pre-compile-test">
|
||||
<!-- Empty placeholder for easier customization. -->
|
||||
<!-- You can override this target in the ../build.xml file. -->
|
||||
</target>
|
||||
<target name="-do-compile-test" if="have.tests" depends="init,compile,-pre-pre-compile-test,-pre-compile-test">
|
||||
<j2seproject3:javac srcdir="${test.src.dir}" destdir="${build.test.classes.dir}" debug="true" classpath="${javac.test.classpath}"/>
|
||||
<copy todir="${build.test.classes.dir}">
|
||||
<fileset dir="${test.src.dir}" excludes="**/*.java"/>
|
||||
</copy>
|
||||
</target>
|
||||
<target name="-post-compile-test">
|
||||
<!-- Empty placeholder for easier customization. -->
|
||||
<!-- You can override this target in the ../build.xml file. -->
|
||||
</target>
|
||||
<target name="compile-test" depends="init,compile,-pre-pre-compile-test,-pre-compile-test,-do-compile-test,-post-compile-test"/>
|
||||
<target name="-pre-compile-test-single">
|
||||
<!-- Empty placeholder for easier customization. -->
|
||||
<!-- You can override this target in the ../build.xml file. -->
|
||||
</target>
|
||||
<target name="-do-compile-test-single" if="have.tests" depends="init,compile,-pre-pre-compile-test,-pre-compile-test-single">
|
||||
<fail unless="javac.includes">Must select some files in the IDE or set javac.includes</fail>
|
||||
<j2seproject3:javac srcdir="${test.src.dir}" destdir="${build.test.classes.dir}" debug="true" classpath="${javac.test.classpath}">
|
||||
<customize>
|
||||
<patternset includes="${javac.includes}"/>
|
||||
</customize>
|
||||
</j2seproject3:javac>
|
||||
<copy todir="${build.test.classes.dir}">
|
||||
<fileset dir="${test.src.dir}" excludes="**/*.java"/>
|
||||
</copy>
|
||||
</target>
|
||||
<target name="-post-compile-test-single">
|
||||
<!-- Empty placeholder for easier customization. -->
|
||||
<!-- You can override this target in the ../build.xml file. -->
|
||||
</target>
|
||||
<target name="compile-test-single" depends="init,compile,-pre-pre-compile-test,-pre-compile-test-single,-do-compile-test-single,-post-compile-test-single"/>
|
||||
<!--
|
||||
=======================
|
||||
JUNIT EXECUTION SECTION
|
||||
=======================
|
||||
-->
|
||||
<target name="-pre-test-run" if="have.tests" depends="init">
|
||||
<mkdir dir="${build.test.results.dir}"/>
|
||||
</target>
|
||||
<target name="-do-test-run" if="have.tests" depends="init,compile-test,-pre-test-run">
|
||||
<j2seproject3:junit/>
|
||||
</target>
|
||||
<target name="-post-test-run" if="have.tests" depends="init,compile-test,-pre-test-run,-do-test-run">
|
||||
<fail if="tests.failed">Some tests failed; see details above.</fail>
|
||||
</target>
|
||||
<target name="test-report" if="have.tests" depends="init"/>
|
||||
<target name="-test-browse" if="netbeans.home+have.tests" depends="init"/>
|
||||
<target name="test" depends="init,compile-test,-pre-test-run,-do-test-run,test-report,-post-test-run,-test-browse" description="Run unit tests."/>
|
||||
<target name="-pre-test-run-single" if="have.tests" depends="init">
|
||||
<mkdir dir="${build.test.results.dir}"/>
|
||||
</target>
|
||||
<target name="-do-test-run-single" if="have.tests" depends="init,compile-test-single,-pre-test-run-single">
|
||||
<fail unless="test.includes">Must select some files in the IDE or set test.includes</fail>
|
||||
<j2seproject3:junit includes="${test.includes}"/>
|
||||
</target>
|
||||
<target name="-post-test-run-single" if="have.tests" depends="init,compile-test-single,-pre-test-run-single,-do-test-run-single">
|
||||
<fail if="tests.failed">Some tests failed; see details above.</fail>
|
||||
</target>
|
||||
<target name="test-single" depends="init,compile-test-single,-pre-test-run-single,-do-test-run-single,-post-test-run-single" description="Run single unit test."/>
|
||||
<!--
|
||||
=======================
|
||||
JUNIT DEBUGGING SECTION
|
||||
=======================
|
||||
-->
|
||||
<target name="-debug-start-debuggee-test" if="have.tests" depends="init,compile-test">
|
||||
<fail unless="test.class">Must select one file in the IDE or set test.class</fail>
|
||||
<j2seproject3:debug classname="junit.textui.TestRunner" classpath="${debug.test.classpath}">
|
||||
<customize>
|
||||
<arg line="${test.class}"/>
|
||||
</customize>
|
||||
</j2seproject3:debug>
|
||||
</target>
|
||||
<target name="-debug-start-debugger-test" if="netbeans.home+have.tests" depends="init,compile-test">
|
||||
<j2seproject1:nbjpdastart name="${test.class}" classpath="${debug.test.classpath}"/>
|
||||
</target>
|
||||
<target name="debug-test" depends="init,compile-test,-debug-start-debugger-test,-debug-start-debuggee-test"/>
|
||||
<target name="-do-debug-fix-test" if="netbeans.home" depends="init,-pre-debug-fix,compile-test-single">
|
||||
<j2seproject1:nbjpdareload dir="${build.test.classes.dir}"/>
|
||||
</target>
|
||||
<target name="debug-fix-test" if="netbeans.home" depends="init,-pre-debug-fix,-do-debug-fix-test"/>
|
||||
<!--
|
||||
=========================
|
||||
APPLET EXECUTION SECTION
|
||||
=========================
|
||||
-->
|
||||
<target name="run-applet" depends="init,compile-single">
|
||||
<fail unless="applet.url">Must select one file in the IDE or set applet.url</fail>
|
||||
<j2seproject1:java classname="sun.applet.AppletViewer">
|
||||
<customize>
|
||||
<arg value="${applet.url}"/>
|
||||
</customize>
|
||||
</j2seproject1:java>
|
||||
</target>
|
||||
<!--
|
||||
=========================
|
||||
APPLET DEBUGGING SECTION
|
||||
=========================
|
||||
-->
|
||||
<target name="-debug-start-debuggee-applet" if="netbeans.home" depends="init,compile-single">
|
||||
<fail unless="applet.url">Must select one file in the IDE or set applet.url</fail>
|
||||
<j2seproject3:debug classname="sun.applet.AppletViewer">
|
||||
<customize>
|
||||
<arg value="${applet.url}"/>
|
||||
</customize>
|
||||
</j2seproject3:debug>
|
||||
</target>
|
||||
<target name="debug-applet" if="netbeans.home" depends="init,compile-single,-debug-start-debugger,-debug-start-debuggee-applet"/>
|
||||
<!--
|
||||
===============
|
||||
CLEANUP SECTION
|
||||
===============
|
||||
-->
|
||||
<target name="deps-clean" depends="init" unless="no.deps"/>
|
||||
<target name="-do-clean" depends="init">
|
||||
<delete dir="${build.dir}"/>
|
||||
<delete dir="${dist.dir}"/>
|
||||
</target>
|
||||
<target name="-post-clean">
|
||||
<!-- Empty placeholder for easier customization. -->
|
||||
<!-- You can override this target in the ../build.xml file. -->
|
||||
</target>
|
||||
<target name="clean" depends="init,deps-clean,-do-clean,-post-clean" description="Clean build products."/>
|
||||
</project>
|
||||
@@ -0,0 +1,8 @@
|
||||
build.xml.data.CRC32=94714fd7
|
||||
build.xml.script.CRC32=64128189
|
||||
build.xml.stylesheet.CRC32=240b97a2
|
||||
# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
|
||||
# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
|
||||
nbproject/build-impl.xml.data.CRC32=94714fd7
|
||||
nbproject/build-impl.xml.script.CRC32=9d2a0176
|
||||
nbproject/build-impl.xml.stylesheet.CRC32=65d7ca21
|
||||
@@ -0,0 +1,59 @@
|
||||
application.args=
|
||||
build.classes.dir=${build.dir}/classes
|
||||
build.classes.excludes=**/*.java,**/*.form
|
||||
# This directory is removed when the project is cleaned:
|
||||
build.dir=build
|
||||
build.generated.dir=${build.dir}/generated
|
||||
# Only compile against the classpath explicitly listed here:
|
||||
build.sysclasspath=ignore
|
||||
build.test.classes.dir=${build.dir}/test/classes
|
||||
build.test.results.dir=${build.dir}/test/results
|
||||
debug.classpath=\
|
||||
${run.classpath}
|
||||
debug.test.classpath=\
|
||||
${run.test.classpath}
|
||||
# This directory is removed when the project is cleaned:
|
||||
dist.dir=dist
|
||||
dist.jar=${dist.dir}/contrib-ntservice.jar
|
||||
dist.javadoc.dir=${dist.dir}/javadoc
|
||||
file.reference.jna.jar=../../build/jna.jar
|
||||
libs.junit.classpath=../../lib/junit.jar
|
||||
jar.compress=false
|
||||
javac.classpath=\
|
||||
${file.reference.jna.jar};
|
||||
# Space-separated list of extra javac options
|
||||
javac.compilerargs=
|
||||
javac.deprecation=false
|
||||
javac.source=1.5
|
||||
javac.target=1.5
|
||||
javac.test.classpath=\
|
||||
${javac.classpath}:\
|
||||
${build.classes.dir}:\
|
||||
${libs.junit.classpath}
|
||||
javadoc.additionalparam=
|
||||
javadoc.author=false
|
||||
javadoc.encoding=
|
||||
javadoc.noindex=false
|
||||
javadoc.nonavbar=false
|
||||
javadoc.notree=false
|
||||
javadoc.private=false
|
||||
javadoc.splitindex=true
|
||||
javadoc.use=true
|
||||
javadoc.version=false
|
||||
javadoc.windowtitle=
|
||||
main.class=
|
||||
manifest.file=manifest.mf
|
||||
meta.inf.dir=${src.dir}/META-INF
|
||||
platform.active=default_platform
|
||||
run.classpath=\
|
||||
${javac.classpath}:\
|
||||
${build.classes.dir}
|
||||
# Space-separated list of JVM arguments used when running the project
|
||||
# (you may also define separate properties like run-sys-prop.name=value instead of -Dname=value
|
||||
# or test-sys-prop.name=value to set system properties for unit tests):
|
||||
run.jvmargs=
|
||||
run.test.classpath=\
|
||||
${javac.test.classpath}:\
|
||||
${build.test.classes.dir}
|
||||
src.dir=src
|
||||
test.src.dir=test
|
||||
@@ -0,0 +1,16 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://www.netbeans.org/ns/project/1">
|
||||
<type>org.netbeans.modules.java.j2seproject</type>
|
||||
<configuration>
|
||||
<data xmlns="http://www.netbeans.org/ns/j2se-project/3">
|
||||
<name>ntservice</name>
|
||||
<minimum-ant-version>1.6.5</minimum-ant-version>
|
||||
<source-roots>
|
||||
<root id="src.dir"/>
|
||||
</source-roots>
|
||||
<test-roots>
|
||||
<root id="test.src.dir"/>
|
||||
</test-roots>
|
||||
</data>
|
||||
</configuration>
|
||||
</project>
|
||||
@@ -0,0 +1,196 @@
|
||||
/*
|
||||
* Advapi32.java
|
||||
*
|
||||
* Created on 6. August 2007, 11:24
|
||||
*
|
||||
* To change this template, choose Tools | Template Manager
|
||||
* and open the template in the editor.
|
||||
*/
|
||||
|
||||
package jnacontrib.jna;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
import com.sun.jna.Native;
|
||||
import com.sun.jna.Pointer;
|
||||
import com.sun.jna.Structure;
|
||||
import com.sun.jna.WString;
|
||||
import com.sun.jna.ptr.IntByReference;
|
||||
import com.sun.jna.win32.StdCallLibrary;
|
||||
import com.sun.jna.win32.W32APIOptions;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author TB
|
||||
*/
|
||||
public interface Advapi32 extends StdCallLibrary {
|
||||
Advapi32 INSTANCE = (Advapi32) Native.loadLibrary("Advapi32",
|
||||
Advapi32.class, W32APIOptions.UNICODE_OPTIONS);
|
||||
|
||||
/*
|
||||
* SC_HANDLE WINAPI OpenSCManager( LPCTSTR lpMachineName, LPCTSTR
|
||||
* lpDatabaseName, DWORD dwDesiredAccess );
|
||||
*/
|
||||
public Pointer OpenSCManager(String lpMachineName, WString lpDatabaseName,
|
||||
int dwDesiredAccess);
|
||||
|
||||
/*
|
||||
* BOOL WINAPI CloseServiceHandle( SC_HANDLE hSCObject );
|
||||
*/
|
||||
public boolean CloseServiceHandle(Pointer hSCObject);
|
||||
|
||||
/*
|
||||
* SC_HANDLE WINAPI OpenService( SC_HANDLE hSCManager, LPCTSTR
|
||||
* lpServiceName, DWORD dwDesiredAccess );
|
||||
*/
|
||||
public Pointer OpenService(Pointer hSCManager, String lpServiceName,
|
||||
int dwDesiredAccess);
|
||||
|
||||
/*
|
||||
* BOOL WINAPI StartService( SC_HANDLE hService, DWORD dwNumServiceArgs,
|
||||
* LPCTSTR* lpServiceArgVectors );
|
||||
*/
|
||||
public boolean StartService(Pointer hService, int dwNumServiceArgs,
|
||||
char[] lpServiceArgVectors);
|
||||
|
||||
/*
|
||||
* BOOL WINAPI ControlService( SC_HANDLE hService, DWORD dwControl,
|
||||
* LPSERVICE_STATUS lpServiceStatus );
|
||||
*/
|
||||
public boolean ControlService(Pointer hService, int dwControl,
|
||||
SERVICE_STATUS lpServiceStatus);
|
||||
|
||||
/*
|
||||
* BOOL WINAPI StartServiceCtrlDispatcher( const SERVICE_TABLE_ENTRY*
|
||||
* lpServiceTable );
|
||||
*/
|
||||
public boolean StartServiceCtrlDispatcher(Structure[] lpServiceTable);
|
||||
|
||||
/*
|
||||
* SERVICE_STATUS_HANDLE WINAPI RegisterServiceCtrlHandler( LPCTSTR
|
||||
* lpServiceName, LPHANDLER_FUNCTION lpHandlerProc );
|
||||
*/
|
||||
public Pointer RegisterServiceCtrlHandler(String lpServiceName,
|
||||
Handler lpHandlerProc);
|
||||
|
||||
/*
|
||||
* SERVICE_STATUS_HANDLE WINAPI RegisterServiceCtrlHandlerEx( LPCTSTR
|
||||
* lpServiceName, LPHANDLER_FUNCTION_EX lpHandlerProc, LPVOID lpContext );
|
||||
*/
|
||||
public Pointer RegisterServiceCtrlHandlerEx(String lpServiceName,
|
||||
HandlerEx lpHandlerProc, Pointer lpContext);
|
||||
|
||||
/*
|
||||
* BOOL WINAPI SetServiceStatus( SERVICE_STATUS_HANDLE hServiceStatus,
|
||||
* LPSERVICE_STATUS lpServiceStatus );
|
||||
*/
|
||||
public boolean SetServiceStatus(Pointer hServiceStatus,
|
||||
SERVICE_STATUS lpServiceStatus);
|
||||
|
||||
/*
|
||||
* SC_HANDLE WINAPI CreateService( SC_HANDLE hSCManager, LPCTSTR
|
||||
* lpServiceName, LPCTSTR lpDisplayName, DWORD dwDesiredAccess, DWORD
|
||||
* dwServiceType, DWORD dwStartType, DWORD dwErrorControl, LPCTSTR
|
||||
* lpBinaryPathName, LPCTSTR lpLoadOrderGroup, LPDWORD lpdwTagId, LPCTSTR
|
||||
* lpDependencies, LPCTSTR lpServiceStartName, LPCTSTR lpPassword );
|
||||
*/
|
||||
public Pointer CreateService(Pointer hSCManager, String lpServiceName,
|
||||
String lpDisplayName, int dwDesiredAccess, int dwServiceType,
|
||||
int dwStartType, int dwErrorControl, String lpBinaryPathName,
|
||||
String lpLoadOrderGroup, IntByReference lpdwTagId,
|
||||
String lpDependencies, String lpServiceStartName, String lpPassword);
|
||||
|
||||
/*
|
||||
* BOOL WINAPI DeleteService( SC_HANDLE hService );
|
||||
*/
|
||||
public boolean DeleteService(Pointer hService);
|
||||
|
||||
/*
|
||||
* BOOL WINAPI ChangeServiceConfig2( SC_HANDLE hService, DWORD dwInfoLevel,
|
||||
* LPVOID lpInfo );
|
||||
*/
|
||||
public boolean ChangeServiceConfig2(Pointer hService, int dwInfoLevel,
|
||||
ChangeServiceConfig2Info lpInfo);
|
||||
|
||||
/*
|
||||
* LONG WINAPI RegEnumValue( HKEY hKey, DWORD dwIndex, LPTSTR lpValueName,
|
||||
* LPDWORD lpcchValueName, LPDWORD lpReserved, LPDWORD lpType, LPBYTE
|
||||
* lpData, LPDWORD lpcbData );
|
||||
*/
|
||||
public int RegEnumValue(int hKey, int dwIndex, char[] lpValueName,
|
||||
IntByReference lpcchValueName, IntByReference reserved,
|
||||
IntByReference lpType, byte[] lpData, IntByReference lpcbData);
|
||||
|
||||
interface SERVICE_MAIN_FUNCTION extends StdCallCallback {
|
||||
/*
|
||||
* VOID WINAPI ServiceMain( DWORD dwArgc, LPTSTR* lpszArgv );
|
||||
*/
|
||||
public void callback(int dwArgc, Pointer lpszArgv);
|
||||
}
|
||||
|
||||
interface Handler extends StdCallCallback {
|
||||
/*
|
||||
* VOID WINAPI Handler( DWORD fdwControl );
|
||||
*/
|
||||
public void callback(int fdwControl);
|
||||
}
|
||||
|
||||
interface HandlerEx extends StdCallCallback {
|
||||
/*
|
||||
* DWORD WINAPI HandlerEx( DWORD dwControl, DWORD dwEventType, LPVOID
|
||||
* lpEventData, LPVOID lpContext );
|
||||
*/
|
||||
public int callback(int dwControl, int dwEventType,
|
||||
Pointer lpEventData, Pointer lpContext);
|
||||
}
|
||||
|
||||
/*
|
||||
* typedef struct _SERVICE_STATUS { DWORD dwServiceType; DWORD
|
||||
* dwCurrentState; DWORD dwControlsAccepted; DWORD dwWin32ExitCode; DWORD
|
||||
* dwServiceSpecificExitCode; DWORD dwCheckPoint; DWORD dwWaitHint; }
|
||||
* SERVICE_STATUS,LPSERVICE_STATUS;
|
||||
*/
|
||||
public static class SERVICE_STATUS extends Structure {
|
||||
public int dwServiceType;
|
||||
public int dwCurrentState;
|
||||
public int dwControlsAccepted;
|
||||
public int dwWin32ExitCode;
|
||||
public int dwServiceSpecificExitCode;
|
||||
public int dwCheckPoint;
|
||||
public int dwWaitHint;
|
||||
|
||||
protected List getFieldOrder() {
|
||||
return Arrays.asList(new String[] { "dwServiceType", "dwCurrentState", "dwControlsAccepted", "dwWin32ExitCode", "dwServiceSpecificExitCode", "dwCheckPoint", "dwWaitHint" });
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* typedef struct _SERVICE_TABLE_ENTRY { LPTSTR lpServiceName;
|
||||
* LPSERVICE_MAIN_FUNCTION lpServiceProc; } SERVICE_TABLE_ENTRY,
|
||||
* LPSERVICE_TABLE_ENTRY;
|
||||
*/
|
||||
public static class SERVICE_TABLE_ENTRY extends Structure {
|
||||
public String lpServiceName;
|
||||
public SERVICE_MAIN_FUNCTION lpServiceProc;
|
||||
|
||||
protected List getFieldOrder() {
|
||||
return Arrays.asList(new String[] { "lpServiceName", "lpServiceProc" });
|
||||
}
|
||||
}
|
||||
|
||||
public static abstract class ChangeServiceConfig2Info extends Structure {
|
||||
}
|
||||
|
||||
/*
|
||||
* typedef struct _SERVICE_DESCRIPTION { LPTSTR lpDescription; }
|
||||
* SERVICE_DESCRIPTION,LPSERVICE_DESCRIPTION;
|
||||
*/
|
||||
public static class SERVICE_DESCRIPTION extends ChangeServiceConfig2Info {
|
||||
public String lpDescription;
|
||||
|
||||
protected List getFieldOrder() {
|
||||
return Arrays.asList(new String[] { "lpDescription" });
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
/*
|
||||
* WINERROR.java
|
||||
*
|
||||
* Created on 7. August 2007, 08:09
|
||||
*
|
||||
* To change this template, choose Tools | Template Manager
|
||||
* and open the template in the editor.
|
||||
*/
|
||||
|
||||
package jnacontrib.jna;
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
* @author TB
|
||||
*/
|
||||
public interface WINERROR {
|
||||
public final static int ERROR_SUCCESS = 0;
|
||||
public final static int NO_ERROR = 0;
|
||||
public final static int ERROR_FILE_NOT_FOUND = 2;
|
||||
public final static int ERROR_MORE_DATA = 234;
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
/*
|
||||
* WINNT.java
|
||||
*
|
||||
* Created on 8. August 2007, 13:41
|
||||
*
|
||||
* To change this template, choose Tools | Template Manager
|
||||
* and open the template in the editor.
|
||||
*/
|
||||
|
||||
package jnacontrib.jna;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author TB
|
||||
*/
|
||||
public interface WINNT {
|
||||
public final static int DELETE = 0x00010000;
|
||||
public final static int READ_CONTROL = 0x00020000;
|
||||
public final static int WRITE_DAC = 0x00040000;
|
||||
public final static int WRITE_OWNER = 0x00080000;
|
||||
public final static int SYNCHRONIZE = 0x00100000;
|
||||
|
||||
public final static int STANDARD_RIGHTS_REQUIRED = 0x000F0000;
|
||||
|
||||
public final static int STANDARD_RIGHTS_READ = READ_CONTROL;
|
||||
public final static int STANDARD_RIGHTS_WRITE = READ_CONTROL;
|
||||
public final static int STANDARD_RIGHTS_EXECUTE = READ_CONTROL;
|
||||
|
||||
public final static int STANDARD_RIGHTS_ALL = 0x001F0000;
|
||||
|
||||
public final static int SPECIFIC_RIGHTS_ALL = 0x0000FFFF;
|
||||
|
||||
public final static int GENERIC_EXECUTE = 0x20000000;
|
||||
|
||||
public final static int SERVICE_WIN32_OWN_PROCESS = 0x00000010;
|
||||
}
|
||||
@@ -0,0 +1,104 @@
|
||||
/*
|
||||
* WINSVC.java
|
||||
*
|
||||
* Created on 8. August 2007, 15:07
|
||||
*
|
||||
* To change this template, choose Tools | Template Manager
|
||||
* and open the template in the editor.
|
||||
*/
|
||||
|
||||
package jnacontrib.jna;
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
* @author TB
|
||||
*/
|
||||
public interface WINSVC {
|
||||
public final static int SERVICE_CONTROL_STOP = 0x00000001;
|
||||
public final static int SERVICE_CONTROL_SHUTDOWN = 0x00000005;
|
||||
|
||||
public final static int SERVICE_STOPPED = 0x00000001;
|
||||
public final static int SERVICE_START_PENDING = 0x00000002;
|
||||
public final static int SERVICE_STOP_PENDING = 0x00000003;
|
||||
public final static int SERVICE_RUNNING = 0x00000004;
|
||||
public final static int SERVICE_CONTINUE_PENDING = 0x00000005;
|
||||
public final static int SERVICE_PAUSE_PENDING = 0x00000006;
|
||||
public final static int SERVICE_PAUSED = 0x00000007;
|
||||
|
||||
public final static int SERVICE_ACCEPT_STOP = 0x00000001;
|
||||
public final static int SERVICE_ACCEPT_PAUSE_CONTINUE = 0x00000002;
|
||||
public final static int SERVICE_ACCEPT_SHUTDOWN = 0x00000004;
|
||||
public final static int SERVICE_ACCEPT_PARAMCHANGE = 0x00000008;
|
||||
public final static int SERVICE_ACCEPT_NETBINDCHANGE = 0x00000010;
|
||||
|
||||
public final static int SC_MANAGER_CONNECT = 0x0001;
|
||||
public final static int SC_MANAGER_CREATE_SERVICE = 0x0002;
|
||||
public final static int SC_MANAGER_ENUMERATE_SERVICE = 0x0004;
|
||||
public final static int SC_MANAGER_LOCK = 0x0008;
|
||||
public final static int SC_MANAGER_QUERY_LOCK_STATUS = 0x0010;
|
||||
public final static int SC_MANAGER_MODIFY_BOOT_CONFIG = 0x0020;
|
||||
|
||||
public final static int SC_MANAGER_ALL_ACCESS = WINNT.STANDARD_RIGHTS_REQUIRED |
|
||||
SC_MANAGER_CONNECT |
|
||||
SC_MANAGER_CREATE_SERVICE |
|
||||
SC_MANAGER_ENUMERATE_SERVICE |
|
||||
SC_MANAGER_LOCK |
|
||||
SC_MANAGER_QUERY_LOCK_STATUS |
|
||||
SC_MANAGER_MODIFY_BOOT_CONFIG;
|
||||
|
||||
public final static int SERVICE_QUERY_CONFIG = 0x0001;
|
||||
public final static int SERVICE_CHANGE_CONFIG = 0x0002;
|
||||
public final static int SERVICE_QUERY_STATUS = 0x0004;
|
||||
public final static int SERVICE_ENUMERATE_DEPENDENTS = 0x0008;
|
||||
public final static int SERVICE_START = 0x0010;
|
||||
public final static int SERVICE_STOP = 0x0020;
|
||||
public final static int SERVICE_PAUSE_CONTINUE = 0x0040;
|
||||
public final static int SERVICE_INTERROGATE = 0x0080;
|
||||
public final static int SERVICE_USER_DEFINED_CONTROL = 0x0100;
|
||||
|
||||
public final static int SERVICE_ALL_ACCESS = WINNT.STANDARD_RIGHTS_REQUIRED |
|
||||
SERVICE_QUERY_CONFIG |
|
||||
SERVICE_CHANGE_CONFIG |
|
||||
SERVICE_QUERY_STATUS |
|
||||
SERVICE_ENUMERATE_DEPENDENTS |
|
||||
SERVICE_START |
|
||||
SERVICE_STOP |
|
||||
SERVICE_PAUSE_CONTINUE |
|
||||
SERVICE_INTERROGATE |
|
||||
SERVICE_USER_DEFINED_CONTROL;
|
||||
|
||||
public final static int SERVICE_CONFIG_DESCRIPTION = 1;
|
||||
public final static int SERVICE_CONFIG_FAILURE_ACTIONS = 2;
|
||||
|
||||
public final static int SERVICE_KERNEL_DRIVER = 0x00000001;
|
||||
public final static int SERVICE_FILE_SYSTEM_DRIVER = 0x00000002;
|
||||
public final static int SERVICE_ADAPTER = 0x00000004;
|
||||
public final static int SERVICE_RECOGNIZER_DRIVER = 0x00000008;
|
||||
|
||||
public final static int SERVICE_DRIVER = SERVICE_KERNEL_DRIVER |
|
||||
SERVICE_FILE_SYSTEM_DRIVER |
|
||||
SERVICE_RECOGNIZER_DRIVER;
|
||||
|
||||
public final static int SERVICE_WIN32_OWN_PROCESS = 0x00000010;
|
||||
public final static int SERVICE_WIN32_SHARE_PROCESS = 0x00000020;
|
||||
public final static int SERVICE_WIN32 = SERVICE_WIN32_OWN_PROCESS | SERVICE_WIN32_SHARE_PROCESS;
|
||||
|
||||
public final static int SERVICE_INTERACTIVE_PROCESS = 0x00000100;
|
||||
|
||||
public final static int SERVICE_TYPE_ALL = SERVICE_WIN32 |
|
||||
SERVICE_ADAPTER |
|
||||
SERVICE_DRIVER |
|
||||
SERVICE_INTERACTIVE_PROCESS;
|
||||
|
||||
public final static int SERVICE_BOOT_START = 0x00000000;
|
||||
public final static int SERVICE_SYSTEM_START = 0x00000001;
|
||||
public final static int SERVICE_AUTO_START = 0x00000002;
|
||||
public final static int SERVICE_DEMAND_START = 0x00000003;
|
||||
public final static int SERVICE_DISABLED = 0x00000004;
|
||||
|
||||
public final static int SERVICE_ERROR_IGNORE = 0x00000000;
|
||||
public final static int SERVICE_ERROR_NORMAL = 0x00000001;
|
||||
public final static int SERVICE_ERROR_SEVERE = 0x00000002;
|
||||
public final static int SERVICE_ERROR_CRITICAL = 0x00000003;
|
||||
}
|
||||
@@ -0,0 +1,66 @@
|
||||
/*
|
||||
* TestService.java
|
||||
*
|
||||
* Created on 12. September 2007, 12:49
|
||||
*
|
||||
* To change this template, choose Tools | Template Manager
|
||||
* and open the template in the editor.
|
||||
*/
|
||||
|
||||
package jnacontrib.win32;
|
||||
|
||||
/**
|
||||
* TestService.
|
||||
*/
|
||||
public class TestService extends Win32Service {
|
||||
|
||||
/**
|
||||
* main.
|
||||
* @param args arguments
|
||||
*/
|
||||
public static void main(String[] args) {
|
||||
TestService service = new TestService();
|
||||
|
||||
if(args.length == 1) {
|
||||
|
||||
if(args[0].equalsIgnoreCase("install")) {
|
||||
System.out.println(service.install("TestService DisplayName", "TestService Description",
|
||||
null, null, null));
|
||||
|
||||
} else if(args[0].equalsIgnoreCase("uninstall")) {
|
||||
System.out.println(service.uninstall());
|
||||
|
||||
} else {
|
||||
System.out.println("Arguments:");
|
||||
System.out.println("install = install service");
|
||||
System.out.println("uninstall = uninstall service");
|
||||
System.out.println("<none> = run service");
|
||||
System.exit(0);
|
||||
}
|
||||
|
||||
} else {
|
||||
service.init();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new instance of TestService.
|
||||
*/
|
||||
public TestService() {
|
||||
super("TestService");
|
||||
}
|
||||
|
||||
/**
|
||||
* Will be called on start.
|
||||
*/
|
||||
public void onStart() {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Will be called on stop.
|
||||
*/
|
||||
public void onStop() {
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,310 @@
|
||||
/*
|
||||
* Win32Service.java
|
||||
*
|
||||
* Created on 12. September 2007, 12:05
|
||||
*
|
||||
* To change this template, choose Tools | Template Manager
|
||||
* and open the template in the editor.
|
||||
*/
|
||||
|
||||
package jnacontrib.win32;
|
||||
|
||||
import jnacontrib.jna.*;
|
||||
import com.sun.jna.Pointer;
|
||||
|
||||
/**
|
||||
* Baseclass for a Win32 service.
|
||||
*/
|
||||
public abstract class Win32Service {
|
||||
protected String serviceName;
|
||||
private ServiceMain serviceMain;
|
||||
private ServiceControl serviceControl;
|
||||
private Pointer serviceStatusHandle;
|
||||
private Object waitObject = new Object();
|
||||
|
||||
/**
|
||||
* Creates a new instance of Win32Service.
|
||||
*
|
||||
* @param serviceName internal name of the service
|
||||
*/
|
||||
public Win32Service(String serviceName) {
|
||||
this.serviceName = serviceName;
|
||||
}
|
||||
|
||||
/**
|
||||
* Install the service.
|
||||
*
|
||||
* @param displayName visible name
|
||||
* @param description description
|
||||
* @param dependencies array of other services to depend on or null
|
||||
* @param account service account or null for LocalSystem
|
||||
* @param password password for service account or null
|
||||
* @throws java.lang.Exception
|
||||
* @return true on success
|
||||
*/
|
||||
public boolean install(String displayName, String description, String[] dependencies, String account, String password) {
|
||||
return(install(displayName, description, dependencies, account, password, "java.exe -cp \"" +
|
||||
System.getProperty("java.class.path") + "\" -Xrs " + this.getClass().getName()));
|
||||
}
|
||||
|
||||
/**
|
||||
* Install the service.
|
||||
*
|
||||
* @return true on success
|
||||
* @param displayName visible name
|
||||
* @param description description
|
||||
* @param dependencies array of other services to depend on or null
|
||||
* @param account service account or null for LocalSystem
|
||||
* @param password password for service account or null
|
||||
* @param command command line to start the service
|
||||
* @throws java.lang.Exception
|
||||
*/
|
||||
public boolean install(String displayName, String description, String[] dependencies, String account, String password, String command) {
|
||||
Advapi32 advapi32;
|
||||
Advapi32.SERVICE_DESCRIPTION desc;
|
||||
Pointer serviceManager, service;
|
||||
boolean success = false;
|
||||
String dep = "";
|
||||
|
||||
if(dependencies != null) {
|
||||
for(String s : dependencies) {
|
||||
dep += s + "\0";
|
||||
}
|
||||
}
|
||||
dep += "\0";
|
||||
|
||||
desc = new Advapi32.SERVICE_DESCRIPTION();
|
||||
desc.lpDescription = description;
|
||||
|
||||
advapi32 = Advapi32.INSTANCE;
|
||||
serviceManager = openServiceControlManager(null, WINSVC.SC_MANAGER_ALL_ACCESS);
|
||||
|
||||
if(serviceManager != null) {
|
||||
service = advapi32.CreateService(serviceManager, serviceName, displayName,
|
||||
WINSVC.SERVICE_ALL_ACCESS, WINSVC.SERVICE_WIN32_OWN_PROCESS, WINSVC.SERVICE_DEMAND_START,
|
||||
WINSVC.SERVICE_ERROR_NORMAL,
|
||||
command,
|
||||
null, null, dep, account, password);
|
||||
|
||||
if(service != null) {
|
||||
success = advapi32.ChangeServiceConfig2(service, WINSVC.SERVICE_CONFIG_DESCRIPTION, desc);
|
||||
advapi32.CloseServiceHandle(service);
|
||||
}
|
||||
advapi32.CloseServiceHandle(serviceManager);
|
||||
}
|
||||
return(success);
|
||||
}
|
||||
|
||||
/**
|
||||
* Uninstall the service.
|
||||
*
|
||||
* @throws java.lang.Exception
|
||||
* @return true on success
|
||||
*/
|
||||
public boolean uninstall() {
|
||||
Advapi32 advapi32;
|
||||
Pointer serviceManager, service;
|
||||
boolean success = false;
|
||||
|
||||
advapi32 = Advapi32.INSTANCE;
|
||||
serviceManager = openServiceControlManager(null, WINSVC.SC_MANAGER_ALL_ACCESS);
|
||||
|
||||
if(serviceManager != null) {
|
||||
service = advapi32.OpenService(serviceManager, serviceName, WINSVC.SERVICE_ALL_ACCESS);
|
||||
|
||||
if(service != null) {
|
||||
success = advapi32.DeleteService(service);
|
||||
advapi32.CloseServiceHandle(service);
|
||||
}
|
||||
advapi32.CloseServiceHandle(serviceManager);
|
||||
}
|
||||
return(success);
|
||||
}
|
||||
|
||||
/**
|
||||
* Ask the ServiceControlManager to start the service.
|
||||
* @return true on success
|
||||
*/
|
||||
public boolean start() {
|
||||
Advapi32 advapi32;
|
||||
Pointer serviceManager, service;
|
||||
boolean success = false;
|
||||
|
||||
advapi32 = Advapi32.INSTANCE;
|
||||
|
||||
serviceManager = openServiceControlManager(null, WINNT.GENERIC_EXECUTE);
|
||||
|
||||
if(serviceManager != null) {
|
||||
service = advapi32.OpenService(serviceManager, serviceName, WINNT.GENERIC_EXECUTE);
|
||||
|
||||
if(service != null) {
|
||||
success = advapi32.StartService(service, 0, null);
|
||||
advapi32.CloseServiceHandle(service);
|
||||
}
|
||||
advapi32.CloseServiceHandle(serviceManager);
|
||||
}
|
||||
|
||||
return(success);
|
||||
}
|
||||
|
||||
/**
|
||||
* Ask the ServiceControlManager to stop the service.
|
||||
* @return true on success
|
||||
*/
|
||||
public boolean stop() throws Exception {
|
||||
Advapi32 advapi32;
|
||||
Pointer serviceManager, service;
|
||||
Advapi32.SERVICE_STATUS serviceStatus;
|
||||
boolean success = false;
|
||||
|
||||
advapi32 = Advapi32.INSTANCE;
|
||||
|
||||
serviceManager = openServiceControlManager(null, WINNT.GENERIC_EXECUTE);
|
||||
|
||||
if(serviceManager != null) {
|
||||
service = advapi32.OpenService(serviceManager, serviceName, WINNT.GENERIC_EXECUTE);
|
||||
|
||||
if(service != null) {
|
||||
serviceStatus = new Advapi32.SERVICE_STATUS();
|
||||
success = advapi32.ControlService(service, WINSVC.SERVICE_CONTROL_STOP, serviceStatus);
|
||||
advapi32.CloseServiceHandle(service);
|
||||
}
|
||||
advapi32.CloseServiceHandle(serviceManager);
|
||||
}
|
||||
|
||||
return(success);
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize the service, connect to the ServiceControlManager.
|
||||
*/
|
||||
public void init() {
|
||||
Advapi32 advapi32;
|
||||
Advapi32.SERVICE_TABLE_ENTRY entry;
|
||||
|
||||
serviceMain = new ServiceMain();
|
||||
advapi32 = Advapi32.INSTANCE;
|
||||
entry = new Advapi32.SERVICE_TABLE_ENTRY();
|
||||
entry.lpServiceName = serviceName;
|
||||
entry.lpServiceProc = serviceMain;
|
||||
|
||||
advapi32.StartServiceCtrlDispatcher(entry.toArray(2));
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a handle to the ServiceControlManager.
|
||||
*
|
||||
* @param machine name of the machine or null for localhost
|
||||
* @param access access flags
|
||||
* @return handle to ServiceControlManager or null when failed
|
||||
*/
|
||||
private Pointer openServiceControlManager(String machine, int access) {
|
||||
Pointer handle = null;
|
||||
Advapi32 advapi32;
|
||||
|
||||
advapi32 = Advapi32.INSTANCE;
|
||||
handle = advapi32.OpenSCManager(machine, null, access);
|
||||
return(handle);
|
||||
}
|
||||
|
||||
/**
|
||||
* Report service status to the ServiceControlManager.
|
||||
*
|
||||
* @param status status
|
||||
* @param win32ExitCode exit code
|
||||
* @param waitHint time to wait
|
||||
*/
|
||||
private void reportStatus(int status, int win32ExitCode, int waitHint) {
|
||||
Advapi32 advapi32;
|
||||
Advapi32.SERVICE_STATUS serviceStatus;
|
||||
|
||||
advapi32 = Advapi32.INSTANCE;
|
||||
serviceStatus = new Advapi32.SERVICE_STATUS();
|
||||
serviceStatus.dwServiceType = WINNT.SERVICE_WIN32_OWN_PROCESS;
|
||||
serviceStatus.dwControlsAccepted = WINSVC.SERVICE_ACCEPT_STOP | WINSVC.SERVICE_ACCEPT_SHUTDOWN;
|
||||
serviceStatus.dwWin32ExitCode = win32ExitCode;
|
||||
serviceStatus.dwWaitHint = waitHint;
|
||||
serviceStatus.dwCurrentState = status;
|
||||
|
||||
advapi32.SetServiceStatus(serviceStatusHandle, serviceStatus);
|
||||
}
|
||||
|
||||
/**
|
||||
* Called when service is starting.
|
||||
*/
|
||||
public abstract void onStart();
|
||||
|
||||
/*
|
||||
* Called when service should stop.
|
||||
*/
|
||||
public abstract void onStop();
|
||||
|
||||
|
||||
/**
|
||||
* Implementation of the service main function.
|
||||
*/
|
||||
private class ServiceMain implements Advapi32.SERVICE_MAIN_FUNCTION {
|
||||
|
||||
/**
|
||||
* Called when the service is starting.
|
||||
*
|
||||
* @param dwArgc number of arguments
|
||||
* @param lpszArgv pointer to arguments
|
||||
*/
|
||||
public void callback(int dwArgc, Pointer lpszArgv) {
|
||||
Advapi32 advapi32;
|
||||
|
||||
advapi32 = Advapi32.INSTANCE;
|
||||
|
||||
serviceControl = new ServiceControl();
|
||||
serviceStatusHandle = advapi32.RegisterServiceCtrlHandlerEx(serviceName, serviceControl, null);
|
||||
|
||||
reportStatus(WINSVC.SERVICE_START_PENDING, WINERROR.NO_ERROR, 3000);
|
||||
reportStatus(WINSVC.SERVICE_RUNNING, WINERROR.NO_ERROR, 0);
|
||||
|
||||
onStart();
|
||||
|
||||
try {
|
||||
synchronized(waitObject) {
|
||||
waitObject.wait();
|
||||
}
|
||||
} catch (InterruptedException ex) {
|
||||
}
|
||||
reportStatus(WINSVC.SERVICE_STOPPED, WINERROR.NO_ERROR, 0);
|
||||
|
||||
// Avoid returning from ServiceMain, which will cause a crash
|
||||
// See http://support.microsoft.com/kb/201349, which recommends
|
||||
// having init() wait for this thread.
|
||||
// Waiting on this thread in init() won't fix the crash, though.
|
||||
//System.exit(0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Implementation of the service control function.
|
||||
*/
|
||||
private class ServiceControl implements Advapi32.HandlerEx {
|
||||
|
||||
/**
|
||||
* Called when the service get a control code.
|
||||
*
|
||||
* @param dwControl
|
||||
* @param dwEventType
|
||||
* @param lpEventData
|
||||
* @param lpContext
|
||||
*/
|
||||
public int callback(int dwControl, int dwEventType, Pointer lpEventData, Pointer lpContext) {
|
||||
switch(dwControl) {
|
||||
case WINSVC.SERVICE_CONTROL_STOP:
|
||||
case WINSVC.SERVICE_CONTROL_SHUTDOWN:
|
||||
reportStatus(WINSVC.SERVICE_STOP_PENDING, WINERROR.NO_ERROR, 5000);
|
||||
onStop();
|
||||
synchronized(waitObject) {
|
||||
waitObject.notifyAll();
|
||||
}
|
||||
}
|
||||
return WINERROR.NO_ERROR;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
# placeholder
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<classpath>
|
||||
<classpathentry kind="src" path="src"/>
|
||||
<classpathentry kind="src" output="build.eclipse/contrib-test-classes" path="test"/>
|
||||
<classpathentry exported="true" kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
|
||||
<classpathentry combineaccessrules="false" kind="src" path="/jnalib"/>
|
||||
<classpathentry kind="lib" path="/jnalib/dist/jna.jar"/>
|
||||
<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/3"/>
|
||||
<classpathentry kind="output" path="bin"/>
|
||||
</classpath>
|
||||
@@ -0,0 +1,17 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<projectDescription>
|
||||
<name>platform</name>
|
||||
<comment></comment>
|
||||
<projects>
|
||||
</projects>
|
||||
<buildSpec>
|
||||
<buildCommand>
|
||||
<name>org.eclipse.jdt.core.javabuilder</name>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
</buildSpec>
|
||||
<natures>
|
||||
<nature>org.eclipse.jdt.core.javanature</nature>
|
||||
</natures>
|
||||
</projectDescription>
|
||||
@@ -0,0 +1,182 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project name="platform" default="default" basedir=".">
|
||||
<description>Builds and tests platform-specific code.</description>
|
||||
<import file="nbproject/build-impl.xml"/>
|
||||
<!--
|
||||
|
||||
There exist several targets which are by default empty and which can be
|
||||
used for execution of your tasks. These targets are usually executed
|
||||
before and after some main targets. They are:
|
||||
|
||||
-pre-init: called before initialization of project properties
|
||||
-post-init: called after initialization of project properties
|
||||
-pre-compile: called before javac compilation
|
||||
-post-compile: called after javac compilation
|
||||
-pre-compile-single: called before javac compilation of single file
|
||||
-post-compile-single: called after javac compilation of single file
|
||||
-pre-compile-test: called before javac compilation of JUnit tests
|
||||
-post-compile-test: called after javac compilation of JUnit tests
|
||||
-pre-compile-test-single: called before javac compilation of single JUnit test
|
||||
-post-compile-test-single: called after javac compilation of single JUunit test
|
||||
-pre-jar: called before JAR building
|
||||
-post-jar: called after JAR building
|
||||
-post-clean: called after cleaning build products
|
||||
|
||||
(Targets beginning with '-' are not intended to be called on their own.)
|
||||
|
||||
Example of inserting an obfuscator after compilation could look like this:
|
||||
|
||||
<target name="-post-compile">
|
||||
<obfuscate>
|
||||
<fileset dir="${build.classes.dir}"/>
|
||||
</obfuscate>
|
||||
</target>
|
||||
|
||||
For list of available properties check the imported
|
||||
nbproject/build-impl.xml file.
|
||||
|
||||
|
||||
Another way to customize the build is by overriding existing main targets.
|
||||
The targets of interest are:
|
||||
|
||||
-init-macrodef-javac: defines macro for javac compilation
|
||||
-init-macrodef-junit: defines macro for junit execution
|
||||
-init-macrodef-debug: defines macro for class debugging
|
||||
-init-macrodef-java: defines macro for class execution
|
||||
-do-jar-with-manifest: JAR building (if you are using a manifest)
|
||||
-do-jar-without-manifest: JAR building (if you are not using a manifest)
|
||||
run: execution of project
|
||||
-javadoc-build: Javadoc generation
|
||||
test-report: JUnit report generation
|
||||
|
||||
An example of overriding the target for project execution could look like this:
|
||||
|
||||
<target name="run" depends="JnaContrib-impl.jar">
|
||||
<exec dir="bin" executable="launcher.exe">
|
||||
<arg file="${dist.jar}"/>
|
||||
</exec>
|
||||
</target>
|
||||
|
||||
Notice that the overridden target depends on the jar target and not only on
|
||||
the compile target as the regular run target does. Again, for a list of available
|
||||
properties which you can use, check the target you are overriding in the
|
||||
nbproject/build-impl.xml file.
|
||||
|
||||
-->
|
||||
|
||||
<target name="-do-jar-without-manifest">
|
||||
<jar jarfile="${dist.jar}" compress="${jar.compress}">
|
||||
<manifest>
|
||||
<attribute name="Main-Class" value="com.sun.jna.Native"/>
|
||||
<attribute name="Manifest-Version" value="1.0"/>
|
||||
<attribute name="Implementation-Title" value="${impl.title}"/>
|
||||
<attribute name="Implementation-Vendor" value="${vendor}"/>
|
||||
<attribute name="Implementation-Version" value="${impl.version}"/>
|
||||
<attribute name="Specification-Title" value="${spec.title}"/>
|
||||
<attribute name="Specification-Vendor" value="${spec.vendor}"/>
|
||||
<attribute name="Specification-Version" value="${spec.version}"/>
|
||||
<!--
|
||||
OSGi Bundle attributes
|
||||
See http://www.osgi.org/Specifications/Reference
|
||||
-->
|
||||
<attribute name="Bundle-Category" value="jni"/>
|
||||
<attribute name="Bundle-ManifestVersion" value="2"/>
|
||||
<attribute name="Bundle-Name" value="jna-platform"/>
|
||||
<attribute name="Bundle-Description" value="JNA Platform Library"/>
|
||||
<attribute name="Bundle-SymbolicName" value="com.sun.jna.platform"/>
|
||||
<attribute name="Bundle-Version" value="${osgi.version}"/>
|
||||
<attribute name="Bundle-RequiredExecutionEnvironment" value="J2SE-1.4"/>
|
||||
<attribute name="Bundle-Vendor" value="${vendor}"/>
|
||||
<attribute name="Require-Bundle" value="com.sun.jna;bundle-version="${osgi.version}""/>
|
||||
<attribute name="Export-Package"
|
||||
value="
|
||||
com.sun.jna.platform,
|
||||
com.sun.jna.platform.dnd,
|
||||
com.sun.jna.platform.mac,
|
||||
com.sun.jna.platform.unix,
|
||||
com.sun.jna.platform.win32,
|
||||
com.sun.jna.platform.win32.COM,
|
||||
com.sun.jna.platform.win32.COM.tlb,
|
||||
com.sun.jna.platform.win32.COM.tlb.imp,
|
||||
com.sun.jna.platform.wince
|
||||
"/>
|
||||
</manifest>
|
||||
<fileset dir="${build.classes.dir}"/>
|
||||
</jar>
|
||||
</target>
|
||||
|
||||
<target name="test" depends="init,compile,compile-test,-pre-test-run" description="Run platform unit tests.">
|
||||
<echo>Running platform tests: ${test.src.dir}</echo>
|
||||
<property name="test.fork" value="yes"/>
|
||||
<property name="build.test.results.dir.abs" location="${build.test.results.dir}"/>
|
||||
<mkdir dir="${build.test.results.dir.abs}"/>
|
||||
<echo>Saving test results in ${build.test.results.dir.abs}</echo>
|
||||
<condition property="tests.platform" value="**/mac/**">
|
||||
<os family="mac"/>
|
||||
</condition>
|
||||
<condition property="tests.platform" value="**/win32/**">
|
||||
<os family="windows"/>
|
||||
</condition>
|
||||
<condition property="tests.platform" value="**/unix/**">
|
||||
<os family="unix"/>
|
||||
</condition>
|
||||
<property name="tests.platform" value=""/>
|
||||
<property name="tests.exclude" value=""/>
|
||||
<property name="tests.exclude-patterns" value=""/>
|
||||
<condition property="java.awt.headless" value="true">
|
||||
<isset property="headless"/>
|
||||
</condition>
|
||||
<condition property="vmopt.arch" value="-d64" else="-Dignore">
|
||||
<and>
|
||||
<!-- Sun 64-bit VM for windows doesn't support the -d64 switch -->
|
||||
<not><os family="windows"/></not>
|
||||
<equals arg1="${vm.arch}" arg2="-d64" trim="true"/>
|
||||
</and>
|
||||
</condition>
|
||||
<propertyset id="headless">
|
||||
<propertyref prefix="java.awt.headless"/>
|
||||
</propertyset>
|
||||
<echo>tests.platform=${tests.platform}</echo>
|
||||
<junit fork="${test.fork}" failureproperty="testfailure" tempdir="${build.dir}">
|
||||
<!-- optionally run headless -->
|
||||
<syspropertyset refid="headless"/>
|
||||
<!-- avoid VM conflicts with JNA protected mode -->
|
||||
<env key="${ld.preload.name}" file="${libjsig}"/>
|
||||
<!-- Ignore any system install of JNA -->
|
||||
<sysproperty key="jna.nosys" value="true"/>
|
||||
<!-- Avoid VM crashes, if possible -->
|
||||
<sysproperty key="jna.protected" value="true"/>
|
||||
<sysproperty key="jna.builddir" file="${file.reference.jna.build}"/>
|
||||
<jvmarg value="${vmopt.arch}"/>
|
||||
<classpath><path path="${run.test.classpath}"/><path path="${file.reference.jna.build}/test-classes"/></classpath>
|
||||
<formatter type="brief" usefile="false"/>
|
||||
<formatter type="xml"/>
|
||||
<batchtest todir="${build.test.results.dir}">
|
||||
<fileset dir="${test.src.dir}" excludes="${tests.exclude-patterns}">
|
||||
<!-- Until StructureFieldOrderTest gets fixed up a little -->
|
||||
<exclude name="**/StructureFieldOrderTest.java"/>
|
||||
<include name="com/sun/jna/platform/*Test.java"/>
|
||||
<include name="${tests.platform}"/>
|
||||
<exclude name="${tests.exclude}"/>
|
||||
</fileset>
|
||||
</batchtest>
|
||||
</junit>
|
||||
<junitreport todir="${build.test.results.dir}">
|
||||
<fileset dir="${build.test.results.dir}">
|
||||
<include name="TEST-*.xml"/>
|
||||
</fileset>
|
||||
<report todir="${build.test.results.dir}"/>
|
||||
</junitreport>
|
||||
<echo message="View test report in file://${build.test.results.dir.abs}/index.html" />
|
||||
<fail if="testfailure">One or more tests failed</fail>
|
||||
</target>
|
||||
|
||||
<!-- One-off test to check field order definitions -->
|
||||
<target name="test-field-order" depends="-pre-test-run-single" >
|
||||
<!-- @todo How to ensure sys prop: jna.nosys=true is seen in tests? -->
|
||||
<!--<property name="test.includes" value="com/sun/jna/platform/**/*.java"/>-->
|
||||
<property name="test.includes" value="com/sun/jna/platform/StructureFieldOrderTest.java"/>
|
||||
<property name="javac.includes" value="**/*"/>
|
||||
<antcall target="test-single"/>
|
||||
</target>
|
||||
</project>
|
||||
@@ -0,0 +1,541 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
*** GENERATED FROM project.xml - DO NOT EDIT ***
|
||||
*** EDIT ../build.xml INSTEAD ***
|
||||
|
||||
For the purpose of easier reading the script
|
||||
is divided into following sections:
|
||||
|
||||
- initialization
|
||||
- compilation
|
||||
- jar
|
||||
- execution
|
||||
- debugging
|
||||
- javadoc
|
||||
- junit compilation
|
||||
- junit execution
|
||||
- junit debugging
|
||||
- applet
|
||||
- cleanup
|
||||
|
||||
-->
|
||||
<project name="platform-impl" default="default" basedir=".." xmlns:j2seproject3="http://www.netbeans.org/ns/j2se-project/3" xmlns:j2seproject2="http://www.netbeans.org/ns/j2se-project/2" xmlns:j2seproject1="http://www.netbeans.org/ns/j2se-project/1" xmlns:jaxws="http://www.netbeans.org/ns/jax-ws/1">
|
||||
<target name="default" depends="test,jar,javadoc" description="Build and test whole project."/>
|
||||
<!--
|
||||
======================
|
||||
INITIALIZATION SECTION
|
||||
======================
|
||||
-->
|
||||
<target name="-pre-init">
|
||||
<!-- Empty placeholder for easier customization. -->
|
||||
<!-- You can override this target in the ../build.xml file. -->
|
||||
</target>
|
||||
<target name="-init-private" depends="-pre-init">
|
||||
<property file="nbproject/private/private.properties"/>
|
||||
</target>
|
||||
<target name="-init-user" depends="-pre-init,-init-private">
|
||||
<property file="${user.properties.file}"/>
|
||||
<!-- The two properties below are usually overridden -->
|
||||
<!-- by the active platform. Just a fallback. -->
|
||||
<property name="default.javac.source" value="1.4"/>
|
||||
<property name="default.javac.target" value="1.4"/>
|
||||
</target>
|
||||
<target name="-init-project" depends="-pre-init,-init-private,-init-user">
|
||||
<property file="nbproject/project.properties"/>
|
||||
</target>
|
||||
<target name="-do-init" depends="-pre-init,-init-private,-init-user,-init-project,-init-macrodef-property">
|
||||
<available file="${manifest.file}" property="manifest.available"/>
|
||||
<condition property="manifest.available+main.class">
|
||||
<and>
|
||||
<isset property="manifest.available"/>
|
||||
<isset property="main.class"/>
|
||||
<not>
|
||||
<equals arg1="${main.class}" arg2="" trim="true"/>
|
||||
</not>
|
||||
</and>
|
||||
</condition>
|
||||
<condition property="manifest.available+main.class+mkdist.available">
|
||||
<and>
|
||||
<istrue value="${manifest.available+main.class}"/>
|
||||
<isset property="libs.CopyLibs.classpath"/>
|
||||
</and>
|
||||
</condition>
|
||||
<condition property="have.tests">
|
||||
<or>
|
||||
<available file="${test.src.dir}"/>
|
||||
</or>
|
||||
</condition>
|
||||
<condition property="have.sources">
|
||||
<or>
|
||||
<available file="${src.dir}"/>
|
||||
</or>
|
||||
</condition>
|
||||
<condition property="netbeans.home+have.tests">
|
||||
<and>
|
||||
<isset property="netbeans.home"/>
|
||||
<isset property="have.tests"/>
|
||||
</and>
|
||||
</condition>
|
||||
<condition property="no.javadoc.preview">
|
||||
<isfalse value="${javadoc.preview}"/>
|
||||
</condition>
|
||||
<property name="run.jvmargs" value=""/>
|
||||
<property name="javac.compilerargs" value=""/>
|
||||
<property name="work.dir" value="${basedir}"/>
|
||||
<condition property="no.deps">
|
||||
<and>
|
||||
<istrue value="${no.dependencies}"/>
|
||||
</and>
|
||||
</condition>
|
||||
<property name="javac.debug" value="true"/>
|
||||
<property name="javadoc.preview" value="true"/>
|
||||
</target>
|
||||
<target name="-post-init">
|
||||
<!-- Empty placeholder for easier customization. -->
|
||||
<!-- You can override this target in the ../build.xml file. -->
|
||||
</target>
|
||||
<target name="-init-check" depends="-pre-init,-init-private,-init-user,-init-project,-do-init">
|
||||
<fail unless="src.dir">Must set src.dir</fail>
|
||||
<fail unless="test.src.dir">Must set test.src.dir</fail>
|
||||
<fail unless="build.dir">Must set build.dir</fail>
|
||||
<fail unless="dist.dir">Must set dist.dir</fail>
|
||||
<fail unless="build.classes.dir">Must set build.classes.dir</fail>
|
||||
<fail unless="dist.javadoc.dir">Must set dist.javadoc.dir</fail>
|
||||
<fail unless="build.test.classes.dir">Must set build.test.classes.dir</fail>
|
||||
<fail unless="build.test.results.dir">Must set build.test.results.dir</fail>
|
||||
<fail unless="build.classes.excludes">Must set build.classes.excludes</fail>
|
||||
<fail unless="dist.jar">Must set dist.jar</fail>
|
||||
</target>
|
||||
<target name="-init-macrodef-property">
|
||||
<macrodef name="property" uri="http://www.netbeans.org/ns/j2se-project/1">
|
||||
<attribute name="name"/>
|
||||
<attribute name="value"/>
|
||||
<sequential>
|
||||
<property name="@{name}" value="${@{value}}"/>
|
||||
</sequential>
|
||||
</macrodef>
|
||||
</target>
|
||||
<target name="-init-macrodef-javac">
|
||||
<macrodef name="javac" uri="http://www.netbeans.org/ns/j2se-project/3">
|
||||
<attribute name="srcdir" default="${src.dir}"/>
|
||||
<attribute name="destdir" default="${build.classes.dir}"/>
|
||||
<attribute name="classpath" default="${javac.classpath}"/>
|
||||
<attribute name="debug" default="${javac.debug}"/>
|
||||
<element name="customize" optional="true"/>
|
||||
<sequential>
|
||||
<javac srcdir="@{srcdir}" destdir="@{destdir}" debug="@{debug}" deprecation="${javac.deprecation}" source="${javac.source}" target="${javac.target}" includeantruntime="false">
|
||||
<classpath>
|
||||
<path path="@{classpath}"/>
|
||||
</classpath>
|
||||
<compilerarg line="${javac.compilerargs}"/>
|
||||
<customize/>
|
||||
</javac>
|
||||
</sequential>
|
||||
</macrodef>
|
||||
</target>
|
||||
<target name="-init-macrodef-junit">
|
||||
<macrodef name="junit" uri="http://www.netbeans.org/ns/j2se-project/3">
|
||||
<attribute name="includes" default="**/*Test.java"/>
|
||||
<sequential>
|
||||
<junit showoutput="true" fork="true" dir="${basedir}" failureproperty="tests.failed" errorproperty="tests.failed">
|
||||
<batchtest todir="${build.test.results.dir}">
|
||||
<fileset dir="${test.src.dir}" includes="@{includes}"/>
|
||||
</batchtest>
|
||||
<classpath>
|
||||
<path path="${run.test.classpath}"/>
|
||||
</classpath>
|
||||
<syspropertyset>
|
||||
<propertyref prefix="test-sys-prop."/>
|
||||
<mapper type="glob" from="test-sys-prop.*" to="*"/>
|
||||
</syspropertyset>
|
||||
<formatter type="brief" usefile="false"/>
|
||||
<formatter type="xml"/>
|
||||
<jvmarg line="${run.jvmargs}"/>
|
||||
</junit>
|
||||
</sequential>
|
||||
</macrodef>
|
||||
</target>
|
||||
<target name="-init-macrodef-nbjpda">
|
||||
<macrodef name="nbjpdastart" uri="http://www.netbeans.org/ns/j2se-project/1">
|
||||
<attribute name="name" default="${main.class}"/>
|
||||
<attribute name="classpath" default="${debug.classpath}"/>
|
||||
<attribute name="stopclassname" default=""/>
|
||||
<sequential>
|
||||
<nbjpdastart transport="dt_socket" addressproperty="jpda.address" name="@{name}" stopclassname="@{stopclassname}">
|
||||
<classpath>
|
||||
<path path="@{classpath}"/>
|
||||
</classpath>
|
||||
</nbjpdastart>
|
||||
</sequential>
|
||||
</macrodef>
|
||||
<macrodef name="nbjpdareload" uri="http://www.netbeans.org/ns/j2se-project/1">
|
||||
<attribute name="dir" default="${build.classes.dir}"/>
|
||||
<sequential>
|
||||
<nbjpdareload>
|
||||
<fileset includes="${fix.includes}*.class" dir="@{dir}"/>
|
||||
</nbjpdareload>
|
||||
</sequential>
|
||||
</macrodef>
|
||||
</target>
|
||||
<target name="-init-macrodef-debug">
|
||||
<macrodef name="debug" uri="http://www.netbeans.org/ns/j2se-project/3">
|
||||
<attribute name="classname" default="${main.class}"/>
|
||||
<attribute name="classpath" default="${debug.classpath}"/>
|
||||
<element name="customize" optional="true"/>
|
||||
<sequential>
|
||||
<java fork="true" classname="@{classname}" dir="${work.dir}">
|
||||
<jvmarg value="-Xdebug"/>
|
||||
<jvmarg value="-Xnoagent"/>
|
||||
<jvmarg value="-Djava.compiler=none"/>
|
||||
<jvmarg value="-Xrunjdwp:transport=dt_socket,address=${jpda.address}"/>
|
||||
<jvmarg line="${run.jvmargs}"/>
|
||||
<classpath>
|
||||
<path path="@{classpath}"/>
|
||||
</classpath>
|
||||
<syspropertyset>
|
||||
<propertyref prefix="run-sys-prop."/>
|
||||
<mapper type="glob" from="run-sys-prop.*" to="*"/>
|
||||
</syspropertyset>
|
||||
<customize/>
|
||||
</java>
|
||||
</sequential>
|
||||
</macrodef>
|
||||
</target>
|
||||
<target name="-init-macrodef-java">
|
||||
<macrodef name="java" uri="http://www.netbeans.org/ns/j2se-project/1">
|
||||
<attribute name="classname" default="${main.class}"/>
|
||||
<element name="customize" optional="true"/>
|
||||
<sequential>
|
||||
<java fork="true" classname="@{classname}" dir="${work.dir}">
|
||||
<jvmarg line="${run.jvmargs}"/>
|
||||
<classpath>
|
||||
<path path="${run.classpath}"/>
|
||||
</classpath>
|
||||
<syspropertyset>
|
||||
<propertyref prefix="run-sys-prop."/>
|
||||
<mapper type="glob" from="run-sys-prop.*" to="*"/>
|
||||
</syspropertyset>
|
||||
<customize/>
|
||||
</java>
|
||||
</sequential>
|
||||
</macrodef>
|
||||
</target>
|
||||
<target name="-init-presetdef-jar">
|
||||
<presetdef name="jar" uri="http://www.netbeans.org/ns/j2se-project/1">
|
||||
<jar jarfile="${dist.jar}" compress="${jar.compress}">
|
||||
<j2seproject1:fileset dir="${build.classes.dir}"/>
|
||||
</jar>
|
||||
</presetdef>
|
||||
</target>
|
||||
<target name="init" depends="-pre-init,-init-private,-init-user,-init-project,-do-init,-post-init,-init-check,-init-macrodef-property,-init-macrodef-javac,-init-macrodef-junit,-init-macrodef-nbjpda,-init-macrodef-debug,-init-macrodef-java,-init-presetdef-jar"/>
|
||||
<!--
|
||||
===================
|
||||
COMPILATION SECTION
|
||||
===================
|
||||
-->
|
||||
<target name="deps-jar" depends="init" unless="no.deps"/>
|
||||
<target name="-pre-pre-compile" depends="init,deps-jar">
|
||||
<mkdir dir="${build.classes.dir}"/>
|
||||
</target>
|
||||
<target name="-pre-compile">
|
||||
<!-- Empty placeholder for easier customization. -->
|
||||
<!-- You can override this target in the ../build.xml file. -->
|
||||
</target>
|
||||
<target name="-do-compile" depends="init,deps-jar,-pre-pre-compile,-pre-compile" if="have.sources">
|
||||
<j2seproject3:javac/>
|
||||
<copy todir="${build.classes.dir}">
|
||||
<fileset dir="${src.dir}" excludes="${build.classes.excludes}"/>
|
||||
</copy>
|
||||
</target>
|
||||
<target name="-post-compile">
|
||||
<!-- Empty placeholder for easier customization. -->
|
||||
<!-- You can override this target in the ../build.xml file. -->
|
||||
</target>
|
||||
<target name="compile" depends="init,deps-jar,-pre-pre-compile,-pre-compile,-do-compile,-post-compile" description="Compile project."/>
|
||||
<target name="-pre-compile-single">
|
||||
<!-- Empty placeholder for easier customization. -->
|
||||
<!-- You can override this target in the ../build.xml file. -->
|
||||
</target>
|
||||
<target name="-do-compile-single" depends="init,deps-jar,-pre-pre-compile">
|
||||
<fail unless="javac.includes">Must select some files in the IDE or set javac.includes</fail>
|
||||
<j2seproject3:javac>
|
||||
<customize>
|
||||
<patternset includes="${javac.includes}"/>
|
||||
</customize>
|
||||
</j2seproject3:javac>
|
||||
</target>
|
||||
<target name="-post-compile-single">
|
||||
<!-- Empty placeholder for easier customization. -->
|
||||
<!-- You can override this target in the ../build.xml file. -->
|
||||
</target>
|
||||
<target name="compile-single" depends="init,deps-jar,-pre-pre-compile,-pre-compile-single,-do-compile-single,-post-compile-single"/>
|
||||
<!--
|
||||
====================
|
||||
JAR BUILDING SECTION
|
||||
====================
|
||||
-->
|
||||
<target name="-pre-pre-jar" depends="init">
|
||||
<dirname property="dist.jar.dir" file="${dist.jar}"/>
|
||||
<mkdir dir="${dist.jar.dir}"/>
|
||||
</target>
|
||||
<target name="-pre-jar">
|
||||
<!-- Empty placeholder for easier customization. -->
|
||||
<!-- You can override this target in the ../build.xml file. -->
|
||||
</target>
|
||||
<target name="-do-jar-without-manifest" depends="init,compile,-pre-pre-jar,-pre-jar" unless="manifest.available">
|
||||
<j2seproject1:jar/>
|
||||
</target>
|
||||
<target name="-do-jar-with-manifest" depends="init,compile,-pre-pre-jar,-pre-jar" if="manifest.available" unless="manifest.available+main.class">
|
||||
<j2seproject1:jar manifest="${manifest.file}"/>
|
||||
</target>
|
||||
<target name="-do-jar-with-mainclass" depends="init,compile,-pre-pre-jar,-pre-jar" if="manifest.available+main.class" unless="manifest.available+main.class+mkdist.available">
|
||||
<j2seproject1:jar manifest="${manifest.file}">
|
||||
<j2seproject1:manifest>
|
||||
<j2seproject1:attribute name="Main-Class" value="${main.class}"/>
|
||||
</j2seproject1:manifest>
|
||||
</j2seproject1:jar>
|
||||
<echo>To run this application from the command line without Ant, try:</echo>
|
||||
<property name="build.classes.dir.resolved" location="${build.classes.dir}"/>
|
||||
<property name="dist.jar.resolved" location="${dist.jar}"/>
|
||||
<pathconvert property="run.classpath.with.dist.jar">
|
||||
<path path="${run.classpath}"/>
|
||||
<map from="${build.classes.dir.resolved}" to="${dist.jar.resolved}"/>
|
||||
</pathconvert>
|
||||
<echo>java -cp "${run.classpath.with.dist.jar}" ${main.class}</echo>
|
||||
</target>
|
||||
<target name="-do-jar-with-libraries" depends="init,compile,-pre-pre-jar,-pre-jar" if="manifest.available+main.class+mkdist.available">
|
||||
<property name="build.classes.dir.resolved" location="${build.classes.dir}"/>
|
||||
<pathconvert property="run.classpath.without.build.classes.dir">
|
||||
<path path="${run.classpath}"/>
|
||||
<map from="${build.classes.dir.resolved}" to=""/>
|
||||
</pathconvert>
|
||||
<pathconvert property="jar.classpath" pathsep=" ">
|
||||
<path path="${run.classpath.without.build.classes.dir}"/>
|
||||
<chainedmapper>
|
||||
<flattenmapper/>
|
||||
<globmapper from="*" to="lib/*"/>
|
||||
</chainedmapper>
|
||||
</pathconvert>
|
||||
<taskdef classname="org.netbeans.modules.java.j2seproject.copylibstask.CopyLibs" name="copylibs" classpath="${libs.CopyLibs.classpath}"/>
|
||||
<copylibs manifest="${manifest.file}" runtimeclasspath="${run.classpath.without.build.classes.dir}" jarfile="${dist.jar}" compress="${jar.compress}">
|
||||
<fileset dir="${build.classes.dir}"/>
|
||||
<manifest>
|
||||
<attribute name="Main-Class" value="${main.class}"/>
|
||||
<attribute name="Class-Path" value="${jar.classpath}"/>
|
||||
</manifest>
|
||||
</copylibs>
|
||||
<echo>To run this application from the command line without Ant, try:</echo>
|
||||
<property name="dist.jar.resolved" location="${dist.jar}"/>
|
||||
<echo>java -jar "${dist.jar.resolved}"</echo>
|
||||
</target>
|
||||
<target name="-post-jar">
|
||||
<!-- Empty placeholder for easier customization. -->
|
||||
<!-- You can override this target in the ../build.xml file. -->
|
||||
</target>
|
||||
<target name="jar" depends="init,compile,-pre-jar,-do-jar-with-manifest,-do-jar-without-manifest,-do-jar-with-mainclass,-do-jar-with-libraries,-post-jar" description="Build JAR."/>
|
||||
<!--
|
||||
=================
|
||||
EXECUTION SECTION
|
||||
=================
|
||||
-->
|
||||
<target name="run" depends="init,compile" description="Run a main class.">
|
||||
<j2seproject1:java>
|
||||
<customize>
|
||||
<arg line="${application.args}"/>
|
||||
</customize>
|
||||
</j2seproject1:java>
|
||||
</target>
|
||||
<target name="run-single" depends="init,compile-single">
|
||||
<fail unless="run.class">Must select one file in the IDE or set run.class</fail>
|
||||
<j2seproject1:java classname="${run.class}"/>
|
||||
</target>
|
||||
<!--
|
||||
=================
|
||||
DEBUGGING SECTION
|
||||
=================
|
||||
-->
|
||||
<target name="-debug-start-debugger" if="netbeans.home" depends="init">
|
||||
<j2seproject1:nbjpdastart name="${debug.class}"/>
|
||||
</target>
|
||||
<target name="-debug-start-debuggee" depends="init,compile">
|
||||
<j2seproject3:debug>
|
||||
<customize>
|
||||
<arg line="${application.args}"/>
|
||||
</customize>
|
||||
</j2seproject3:debug>
|
||||
</target>
|
||||
<target name="debug" if="netbeans.home" depends="init,compile,-debug-start-debugger,-debug-start-debuggee" description="Debug project in IDE."/>
|
||||
<target name="-debug-start-debugger-stepinto" if="netbeans.home" depends="init">
|
||||
<j2seproject1:nbjpdastart stopclassname="${main.class}"/>
|
||||
</target>
|
||||
<target name="debug-stepinto" if="netbeans.home" depends="init,compile,-debug-start-debugger-stepinto,-debug-start-debuggee"/>
|
||||
<target name="-debug-start-debuggee-single" if="netbeans.home" depends="init,compile-single">
|
||||
<fail unless="debug.class">Must select one file in the IDE or set debug.class</fail>
|
||||
<j2seproject3:debug classname="${debug.class}"/>
|
||||
</target>
|
||||
<target name="debug-single" if="netbeans.home" depends="init,compile-single,-debug-start-debugger,-debug-start-debuggee-single"/>
|
||||
<target name="-pre-debug-fix" depends="init">
|
||||
<fail unless="fix.includes">Must set fix.includes</fail>
|
||||
<property name="javac.includes" value="${fix.includes}.java"/>
|
||||
</target>
|
||||
<target name="-do-debug-fix" if="netbeans.home" depends="init,-pre-debug-fix,compile-single">
|
||||
<j2seproject1:nbjpdareload/>
|
||||
</target>
|
||||
<target name="debug-fix" if="netbeans.home" depends="init,-pre-debug-fix,-do-debug-fix"/>
|
||||
<!--
|
||||
===============
|
||||
JAVADOC SECTION
|
||||
===============
|
||||
-->
|
||||
<target name="-javadoc-build" depends="init">
|
||||
<mkdir dir="${dist.javadoc.dir}"/>
|
||||
<javadoc destdir="${dist.javadoc.dir}" source="${javac.source}" notree="${javadoc.notree}" use="${javadoc.use}" nonavbar="${javadoc.nonavbar}" noindex="${javadoc.noindex}" splitindex="${javadoc.splitindex}" author="${javadoc.author}" version="${javadoc.version}" windowtitle="${javadoc.windowtitle}" private="${javadoc.private}" additionalparam="${javadoc.additionalparam}" failonerror="true" useexternalfile="true">
|
||||
<classpath>
|
||||
<path path="${javac.classpath}"/>
|
||||
</classpath>
|
||||
<sourcepath>
|
||||
<pathelement location="${src.dir}"/>
|
||||
</sourcepath>
|
||||
<packageset dir="${src.dir}" includes="*/**"/>
|
||||
<fileset dir="${src.dir}" includes="*.java"/>
|
||||
</javadoc>
|
||||
</target>
|
||||
<target name="-javadoc-browse" if="netbeans.home" unless="no.javadoc.preview" depends="init,-javadoc-build">
|
||||
<nbbrowse file="${dist.javadoc.dir}/index.html"/>
|
||||
</target>
|
||||
<target name="javadoc" depends="init,-javadoc-build,-javadoc-browse" description="Build Javadoc."/>
|
||||
<!--
|
||||
=========================
|
||||
JUNIT COMPILATION SECTION
|
||||
=========================
|
||||
-->
|
||||
<target name="-pre-pre-compile-test" if="have.tests" depends="init,compile">
|
||||
<mkdir dir="${build.test.classes.dir}"/>
|
||||
</target>
|
||||
<target name="-pre-compile-test">
|
||||
<!-- Empty placeholder for easier customization. -->
|
||||
<!-- You can override this target in the ../build.xml file. -->
|
||||
</target>
|
||||
<target name="-do-compile-test" if="have.tests" depends="init,compile,-pre-pre-compile-test,-pre-compile-test">
|
||||
<j2seproject3:javac srcdir="${test.src.dir}" destdir="${build.test.classes.dir}" debug="true" classpath="${javac.test.classpath}"/>
|
||||
<copy todir="${build.test.classes.dir}">
|
||||
<fileset dir="${test.src.dir}" excludes="**/*.java"/>
|
||||
</copy>
|
||||
</target>
|
||||
<target name="-post-compile-test">
|
||||
<!-- Empty placeholder for easier customization. -->
|
||||
<!-- You can override this target in the ../build.xml file. -->
|
||||
</target>
|
||||
<target name="compile-test" depends="init,compile,-pre-pre-compile-test,-pre-compile-test,-do-compile-test,-post-compile-test"/>
|
||||
<target name="-pre-compile-test-single">
|
||||
<!-- Empty placeholder for easier customization. -->
|
||||
<!-- You can override this target in the ../build.xml file. -->
|
||||
</target>
|
||||
<target name="-do-compile-test-single" if="have.tests" depends="init,compile,-pre-pre-compile-test,-pre-compile-test-single">
|
||||
<fail unless="javac.includes">Must select some files in the IDE or set javac.includes</fail>
|
||||
<j2seproject3:javac srcdir="${test.src.dir}" destdir="${build.test.classes.dir}" debug="true" classpath="${javac.test.classpath}">
|
||||
<customize>
|
||||
<patternset includes="${javac.includes}"/>
|
||||
</customize>
|
||||
</j2seproject3:javac>
|
||||
<copy todir="${build.test.classes.dir}">
|
||||
<fileset dir="${test.src.dir}" excludes="**/*.java"/>
|
||||
</copy>
|
||||
</target>
|
||||
<target name="-post-compile-test-single">
|
||||
<!-- Empty placeholder for easier customization. -->
|
||||
<!-- You can override this target in the ../build.xml file. -->
|
||||
</target>
|
||||
<target name="compile-test-single" depends="init,compile,-pre-pre-compile-test,-pre-compile-test-single,-do-compile-test-single,-post-compile-test-single"/>
|
||||
<!--
|
||||
=======================
|
||||
JUNIT EXECUTION SECTION
|
||||
=======================
|
||||
-->
|
||||
<target name="-pre-test-run" if="have.tests" depends="init">
|
||||
<mkdir dir="${build.test.results.dir}"/>
|
||||
</target>
|
||||
<target name="-do-test-run" if="have.tests" depends="init,compile-test,-pre-test-run">
|
||||
<j2seproject3:junit/>
|
||||
</target>
|
||||
<target name="-post-test-run" if="have.tests" depends="init,compile-test,-pre-test-run,-do-test-run">
|
||||
<fail if="tests.failed">Some tests failed; see details above.</fail>
|
||||
</target>
|
||||
<target name="test-report" if="have.tests" depends="init"/>
|
||||
<target name="-test-browse" if="netbeans.home+have.tests" depends="init"/>
|
||||
<target name="test" depends="init,compile-test,-pre-test-run,-do-test-run,test-report,-post-test-run,-test-browse" description="Run unit tests."/>
|
||||
<target name="-pre-test-run-single" if="have.tests" depends="init">
|
||||
<mkdir dir="${build.test.results.dir}"/>
|
||||
</target>
|
||||
<target name="-do-test-run-single" if="have.tests" depends="init,compile-test-single,-pre-test-run-single">
|
||||
<fail unless="test.includes">Must select some files in the IDE or set test.includes</fail>
|
||||
<j2seproject3:junit includes="${test.includes}"/>
|
||||
</target>
|
||||
<target name="-post-test-run-single" if="have.tests" depends="init,compile-test-single,-pre-test-run-single,-do-test-run-single">
|
||||
<fail if="tests.failed">Some tests failed; see details above.</fail>
|
||||
</target>
|
||||
<target name="test-single" depends="init,compile-test-single,-pre-test-run-single,-do-test-run-single,-post-test-run-single" description="Run single unit test."/>
|
||||
<!--
|
||||
=======================
|
||||
JUNIT DEBUGGING SECTION
|
||||
=======================
|
||||
-->
|
||||
<target name="-debug-start-debuggee-test" if="have.tests" depends="init,compile-test">
|
||||
<fail unless="test.class">Must select one file in the IDE or set test.class</fail>
|
||||
<j2seproject3:debug classname="junit.textui.TestRunner" classpath="${debug.test.classpath}">
|
||||
<customize>
|
||||
<arg line="${test.class}"/>
|
||||
</customize>
|
||||
</j2seproject3:debug>
|
||||
</target>
|
||||
<target name="-debug-start-debugger-test" if="netbeans.home+have.tests" depends="init,compile-test">
|
||||
<j2seproject1:nbjpdastart name="${test.class}" classpath="${debug.test.classpath}"/>
|
||||
</target>
|
||||
<target name="debug-test" depends="init,compile-test,-debug-start-debugger-test,-debug-start-debuggee-test"/>
|
||||
<target name="-do-debug-fix-test" if="netbeans.home" depends="init,-pre-debug-fix,compile-test-single">
|
||||
<j2seproject1:nbjpdareload dir="${build.test.classes.dir}"/>
|
||||
</target>
|
||||
<target name="debug-fix-test" if="netbeans.home" depends="init,-pre-debug-fix,-do-debug-fix-test"/>
|
||||
<!--
|
||||
=========================
|
||||
APPLET EXECUTION SECTION
|
||||
=========================
|
||||
-->
|
||||
<target name="run-applet" depends="init,compile-single">
|
||||
<fail unless="applet.url">Must select one file in the IDE or set applet.url</fail>
|
||||
<j2seproject1:java classname="sun.applet.AppletViewer">
|
||||
<customize>
|
||||
<arg value="${applet.url}"/>
|
||||
</customize>
|
||||
</j2seproject1:java>
|
||||
</target>
|
||||
<!--
|
||||
=========================
|
||||
APPLET DEBUGGING SECTION
|
||||
=========================
|
||||
-->
|
||||
<target name="-debug-start-debuggee-applet" if="netbeans.home" depends="init,compile-single">
|
||||
<fail unless="applet.url">Must select one file in the IDE or set applet.url</fail>
|
||||
<j2seproject3:debug classname="sun.applet.AppletViewer">
|
||||
<customize>
|
||||
<arg value="${applet.url}"/>
|
||||
</customize>
|
||||
</j2seproject3:debug>
|
||||
</target>
|
||||
<target name="debug-applet" if="netbeans.home" depends="init,compile-single,-debug-start-debugger,-debug-start-debuggee-applet"/>
|
||||
<!--
|
||||
===============
|
||||
CLEANUP SECTION
|
||||
===============
|
||||
-->
|
||||
<target name="deps-clean" depends="init" unless="no.deps"/>
|
||||
<target name="-do-clean" depends="init">
|
||||
<delete dir="${build.dir}"/>
|
||||
<delete dir="${dist.dir}"/>
|
||||
</target>
|
||||
<target name="-post-clean">
|
||||
<!-- Empty placeholder for easier customization. -->
|
||||
<!-- You can override this target in the ../build.xml file. -->
|
||||
</target>
|
||||
<target name="clean" depends="init,deps-clean,-do-clean,-post-clean" description="Clean build products."/>
|
||||
</project>
|
||||
@@ -0,0 +1,67 @@
|
||||
application.args=
|
||||
build.classes.dir=${build.dir}/classes
|
||||
build.classes.excludes=**/*.java
|
||||
# This directory is removed when the project is cleaned:
|
||||
build.dir=build
|
||||
build.generated.dir=${build.dir}/generated
|
||||
# Only compile against the classpath explicitly listed here:
|
||||
build.sysclasspath=ignore
|
||||
build.test.classes.dir=${build.dir}/test/classes
|
||||
build.test.results.dir=${build.dir}/test/results
|
||||
debug.classpath=\
|
||||
${run.classpath}
|
||||
debug.test.classpath=\
|
||||
${run.test.classpath}
|
||||
# This directory is removed when the project is cleaned:
|
||||
dist.dir=dist
|
||||
dist.jar=${dist.dir}/jna-platform.jar
|
||||
dist.javadoc.dir=${dist.dir}/javadoc
|
||||
file.reference.jna.jar=../../build/jna.jar
|
||||
file.reference.jna-test.jar=../../build/jna-test.jar
|
||||
libs.junit.classpath=../../lib/junit.jar
|
||||
jar.compress=false
|
||||
javac.classpath=\
|
||||
${file.reference.jna.jar}:\
|
||||
${file.reference.jna.build}/test-classes
|
||||
# Space-separated list of extra javac options
|
||||
javac.compilerargs=
|
||||
javac.deprecation=false
|
||||
javac.source=1.5
|
||||
javac.target=1.5
|
||||
javac.test.classpath=\
|
||||
${javac.classpath}:\
|
||||
${file.reference.jna-test.jar}:\
|
||||
${build.classes.dir}:\
|
||||
${libs.junit.classpath}
|
||||
javadoc.additionalparam=
|
||||
javadoc.author=false
|
||||
javadoc.encoding=
|
||||
javadoc.noindex=false
|
||||
javadoc.nonavbar=false
|
||||
javadoc.notree=false
|
||||
javadoc.private=false
|
||||
javadoc.splitindex=true
|
||||
javadoc.use=true
|
||||
javadoc.version=false
|
||||
javadoc.windowtitle=
|
||||
main.class=
|
||||
manifest.file=manifest.mf
|
||||
meta.inf.dir=${src.dir}/META-INF
|
||||
platform.active=default_platform
|
||||
run.classpath=\
|
||||
${javac.classpath}:\
|
||||
${build.classes.dir}
|
||||
# Space-separated list of JVM arguments used when running the project
|
||||
# (you may also define separate properties like run-sys-prop.name=value instead of -Dname=value
|
||||
# or test-sys-prop.name=value to set system properties for unit tests):
|
||||
run.jvmargs=
|
||||
run.test.classpath=\
|
||||
${javac.test.classpath}:\
|
||||
../../lib/test/reflections-0.9.8.jar:\
|
||||
../../lib/test/guava-11.0.2.jar:\
|
||||
../../lib/test/javassist-3.12.1.GA.jar:\
|
||||
../../lib/test/slf4j-api-1.6.1.jar:\
|
||||
../../lib/test/dom4j-1.6.1.jar:\
|
||||
${build.test.classes.dir}
|
||||
src.dir=src
|
||||
test.src.dir=test
|
||||
@@ -0,0 +1,16 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://www.netbeans.org/ns/project/1">
|
||||
<type>org.netbeans.modules.java.j2seproject</type>
|
||||
<configuration>
|
||||
<data xmlns="http://www.netbeans.org/ns/j2se-project/3">
|
||||
<name>platform</name>
|
||||
<minimum-ant-version>1.6.5</minimum-ant-version>
|
||||
<source-roots>
|
||||
<root id="src.dir"/>
|
||||
</source-roots>
|
||||
<test-roots>
|
||||
<root id="test.src.dir"/>
|
||||
</test-roots>
|
||||
</data>
|
||||
</configuration>
|
||||
</project>
|
||||
@@ -0,0 +1,13 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module version="4">
|
||||
<component name="NewModuleRootManager" inherit-compiler-output="true">
|
||||
<exclude-output />
|
||||
<content url="file://$MODULE_DIR$">
|
||||
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/test" isTestSource="true" />
|
||||
</content>
|
||||
<orderEntry type="inheritedJdk" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
</component>
|
||||
</module>
|
||||
|
||||
@@ -0,0 +1,62 @@
|
||||
/*
|
||||
* Copyright 2014 Martin Steiger
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.sun.jna.platform;
|
||||
|
||||
import com.sun.jna.FromNativeContext;
|
||||
import com.sun.jna.ToNativeContext;
|
||||
import com.sun.jna.TypeConverter;
|
||||
|
||||
/**
|
||||
* A {@link TypeConverter} that maps an integer enum value to
|
||||
* an actual Java enum.
|
||||
* @param <T> the enum type
|
||||
* @author Martin Steiger
|
||||
*/
|
||||
public class EnumConverter<T extends Enum<T>> implements TypeConverter {
|
||||
|
||||
private final Class<T> clazz;
|
||||
|
||||
/**
|
||||
* @param clazz the enum class
|
||||
*/
|
||||
public EnumConverter(Class<T> clazz)
|
||||
{
|
||||
this.clazz = clazz;
|
||||
}
|
||||
|
||||
@Override
|
||||
public T fromNative(Object input, FromNativeContext context) {
|
||||
Integer i = (Integer) input;
|
||||
|
||||
T[] vals = clazz.getEnumConstants();
|
||||
return vals[i];
|
||||
}
|
||||
|
||||
@Override
|
||||
public Integer toNative(Object input, ToNativeContext context) {
|
||||
T t = clazz.cast(input);
|
||||
|
||||
return Integer.valueOf(t.ordinal());
|
||||
}
|
||||
|
||||
@Override
|
||||
public Class<Integer> nativeType() {
|
||||
return Integer.class;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,105 @@
|
||||
/*
|
||||
* Copyright 2014 Martin Steiger
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.sun.jna.platform;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
import com.sun.jna.platform.win32.FlagEnum;
|
||||
|
||||
/**
|
||||
* Several helper methods to convert integer flag (sets)
|
||||
* into enum (sets)
|
||||
* @author Martin Steiger
|
||||
*/
|
||||
public class EnumUtils
|
||||
{
|
||||
/**
|
||||
* Uninitialized integer flag
|
||||
*/
|
||||
public static final int UNINITIALIZED = -1;
|
||||
|
||||
/**
|
||||
* @param val the enum
|
||||
* @return the index of the enum in the enum list
|
||||
*/
|
||||
public static <E extends Enum<E>> int toInteger(E val)
|
||||
{
|
||||
@SuppressWarnings("unchecked")
|
||||
E[] vals = (E[]) val.getClass().getEnumConstants();
|
||||
|
||||
for (int idx = 0; idx < vals.length; idx++)
|
||||
{
|
||||
if (vals[idx] == val)
|
||||
return idx;
|
||||
}
|
||||
|
||||
throw new IllegalArgumentException();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param idx the enum index
|
||||
* @param clazz the enum class
|
||||
* @return the enum at position idx
|
||||
*/
|
||||
public static <E extends Enum<E>> E fromInteger(int idx, Class<E> clazz)
|
||||
{
|
||||
if (idx == UNINITIALIZED)
|
||||
return null;
|
||||
|
||||
E[] vals = clazz.getEnumConstants();
|
||||
return vals[idx];
|
||||
}
|
||||
|
||||
/**
|
||||
* @param flags the ORed flags
|
||||
* @param clazz the enum class
|
||||
* @return the representing set
|
||||
*/
|
||||
public static <T extends FlagEnum> Set<T> setFromInteger(int flags, Class<T> clazz)
|
||||
{
|
||||
T[] vals = clazz.getEnumConstants();
|
||||
Set<T> result = new HashSet<T>();
|
||||
|
||||
for (T val : vals)
|
||||
{
|
||||
if ((flags & val.getFlag()) != 0)
|
||||
{
|
||||
result.add(val);
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param set the set to convert
|
||||
* @return the flags combined into an integer
|
||||
*/
|
||||
public static <T extends FlagEnum> int setToInteger(Set<T> set) {
|
||||
int sum = 0;
|
||||
|
||||
for (T t : set)
|
||||
{
|
||||
sum |= t.getFlag();
|
||||
}
|
||||
|
||||
return sum;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,135 @@
|
||||
/* Copyright (c) 2007 Timothy Wall, All Rights Reserved
|
||||
*
|
||||
* 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.
|
||||
* <p/>
|
||||
* 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.
|
||||
*/
|
||||
package com.sun.jna.platform;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.EventObject;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import com.sun.jna.platform.win32.W32FileMonitor;
|
||||
|
||||
/** Provides notification of file system changes. Actual capabilities may
|
||||
* vary slightly by platform.
|
||||
* <p>
|
||||
* Watched files which are removed from the filesystem are no longer watched.
|
||||
* @author twall
|
||||
*/
|
||||
|
||||
@SuppressWarnings("serial")
|
||||
public abstract class FileMonitor {
|
||||
|
||||
public static final int FILE_CREATED = 0x1;
|
||||
public static final int FILE_DELETED = 0x2;
|
||||
public static final int FILE_MODIFIED = 0x4;
|
||||
public static final int FILE_ACCESSED = 0x8;
|
||||
public static final int FILE_NAME_CHANGED_OLD = 0x10;
|
||||
public static final int FILE_NAME_CHANGED_NEW = 0x20;
|
||||
public static final int FILE_RENAMED = FILE_NAME_CHANGED_OLD|FILE_NAME_CHANGED_NEW;
|
||||
public static final int FILE_SIZE_CHANGED = 0x40;
|
||||
public static final int FILE_ATTRIBUTES_CHANGED = 0x80;
|
||||
public static final int FILE_SECURITY_CHANGED = 0x100;
|
||||
public static final int FILE_ANY = 0x1FF;
|
||||
|
||||
public interface FileListener {
|
||||
public void fileChanged(FileEvent e);
|
||||
}
|
||||
|
||||
public class FileEvent extends EventObject {
|
||||
private final File file;
|
||||
private final int type;
|
||||
public FileEvent(File file, int type) {
|
||||
super(FileMonitor.this);
|
||||
this.file = file;
|
||||
this.type = type;
|
||||
}
|
||||
public File getFile() { return file; }
|
||||
public int getType() { return type; }
|
||||
public String toString() {
|
||||
return "FileEvent: " + file + ":" + type;
|
||||
}
|
||||
}
|
||||
|
||||
private final Map<File, Integer> watched = new HashMap<File, Integer>();
|
||||
private List<FileListener> listeners = new ArrayList<FileListener>();
|
||||
|
||||
protected abstract void watch(File file, int mask, boolean recursive) throws IOException ;
|
||||
protected abstract void unwatch(File file);
|
||||
public abstract void dispose();
|
||||
|
||||
public void addWatch(File dir) throws IOException {
|
||||
addWatch(dir, FILE_ANY);
|
||||
}
|
||||
|
||||
public void addWatch(File dir, int mask) throws IOException {
|
||||
addWatch(dir, mask, dir.isDirectory());
|
||||
}
|
||||
|
||||
public void addWatch(File dir, int mask, boolean recursive) throws IOException {
|
||||
watched.put(dir, new Integer(mask));
|
||||
watch(dir, mask, recursive);
|
||||
}
|
||||
|
||||
public void removeWatch(File file) {
|
||||
if (watched.remove(file) != null) {
|
||||
unwatch(file);
|
||||
}
|
||||
}
|
||||
|
||||
protected void notify(FileEvent e) {
|
||||
for (FileListener listener : listeners) {
|
||||
listener.fileChanged(e);
|
||||
}
|
||||
}
|
||||
|
||||
public synchronized void addFileListener(FileListener listener) {
|
||||
List<FileListener> list = new ArrayList<FileListener>(listeners);
|
||||
list.add(listener);
|
||||
listeners = list;
|
||||
}
|
||||
|
||||
public synchronized void removeFileListener(FileListener x) {
|
||||
List<FileListener> list = new ArrayList<FileListener>(listeners);
|
||||
list.remove(x);
|
||||
listeners = list;
|
||||
}
|
||||
|
||||
protected void finalize() {
|
||||
for (File watchedFile : watched.keySet()) {
|
||||
removeWatch(watchedFile);
|
||||
}
|
||||
|
||||
dispose();
|
||||
}
|
||||
|
||||
/** Canonical lazy loading of a singleton. */
|
||||
private static class Holder {
|
||||
public static final FileMonitor INSTANCE;
|
||||
static {
|
||||
String os = System.getProperty("os.name");
|
||||
if (os.startsWith("Windows")) {
|
||||
INSTANCE = new W32FileMonitor();
|
||||
}
|
||||
else {
|
||||
throw new Error("FileMonitor not implemented for " + os);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static FileMonitor getInstance() {
|
||||
return Holder.INSTANCE;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,106 @@
|
||||
/* Copyright (c) 2007 Timothy Wall, All Rights Reserved
|
||||
*
|
||||
* 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.
|
||||
* <p/>
|
||||
* 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.
|
||||
*/
|
||||
package com.sun.jna.platform;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import com.sun.jna.platform.mac.MacFileUtils;
|
||||
import com.sun.jna.platform.win32.W32FileUtils;
|
||||
|
||||
/** Miscellaneous file utils not provided for by Java. */
|
||||
public abstract class FileUtils {
|
||||
|
||||
public boolean hasTrash() {
|
||||
return false;
|
||||
}
|
||||
|
||||
/** Move the given file to the system trash, if one is available.
|
||||
Throws an exception on failure.
|
||||
*/
|
||||
public abstract void moveToTrash(File[] files) throws IOException;
|
||||
|
||||
/** Canonical lazy loading of a singleton. */
|
||||
private static class Holder {
|
||||
public static final FileUtils INSTANCE;
|
||||
static {
|
||||
String os = System.getProperty("os.name");
|
||||
if (os.startsWith("Windows")) {
|
||||
INSTANCE = new W32FileUtils();
|
||||
}
|
||||
else if (os.startsWith("Mac")){
|
||||
INSTANCE = new MacFileUtils();
|
||||
}
|
||||
else {
|
||||
INSTANCE = new DefaultFileUtils();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static FileUtils getInstance() {
|
||||
return Holder.INSTANCE;
|
||||
}
|
||||
|
||||
private static class DefaultFileUtils extends FileUtils {
|
||||
|
||||
private File getTrashDirectory() {
|
||||
// very simple implementation. should take care of renaming when
|
||||
// a file already exists, or any other platform-specific behavior
|
||||
File home = new File(System.getProperty("user.home"));
|
||||
File trash = new File(home, ".Trash");
|
||||
if (!trash.exists()) {
|
||||
trash = new File(home, "Trash");
|
||||
if (!trash.exists()) {
|
||||
File desktop = new File(home, "Desktop");
|
||||
if (desktop.exists()) {
|
||||
trash = new File(desktop, ".Trash");
|
||||
if (!trash.exists()) {
|
||||
trash = new File(desktop, "Trash");
|
||||
if (!trash.exists()) {
|
||||
trash = new File(System.getProperty("fileutils.trash", "Trash"));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return trash;
|
||||
}
|
||||
|
||||
public boolean hasTrash() {
|
||||
return getTrashDirectory().exists();
|
||||
}
|
||||
|
||||
/** The default implementation attempts to move the file to
|
||||
* the desktop "Trash" folder.
|
||||
*/
|
||||
public void moveToTrash(File[] files) throws IOException {
|
||||
File trash = getTrashDirectory();
|
||||
if (!trash.exists()) {
|
||||
throw new IOException("No trash location found (define fileutils.trash to be the path to the trash)");
|
||||
}
|
||||
List<File> failed = new ArrayList<File>();
|
||||
for (int i=0;i < files.length;i++) {
|
||||
File src = files[i];
|
||||
File target = new File(trash, src.getName());
|
||||
if (!src.renameTo(target)) {
|
||||
failed.add(src);
|
||||
}
|
||||
}
|
||||
if (failed.size() > 0) {
|
||||
throw new IOException("The following files could not be trashed: " + failed);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,169 @@
|
||||
/* Copyright (c) 2007 Timothy Wall, All Rights Reserved
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
package com.sun.jna.platform;
|
||||
|
||||
import java.awt.GraphicsEnvironment;
|
||||
import java.awt.HeadlessException;
|
||||
import java.awt.event.KeyEvent;
|
||||
|
||||
import com.sun.jna.Platform;
|
||||
import com.sun.jna.platform.unix.X11;
|
||||
import com.sun.jna.platform.unix.X11.Display;
|
||||
import com.sun.jna.platform.win32.User32;
|
||||
import com.sun.jna.platform.win32.WinUser;
|
||||
|
||||
/** Provide access to the local keyboard state. Note that this is meaningless
|
||||
* on a headless system and some VNC setups.
|
||||
*
|
||||
* @author twall
|
||||
*/
|
||||
// TODO: key clicks
|
||||
// TODO: auto-repeat
|
||||
// TODO: keyboard bell
|
||||
// TODO: led state
|
||||
public class KeyboardUtils {
|
||||
static final NativeKeyboardUtils INSTANCE;
|
||||
static {
|
||||
if (GraphicsEnvironment.isHeadless()) {
|
||||
throw new HeadlessException("KeyboardUtils requires a keyboard");
|
||||
}
|
||||
if (Platform.isWindows()) {
|
||||
INSTANCE = new W32KeyboardUtils();
|
||||
}
|
||||
else if (Platform.isMac()) {
|
||||
INSTANCE = new MacKeyboardUtils();
|
||||
throw new UnsupportedOperationException("No support (yet) for "
|
||||
+ System.getProperty("os.name"));
|
||||
}
|
||||
else {
|
||||
INSTANCE = new X11KeyboardUtils();
|
||||
}
|
||||
}
|
||||
|
||||
public static boolean isPressed(int keycode, int location) {
|
||||
return INSTANCE.isPressed(keycode, location);
|
||||
}
|
||||
public static boolean isPressed(int keycode) {
|
||||
return INSTANCE.isPressed(keycode);
|
||||
}
|
||||
|
||||
private static abstract class NativeKeyboardUtils {
|
||||
public abstract boolean isPressed(int keycode, int location);
|
||||
public boolean isPressed(int keycode) {
|
||||
return isPressed(keycode, KeyEvent.KEY_LOCATION_UNKNOWN);
|
||||
}
|
||||
}
|
||||
|
||||
private static class W32KeyboardUtils extends NativeKeyboardUtils {
|
||||
private int toNative(int code, int loc) {
|
||||
if ((code >= KeyEvent.VK_A && code <= KeyEvent.VK_Z)
|
||||
|| (code >= KeyEvent.VK_0 && code <= KeyEvent.VK_9)) {
|
||||
return code;
|
||||
}
|
||||
if (code == KeyEvent.VK_SHIFT) {
|
||||
if ((loc & KeyEvent.KEY_LOCATION_RIGHT) != 0) {
|
||||
return WinUser.VK_RSHIFT;
|
||||
}
|
||||
if ((loc & KeyEvent.KEY_LOCATION_LEFT) != 0) {
|
||||
return WinUser.VK_LSHIFT;
|
||||
}
|
||||
return WinUser.VK_SHIFT;
|
||||
}
|
||||
if (code == KeyEvent.VK_CONTROL) {
|
||||
if ((loc & KeyEvent.KEY_LOCATION_RIGHT) != 0) {
|
||||
return WinUser.VK_RCONTROL;
|
||||
}
|
||||
if ((loc & KeyEvent.KEY_LOCATION_LEFT) != 0) {
|
||||
return WinUser.VK_LCONTROL;
|
||||
}
|
||||
return WinUser.VK_CONTROL;
|
||||
}
|
||||
if (code == KeyEvent.VK_ALT) {
|
||||
if ((loc & KeyEvent.KEY_LOCATION_RIGHT) != 0) {
|
||||
return WinUser.VK_RMENU;
|
||||
}
|
||||
if ((loc & KeyEvent.KEY_LOCATION_LEFT) != 0) {
|
||||
return WinUser.VK_LMENU;
|
||||
}
|
||||
return WinUser.VK_MENU;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
public boolean isPressed(int keycode, int location) {
|
||||
User32 lib = User32.INSTANCE;
|
||||
return (lib.GetAsyncKeyState(toNative(keycode, location)) & 0x8000) != 0;
|
||||
}
|
||||
}
|
||||
private static class MacKeyboardUtils extends NativeKeyboardUtils {
|
||||
public boolean isPressed(int keycode, int location) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
private static class X11KeyboardUtils extends NativeKeyboardUtils {
|
||||
// TODO: fully map from X11 keycodes to java keycodes
|
||||
// this is a minimal implementation
|
||||
private int toKeySym(int code, int location) {
|
||||
if (code >= KeyEvent.VK_A && code <= KeyEvent.VK_Z)
|
||||
return X11.XK_a + (code - KeyEvent.VK_A);
|
||||
if (code >= KeyEvent.VK_0 && code <= KeyEvent.VK_9)
|
||||
return X11.XK_0 + (code - KeyEvent.VK_0);
|
||||
if (code == KeyEvent.VK_SHIFT) {
|
||||
if ((location & KeyEvent.KEY_LOCATION_RIGHT) != 0)
|
||||
return X11.XK_Shift_R;
|
||||
return X11.XK_Shift_L;
|
||||
}
|
||||
if (code == KeyEvent.VK_CONTROL) {
|
||||
if ((location & KeyEvent.KEY_LOCATION_RIGHT) != 0)
|
||||
return X11.XK_Control_R;
|
||||
return X11.XK_Control_L;
|
||||
}
|
||||
if (code == KeyEvent.VK_ALT) {
|
||||
if ((location & KeyEvent.KEY_LOCATION_RIGHT) != 0)
|
||||
return X11.XK_Alt_R;
|
||||
return X11.XK_Alt_L;
|
||||
}
|
||||
if (code == KeyEvent.VK_META) {
|
||||
if ((location & KeyEvent.KEY_LOCATION_RIGHT) != 0)
|
||||
return X11.XK_Meta_R;
|
||||
return X11.XK_Meta_L;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
public boolean isPressed(int keycode, int location) {
|
||||
X11 lib = X11.INSTANCE;
|
||||
Display dpy = lib.XOpenDisplay(null);
|
||||
if (dpy == null) {
|
||||
throw new Error("Can't open X Display");
|
||||
}
|
||||
try {
|
||||
byte[] keys = new byte[32];
|
||||
// Ignore the return value
|
||||
lib.XQueryKeymap(dpy, keys);
|
||||
int keysym = toKeySym(keycode, location);
|
||||
for (int code=5;code < 256;code++) {
|
||||
int idx = code / 8;
|
||||
int shift = code % 8;
|
||||
if ((keys[idx] & (1 << shift)) != 0) {
|
||||
int sym = lib.XKeycodeToKeysym(dpy, (byte)code, 0).intValue();
|
||||
if (sym == keysym)
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
finally {
|
||||
lib.XCloseDisplay(dpy);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,258 @@
|
||||
/* Copyright (c) 2007 Olivier Chafik, All Rights Reserved
|
||||
* Copyright (c) 2008 Timothy Wall, All Rights Reserved
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
package com.sun.jna.platform;
|
||||
|
||||
import java.awt.Rectangle;
|
||||
import java.awt.image.DataBuffer;
|
||||
import java.awt.image.DataBufferByte;
|
||||
import java.awt.image.DataBufferInt;
|
||||
import java.awt.image.MultiPixelPackedSampleModel;
|
||||
import java.awt.image.Raster;
|
||||
import java.awt.image.SampleModel;
|
||||
import java.awt.image.SinglePixelPackedSampleModel;
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.HashSet;
|
||||
import java.util.Iterator;
|
||||
import java.util.Set;
|
||||
import java.util.TreeSet;
|
||||
|
||||
/**
|
||||
* Methods that are useful to decompose a raster into a set of rectangles.
|
||||
* An occupied pixel has two possible meanings, depending on the raster :
|
||||
* <ul>
|
||||
* <li>if the raster has an alpha layer, occupied means with alpha not null</li>
|
||||
* <li>if the raster doesn't have any alpha layer, occupied means not completely black</li>
|
||||
* </ul>
|
||||
* @author Olivier Chafik
|
||||
*/
|
||||
public class RasterRangesUtils {
|
||||
/// Masks used to isolate the current column in a set of 8 binary columns packed in a byte
|
||||
private static final int[] subColMasks = new int[] {
|
||||
0x0080, 0x0040, 0x0020, 0x0010,
|
||||
0x0008, 0x0004, 0x0002, 0x0001
|
||||
};
|
||||
|
||||
private static final Comparator<Object> COMPARATOR = new Comparator<Object>() {
|
||||
public int compare(Object o1, Object o2) {
|
||||
return ((Rectangle)o1).x - ((Rectangle)o2).x;
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Abstraction of a sink for ranges.
|
||||
*/
|
||||
public static interface RangesOutput {
|
||||
/**
|
||||
* Output a rectangular range.
|
||||
* @param x x coordinate of the top-left corner of the range
|
||||
* @param y y coordinate of the top-left corner of the range
|
||||
* @param w width of the range
|
||||
* @param h height of the range
|
||||
* @return true if the output succeeded, false otherwise
|
||||
*/
|
||||
boolean outputRange(int x, int y, int w, int h);
|
||||
}
|
||||
|
||||
/**
|
||||
* Outputs ranges of occupied pixels.
|
||||
* In a raster that has an alpha layer, a pixel is occupied if its alpha value is not null.
|
||||
* In a raster without alpha layer, a pixel is occupied if it is not completely black.
|
||||
* @param raster image to be segmented in non black or non-transparent ranges
|
||||
* @param out destination of the non null ranges
|
||||
* @return true if the output succeeded, false otherwise
|
||||
*/
|
||||
public static boolean outputOccupiedRanges(Raster raster, RangesOutput out) {
|
||||
Rectangle bounds = raster.getBounds();
|
||||
SampleModel sampleModel = raster.getSampleModel();
|
||||
boolean hasAlpha = sampleModel.getNumBands() == 4;
|
||||
|
||||
// Try to use the underlying data array directly for a few common raster formats
|
||||
if (raster.getParent() == null && bounds.x == 0 && bounds.y == 0) {
|
||||
// No support for subraster (as obtained with Image.getSubimage(...))
|
||||
|
||||
DataBuffer data = raster.getDataBuffer();
|
||||
if (data.getNumBanks() == 1) {
|
||||
// There is always a single bank for all BufferedImage types, except maybe TYPE_CUSTOM
|
||||
|
||||
if (sampleModel instanceof MultiPixelPackedSampleModel) {
|
||||
MultiPixelPackedSampleModel packedSampleModel = (MultiPixelPackedSampleModel)sampleModel;
|
||||
if (packedSampleModel.getPixelBitStride() == 1) {
|
||||
// TYPE_BYTE_BINARY
|
||||
return outputOccupiedRangesOfBinaryPixels(((DataBufferByte)data).getData(), bounds.width, bounds.height, out);
|
||||
}
|
||||
} else if (sampleModel instanceof SinglePixelPackedSampleModel) {
|
||||
if (sampleModel.getDataType() == DataBuffer.TYPE_INT) {
|
||||
// TYPE_INT_ARGB, TYPE_INT_ARGB_PRE, TYPE_INT_BGR or TYPE_INT_RGB
|
||||
return outputOccupiedRanges(((DataBufferInt)data).getData(), bounds.width, bounds.height, hasAlpha ? 0xff000000 : 0xffffff, out);
|
||||
}
|
||||
// TODO could easily handle cases of TYPE_USHORT_GRAY and TYPE_BYTE_GRAY.
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Fallback behaviour : copy pixels of raster
|
||||
int[] pixels = raster.getPixels(0, 0, bounds.width, bounds.height, (int[])null);
|
||||
return outputOccupiedRanges(pixels, bounds.width, bounds.height, hasAlpha ? 0xff000000 : 0xffffff, out);
|
||||
}
|
||||
|
||||
/**
|
||||
* Output the non-null values of a binary image as ranges of contiguous values.
|
||||
* @param binaryBits byte-packed binary bits of an image
|
||||
* @param w width of the image (in pixels)
|
||||
* @param h height of the image
|
||||
* @param out
|
||||
* @return true if the output succeeded, false otherwise
|
||||
*/
|
||||
public static boolean outputOccupiedRangesOfBinaryPixels(byte[] binaryBits, int w, int h, RangesOutput out) {
|
||||
Set<Rectangle> rects = new HashSet<Rectangle>();
|
||||
Set<Rectangle> prevLine = Collections.EMPTY_SET;
|
||||
int scanlineBytes = binaryBits.length / h;
|
||||
for (int row = 0; row < h; row++) {
|
||||
Set<Rectangle> curLine = new TreeSet<Rectangle>(COMPARATOR);
|
||||
int rowOffsetBytes = row * scanlineBytes;
|
||||
int startCol = -1;
|
||||
// Look at each batch of 8 columns in this row
|
||||
for (int byteCol = 0; byteCol < scanlineBytes; byteCol++) {
|
||||
int firstByteCol = byteCol << 3;
|
||||
byte byteColBits = binaryBits[rowOffsetBytes + byteCol];
|
||||
if (byteColBits == 0) {
|
||||
// all 8 bits are zeroes
|
||||
if (startCol >= 0) {
|
||||
// end of current region
|
||||
curLine.add(new Rectangle(startCol, row, firstByteCol - startCol, 1));
|
||||
startCol = -1;
|
||||
}
|
||||
} else if (byteColBits == 0xff) {
|
||||
// all 8 bits are ones
|
||||
if (startCol < 0) {
|
||||
// start of new region
|
||||
startCol = firstByteCol;
|
||||
}
|
||||
} else {
|
||||
// mixed case : some bits are ones, others are zeroes
|
||||
for (int subCol = 0; subCol < 8; subCol++) {
|
||||
int col = firstByteCol | subCol;
|
||||
if ((byteColBits & subColMasks[subCol]) != 0) {
|
||||
if (startCol < 0) {
|
||||
// start of new region
|
||||
startCol = col;
|
||||
}
|
||||
} else {
|
||||
if (startCol >= 0) {
|
||||
// end of current region
|
||||
curLine.add(new Rectangle(startCol, row, col - startCol, 1));
|
||||
startCol = -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (startCol >= 0) {
|
||||
// end of last region
|
||||
curLine.add(new Rectangle(startCol, row, w - startCol, 1));
|
||||
}
|
||||
Set<Rectangle> unmerged = mergeRects(prevLine, curLine);
|
||||
rects.addAll(unmerged);
|
||||
prevLine = curLine;
|
||||
}
|
||||
// Add anything left over
|
||||
rects.addAll(prevLine);
|
||||
for (Iterator<Rectangle> i=rects.iterator();i.hasNext();) {
|
||||
Rectangle r = i.next();
|
||||
if (!out.outputRange(r.x, r.y, r.width, r.height)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Output the occupied values of an integer-pixels image as ranges of contiguous values.
|
||||
* A pixel is considered occupied if the bitwise AND of its integer value with the provided occupationMask is not null.
|
||||
* @param pixels integer values of the pixels of an image
|
||||
* @param w width of the image (in pixels)
|
||||
* @param h height of the image
|
||||
* @param occupationMask mask used to select which bits are used in a pixel to check its occupied status. 0xff000000 would only take the alpha layer into account, for instance.
|
||||
* @param out where to output all the contiguous ranges of non occupied pixels
|
||||
* @return true if the output succeeded, false otherwise
|
||||
*/
|
||||
public static boolean outputOccupiedRanges(int[] pixels, int w, int h, int occupationMask, RangesOutput out) {
|
||||
Set<Rectangle> rects = new HashSet<Rectangle>();
|
||||
Set<Rectangle> prevLine = Collections.EMPTY_SET;
|
||||
for (int row = 0; row < h; row++) {
|
||||
Set<Rectangle> curLine = new TreeSet<Rectangle>(COMPARATOR);
|
||||
int idxOffset = row * w;
|
||||
int startCol = -1;
|
||||
|
||||
for (int col = 0; col < w; col++) {
|
||||
if ((pixels[idxOffset + col] & occupationMask) != 0) {
|
||||
if (startCol < 0) {
|
||||
startCol = col;
|
||||
}
|
||||
} else {
|
||||
if (startCol >= 0) {
|
||||
// end of current region
|
||||
curLine.add(new Rectangle(startCol, row, col-startCol, 1));
|
||||
startCol = -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (startCol >= 0) {
|
||||
// end of last region of current row
|
||||
curLine.add(new Rectangle(startCol, row, w-startCol, 1));
|
||||
}
|
||||
Set<Rectangle> unmerged = mergeRects(prevLine, curLine);
|
||||
rects.addAll(unmerged);
|
||||
prevLine = curLine;
|
||||
}
|
||||
// Add anything left over
|
||||
rects.addAll(prevLine);
|
||||
for (Iterator<Rectangle> i=rects.iterator();i.hasNext();) {
|
||||
Rectangle r = i.next();
|
||||
if (!out.outputRange(r.x, r.y, r.width, r.height)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private static Set<Rectangle> mergeRects(Set<Rectangle> prev, Set<Rectangle> current) {
|
||||
Set<Rectangle> unmerged = new HashSet<Rectangle>(prev);
|
||||
if (!prev.isEmpty() && !current.isEmpty()) {
|
||||
Rectangle[] pr = prev.toArray(new Rectangle[prev.size()]);
|
||||
Rectangle[] cr = current.toArray(new Rectangle[current.size()]);
|
||||
int ipr = 0;
|
||||
int icr = 0;
|
||||
while (ipr < pr.length && icr < cr.length) {
|
||||
while (cr[icr].x < pr[ipr].x) {
|
||||
if (++icr == cr.length) {
|
||||
return unmerged;
|
||||
}
|
||||
}
|
||||
if (cr[icr].x == pr[ipr].x && cr[icr].width == pr[ipr].width) {
|
||||
unmerged.remove(pr[ipr]);
|
||||
cr[icr].y = pr[ipr].y;
|
||||
cr[icr].height = pr[ipr].height + 1;
|
||||
++icr;
|
||||
}
|
||||
else {
|
||||
++ipr;
|
||||
}
|
||||
}
|
||||
}
|
||||
return unmerged;
|
||||
}
|
||||
|
||||
}
|
||||
Diferenças do arquivo suprimidas por serem muito extensas
Carregar Diff
@@ -0,0 +1,533 @@
|
||||
/* Copyright (c) 2007 Timothy Wall, All Rights Reserved
|
||||
*
|
||||
* 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.
|
||||
* <p/>
|
||||
* 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.
|
||||
*/
|
||||
package com.sun.jna.platform.dnd;
|
||||
|
||||
import java.awt.AlphaComposite;
|
||||
import java.awt.Component;
|
||||
import java.awt.Cursor;
|
||||
import java.awt.Dimension;
|
||||
import java.awt.Graphics2D;
|
||||
import java.awt.GraphicsConfiguration;
|
||||
import java.awt.Image;
|
||||
import java.awt.Point;
|
||||
import java.awt.Transparency;
|
||||
import java.awt.datatransfer.Transferable;
|
||||
import java.awt.dnd.DnDConstants;
|
||||
import java.awt.dnd.DragGestureEvent;
|
||||
import java.awt.dnd.DragGestureListener;
|
||||
import java.awt.dnd.DragSource;
|
||||
import java.awt.dnd.DragSourceContext;
|
||||
import java.awt.dnd.DragSourceDragEvent;
|
||||
import java.awt.dnd.DragSourceDropEvent;
|
||||
import java.awt.dnd.DragSourceEvent;
|
||||
import java.awt.dnd.DragSourceListener;
|
||||
import java.awt.dnd.DragSourceMotionListener;
|
||||
import java.awt.dnd.DropTargetDragEvent;
|
||||
import java.awt.dnd.DropTargetDropEvent;
|
||||
import java.awt.dnd.DropTargetEvent;
|
||||
import java.awt.dnd.InvalidDnDOperationException;
|
||||
import java.awt.event.InputEvent;
|
||||
import java.awt.image.BufferedImage;
|
||||
|
||||
import javax.swing.Icon;
|
||||
import javax.swing.JColorChooser;
|
||||
import javax.swing.JFileChooser;
|
||||
import javax.swing.JList;
|
||||
import javax.swing.JTable;
|
||||
import javax.swing.JTree;
|
||||
import javax.swing.text.JTextComponent;
|
||||
|
||||
/** Provides simplified drag handling for a component.
|
||||
* Usage:<br>
|
||||
* <pre><code>
|
||||
* int actions = DnDConstants.MOVE_OR_COPY;
|
||||
* Component component = ...;
|
||||
* DragHandler handler = new DragHandler(component, actions);
|
||||
* </code></pre>
|
||||
* <ul>
|
||||
* <li>Supports painting an arbitrary {@link Icon} with transparency to
|
||||
* represent the item being dragged (restricted to the {@link java.awt.Window}
|
||||
* of the drag source if the platform doesn't support drag images).
|
||||
* <li>Disallow starting a drag if the user requests an unsupported action.
|
||||
* <li>Adjusts the cursor on drags with no modifier for which the default action
|
||||
* is disallowed but where one or more non-default actions are allowed, e.g. a
|
||||
* drag (with no modifiers) to a target which supports "link" should change the
|
||||
* cursor to "link" (prior to 1.6, the JRE behavior is to display a
|
||||
* "not allowed" cursor, even though the action actually depends on how the
|
||||
* drop target responds).
|
||||
* <a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4869264">
|
||||
* The bug</a> is fixed in java 1.6.
|
||||
* <li>Disallow drops to targets if the non-default (user-requested) action
|
||||
* is not supported by the target, e.g. the user requests a "copy" when the
|
||||
* target only supports "move". This is generally the responsibility of the
|
||||
* drop handler, which decides whether or not to accept a drag. The DragHandler
|
||||
* provides static modifier state information since the drop handler doesn't
|
||||
* have access to it.
|
||||
* </ul>
|
||||
* NOTE: Fundamentally, the active action is determined by the drop handler
|
||||
* in {@link DropTargetDragEvent#acceptDrag}, but often client code
|
||||
* simply relies on {@link DropTargetDragEvent#getDropAction}.
|
||||
*/
|
||||
//TODO: separate into the the following drag pieces:
|
||||
// * default cursor changing behavior fix (fixed in jre1.6) (global DSL)
|
||||
// * drag unselected item (fixed in 1.6, flag in 1.5.0.05+) bug not an issue w/DragHandler
|
||||
// * multi-selection drag workaround (if not using swing drag gesture recognizer)
|
||||
// proper multi-selection drag is provided for swing dnd as of 1.4
|
||||
// (use swing drag gesture recognizer if possible?) DSL+mouse listener
|
||||
//TODO: identify overlap with default Swing support + TransferHandler
|
||||
// * TransferHandler doesn't have drop location information (included in 1.6)
|
||||
// * SwingDropTarget allows listeners, so target highlighting is possible
|
||||
|
||||
//NOTE: acceptDrag(int) is simply indicates the drag is accepted; the action
|
||||
// value doesn't get propagated anywhere, it's certainly not communicated to
|
||||
// the drag source
|
||||
//MAYBE: should Transferable/Icon provision be a separate interface
|
||||
//(i.e. TransferHandler)? only if the rest of the drag handler is constant and
|
||||
// only the image needs to change (for standard components, e.g. tree cells,
|
||||
// table cells, etc.)
|
||||
|
||||
public abstract class DragHandler
|
||||
implements DragSourceListener, DragSourceMotionListener, DragGestureListener {
|
||||
|
||||
/** Default maximum size for ghosted images. */
|
||||
public static final Dimension MAX_GHOST_SIZE = new Dimension(250, 250);
|
||||
|
||||
/** Default transparency for ghosting. */
|
||||
public static final float DEFAULT_GHOST_ALPHA = 0.5f;
|
||||
|
||||
/** {@link #getModifiers} returns this value when the current
|
||||
* modifiers state is unknown.
|
||||
*/
|
||||
public static final int UNKNOWN_MODIFIERS = -1;
|
||||
|
||||
/** {@link #getTransferable} returns this value when
|
||||
* the current {@link Transferable} is unknown.
|
||||
*/
|
||||
public static final Transferable UNKNOWN_TRANSFERABLE = null;
|
||||
/** Convenience to reference {@link DnDConstants#ACTION_MOVE}. */
|
||||
protected static final int MOVE = DnDConstants.ACTION_MOVE;
|
||||
/** Convenience to reference {@link DnDConstants#ACTION_COPY}. */
|
||||
protected static final int COPY = DnDConstants.ACTION_COPY;
|
||||
/** Convenience to reference {@link DnDConstants#ACTION_LINK}. */
|
||||
protected static final int LINK = DnDConstants.ACTION_LINK;
|
||||
/** Convenience to reference {@link DnDConstants#ACTION_NONE}. */
|
||||
protected static final int NONE = DnDConstants.ACTION_NONE;
|
||||
|
||||
// TODO: w32 explorer: link=alt or ctrl+shift, copy=ctrl or shift
|
||||
// w32 others: copy=ctrl
|
||||
/** Modifier mask for a user-requested move. */
|
||||
static final int MOVE_MASK = InputEvent.SHIFT_DOWN_MASK;
|
||||
static final boolean OSX =
|
||||
System.getProperty("os.name").toLowerCase().indexOf("mac") != -1;
|
||||
/** Modifier mask for a user-requested copy. */
|
||||
static final int COPY_MASK =
|
||||
OSX ? InputEvent.ALT_DOWN_MASK : InputEvent.CTRL_DOWN_MASK;
|
||||
/** Modifier mask for a user-requested link. */
|
||||
static final int LINK_MASK =
|
||||
OSX ? InputEvent.ALT_DOWN_MASK|InputEvent.META_DOWN_MASK
|
||||
: InputEvent.CTRL_DOWN_MASK|InputEvent.SHIFT_DOWN_MASK;
|
||||
/** Modifier mask for any user-requested action. */
|
||||
static final int KEY_MASK =
|
||||
InputEvent.ALT_DOWN_MASK|InputEvent.META_DOWN_MASK
|
||||
|InputEvent.CTRL_DOWN_MASK|InputEvent.SHIFT_DOWN_MASK
|
||||
|InputEvent.ALT_GRAPH_DOWN_MASK;
|
||||
|
||||
private static int modifiers = UNKNOWN_MODIFIERS;
|
||||
private static Transferable transferable = UNKNOWN_TRANSFERABLE;
|
||||
|
||||
/** Used to communicate modifier state to {@link DropHandler}. Note that
|
||||
* this field will only be accurate when a {@link DragHandler} in
|
||||
* the same VM started the drag. Otherwise, {@link #UNKNOWN_MODIFIERS}
|
||||
* will be returned.
|
||||
*/
|
||||
static int getModifiers() {
|
||||
return modifiers;
|
||||
}
|
||||
|
||||
/** Used to communicate the current {@link Transferable} during a drag,
|
||||
* if available. Work around absence of access to the data when dragging
|
||||
* pre-1.5.
|
||||
*/
|
||||
public static Transferable getTransferable(DropTargetEvent e) {
|
||||
if (e instanceof DropTargetDragEvent) {
|
||||
try {
|
||||
// getTransferable is available during drag only on 1.5+
|
||||
return (Transferable)
|
||||
e.getClass().getMethod("getTransferable", (Class[])null).invoke(e, (Object[])null);
|
||||
}
|
||||
catch(Exception ex) {
|
||||
// Method not available
|
||||
}
|
||||
}
|
||||
else if (e instanceof DropTargetDropEvent) {
|
||||
return ((DropTargetDropEvent)e).getTransferable();
|
||||
}
|
||||
return transferable;
|
||||
}
|
||||
|
||||
private int supportedActions;
|
||||
private boolean fixCursor = true;
|
||||
private Component dragSource;
|
||||
private GhostedDragImage ghost;
|
||||
private Point imageOffset;
|
||||
private Dimension maxGhostSize = MAX_GHOST_SIZE;
|
||||
private float ghostAlpha = DEFAULT_GHOST_ALPHA;
|
||||
|
||||
/** Enable drags from the given component, supporting the actions in
|
||||
* the given action mask.
|
||||
*/
|
||||
protected DragHandler(Component dragSource, int actions) {
|
||||
this.dragSource = dragSource;
|
||||
this.supportedActions = actions;
|
||||
try {
|
||||
String alpha = System.getProperty("DragHandler.alpha");
|
||||
if (alpha != null) {
|
||||
try {
|
||||
ghostAlpha = Float.parseFloat(alpha);
|
||||
}
|
||||
catch(NumberFormatException e) { }
|
||||
}
|
||||
String max = System.getProperty("DragHandler.maxDragImageSize");
|
||||
if (max != null) {
|
||||
String[] size = max.split("x");
|
||||
if (size.length == 2) {
|
||||
try {
|
||||
maxGhostSize = new Dimension(Integer.parseInt(size[0]),
|
||||
Integer.parseInt(size[1]));
|
||||
}
|
||||
catch(NumberFormatException e) { }
|
||||
}
|
||||
}
|
||||
}
|
||||
catch(SecurityException e) { }
|
||||
// Avoid having more than one gesture recognizer active
|
||||
disableSwingDragSupport(dragSource);
|
||||
DragSource src = DragSource.getDefaultDragSource();
|
||||
src.createDefaultDragGestureRecognizer(dragSource, supportedActions, this);
|
||||
}
|
||||
|
||||
private void disableSwingDragSupport(Component comp) {
|
||||
if (comp instanceof JTree) {
|
||||
((JTree)comp).setDragEnabled(false);
|
||||
}
|
||||
else if (comp instanceof JList) {
|
||||
((JList)comp).setDragEnabled(false);
|
||||
}
|
||||
else if (comp instanceof JTable) {
|
||||
((JTable)comp).setDragEnabled(false);
|
||||
}
|
||||
else if (comp instanceof JTextComponent) {
|
||||
((JTextComponent)comp).setDragEnabled(false);
|
||||
}
|
||||
else if (comp instanceof JColorChooser) {
|
||||
((JColorChooser)comp).setDragEnabled(false);
|
||||
}
|
||||
else if (comp instanceof JFileChooser) {
|
||||
((JFileChooser)comp).setDragEnabled(false);
|
||||
}
|
||||
}
|
||||
|
||||
/** Override to control whether a drag is started. The default
|
||||
* implementation disallows the drag if the user is applying modifiers
|
||||
* and the user-requested action is not supported.
|
||||
*/
|
||||
protected boolean canDrag(DragGestureEvent e) {
|
||||
int mods = e.getTriggerEvent().getModifiersEx() & KEY_MASK;
|
||||
if (mods == MOVE_MASK)
|
||||
return (supportedActions & MOVE) != 0;
|
||||
if (mods == COPY_MASK)
|
||||
return (supportedActions & COPY) != 0;
|
||||
if (mods == LINK_MASK)
|
||||
return (supportedActions & LINK) != 0;
|
||||
return true;
|
||||
}
|
||||
|
||||
/** Update the modifiers hint. */
|
||||
protected void setModifiers(int mods) {
|
||||
modifiers = mods;
|
||||
}
|
||||
/** Override to provide an appropriate {@link Transferable} representing
|
||||
* the data being dragged.
|
||||
*/
|
||||
protected abstract Transferable getTransferable(DragGestureEvent e);
|
||||
|
||||
/** Override this to provide a custom image. The {@link Icon}
|
||||
* returned by this method by default is <code>null</code>, which results
|
||||
* in no drag image.
|
||||
* @param srcOffset set this to be the offset from the drag source
|
||||
* component's upper left corner to the image's upper left corner.
|
||||
* For example, when dragging a row from a list, the offset would be the
|
||||
* row's bounding rectangle's (x,y) coordinate.<p>
|
||||
* The default value is (0,0), so if unchanged, the image is will
|
||||
* use the same origin as the drag source component.
|
||||
*/
|
||||
protected Icon getDragIcon(DragGestureEvent e, Point srcOffset) {
|
||||
return null;
|
||||
}
|
||||
|
||||
/** Override to perform any decoration of the target at the start of a drag,
|
||||
* if desired.
|
||||
*/
|
||||
protected void dragStarted(DragGestureEvent e) { }
|
||||
|
||||
/** Called when a user drag gesture is recognized. This method is
|
||||
* responsible for initiating the drag operation.
|
||||
*/
|
||||
public void dragGestureRecognized(DragGestureEvent e) {
|
||||
if ((e.getDragAction() & supportedActions) != 0
|
||||
&& canDrag(e)) {
|
||||
setModifiers(e.getTriggerEvent().getModifiersEx() & KEY_MASK);
|
||||
Transferable transferable = getTransferable(e);
|
||||
if (transferable == null)
|
||||
return;
|
||||
try {
|
||||
Point srcOffset = new Point(0, 0);
|
||||
Icon icon = getDragIcon(e, srcOffset);
|
||||
Point origin = e.getDragOrigin();
|
||||
// offset of the image origin from the cursor
|
||||
imageOffset = new Point(srcOffset.x - origin.x,
|
||||
srcOffset.y - origin.y);
|
||||
Icon dragIcon = scaleDragIcon(icon, imageOffset);
|
||||
Cursor cursor = null;
|
||||
if (dragIcon != null && DragSource.isDragImageSupported()) {
|
||||
GraphicsConfiguration gc = e.getComponent().getGraphicsConfiguration();
|
||||
e.startDrag(cursor, createDragImage(gc, dragIcon),
|
||||
imageOffset, transferable, this);
|
||||
}
|
||||
else {
|
||||
if (dragIcon != null) {
|
||||
Point screen = dragSource.getLocationOnScreen();
|
||||
screen.translate(origin.x, origin.y);
|
||||
Point cursorOffset = new Point(-imageOffset.x, -imageOffset.y);
|
||||
ghost = new GhostedDragImage(dragSource, dragIcon,
|
||||
getImageLocation(screen), cursorOffset);
|
||||
ghost.setAlpha(ghostAlpha);
|
||||
}
|
||||
e.startDrag(cursor, transferable, this);
|
||||
}
|
||||
dragStarted(e);
|
||||
moved = false;
|
||||
e.getDragSource().addDragSourceMotionListener(this);
|
||||
DragHandler.transferable = transferable;
|
||||
}
|
||||
catch (InvalidDnDOperationException ex) {
|
||||
if (ghost != null) {
|
||||
ghost.dispose();
|
||||
ghost = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/** Reduce the size of the given drag icon, if appropriate. When using
|
||||
* a smaller drag icon, we also need to adjust the cursor offset within
|
||||
* the icon.
|
||||
*/
|
||||
protected Icon scaleDragIcon(Icon icon, Point imageOffset) {
|
||||
/*
|
||||
if (icon != null && maxGhostSize != null) {
|
||||
if (icon.getIconWidth() > maxGhostSize.width
|
||||
|| icon.getIconHeight() > maxGhostSize.height) {
|
||||
Icon scaled = new ScaledIcon(icon, maxGhostSize.width,
|
||||
maxGhostSize.height);
|
||||
double scale = (double)scaled.getIconWidth()/icon.getIconWidth();
|
||||
imageOffset.x *= scale;
|
||||
imageOffset.y *= scale;
|
||||
return scaled;
|
||||
}
|
||||
}*/
|
||||
return icon;
|
||||
}
|
||||
|
||||
/** Create an image from the given icon. The image is provided to the
|
||||
* native handler if drag images are supported natively.
|
||||
*/
|
||||
protected Image createDragImage(GraphicsConfiguration gc, Icon icon) {
|
||||
int w = icon.getIconWidth();
|
||||
int h = icon.getIconHeight();
|
||||
BufferedImage image = gc.createCompatibleImage(w, h, Transparency.TRANSLUCENT);
|
||||
Graphics2D g = (Graphics2D)image.getGraphics();
|
||||
g.setComposite(AlphaComposite.Clear);
|
||||
g.fillRect(0, 0, w, h);
|
||||
// Ignore pixels in the buffered image
|
||||
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC, ghostAlpha));
|
||||
icon.paintIcon(dragSource, g, 0, 0);
|
||||
g.dispose();
|
||||
return image;
|
||||
}
|
||||
|
||||
/** Reduce a multiply-set bit mask to a single bit. */
|
||||
private int reduce(int actions) {
|
||||
if ((actions & MOVE) != 0 && actions != MOVE) {
|
||||
return MOVE;
|
||||
}
|
||||
else if ((actions & COPY) != 0 && actions != COPY) {
|
||||
return COPY;
|
||||
}
|
||||
return actions;
|
||||
}
|
||||
|
||||
protected Cursor getCursorForAction(int actualAction) {
|
||||
switch(actualAction) {
|
||||
case MOVE:
|
||||
return DragSource.DefaultMoveDrop;
|
||||
case COPY:
|
||||
return DragSource.DefaultCopyDrop;
|
||||
case LINK:
|
||||
return DragSource.DefaultLinkDrop;
|
||||
default:
|
||||
return DragSource.DefaultMoveNoDrop;
|
||||
}
|
||||
}
|
||||
|
||||
/** Returns the first available action supported by source and target. */
|
||||
protected int getAcceptableDropAction(int targetActions) {
|
||||
return reduce(supportedActions & targetActions);
|
||||
}
|
||||
|
||||
/** Get the currently requested drop action. */
|
||||
protected int getDropAction(DragSourceEvent ev) {
|
||||
if (ev instanceof DragSourceDragEvent) {
|
||||
DragSourceDragEvent e = (DragSourceDragEvent)ev;
|
||||
return e.getDropAction();
|
||||
}
|
||||
if (ev instanceof DragSourceDropEvent) {
|
||||
return ((DragSourceDropEvent)ev).getDropAction();
|
||||
}
|
||||
return NONE;
|
||||
}
|
||||
|
||||
/** Pick a different drop action if the target doesn't support the current
|
||||
* one and there are no modifiers.
|
||||
*/
|
||||
protected int adjustDropAction(DragSourceEvent ev) {
|
||||
int action = getDropAction(ev);
|
||||
if (ev instanceof DragSourceDragEvent) {
|
||||
DragSourceDragEvent e = (DragSourceDragEvent)ev;
|
||||
if (action == NONE) {
|
||||
int mods = e.getGestureModifiersEx() & KEY_MASK;
|
||||
if (mods == 0) {
|
||||
action = getAcceptableDropAction(e.getTargetActions());
|
||||
}
|
||||
}
|
||||
}
|
||||
return action;
|
||||
}
|
||||
|
||||
protected void updateCursor(DragSourceEvent ev) {
|
||||
if (!fixCursor)
|
||||
return;
|
||||
Cursor cursor = getCursorForAction(adjustDropAction(ev));
|
||||
ev.getDragSourceContext().setCursor(cursor);
|
||||
}
|
||||
|
||||
static String actionString(int action) {
|
||||
switch(action) {
|
||||
case MOVE: return "MOVE";
|
||||
case MOVE|COPY: return "MOVE|COPY";
|
||||
case MOVE|LINK: return "MOVE|LINK";
|
||||
case MOVE|COPY|LINK: return "MOVE|COPY|LINK";
|
||||
case COPY: return "COPY";
|
||||
case COPY|LINK: return "COPY|LINK";
|
||||
case LINK: return "LINK";
|
||||
default: return "NONE";
|
||||
}
|
||||
}
|
||||
private String lastAction;
|
||||
private void describe(String type, DragSourceEvent e) {
|
||||
if (false) {
|
||||
DragSourceContext ds = e.getDragSourceContext();
|
||||
String msg = "drag: " + type;
|
||||
if (e instanceof DragSourceDragEvent) {
|
||||
DragSourceDragEvent ev = (DragSourceDragEvent)e;
|
||||
msg += ": src=" + actionString(ds.getSourceActions())
|
||||
+ " usr=" + actionString(ev.getUserAction())
|
||||
+ " tgt=" + actionString(ev.getTargetActions())
|
||||
+ " act=" + actionString(ev.getDropAction())
|
||||
+ " mods=" + ev.getGestureModifiersEx();
|
||||
}
|
||||
else {
|
||||
msg += ": e=" + e;
|
||||
}
|
||||
if (!msg.equals(lastAction)) {
|
||||
System.out.println(lastAction = msg);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void dragDropEnd(DragSourceDropEvent e) {
|
||||
describe("end", e);
|
||||
setModifiers(UNKNOWN_MODIFIERS);
|
||||
transferable = UNKNOWN_TRANSFERABLE;
|
||||
if (ghost != null) {
|
||||
if (e.getDropSuccess()) {
|
||||
ghost.dispose();
|
||||
}
|
||||
else {
|
||||
ghost.returnToOrigin();
|
||||
}
|
||||
ghost = null;
|
||||
}
|
||||
DragSource src = e.getDragSourceContext().getDragSource();
|
||||
src.removeDragSourceMotionListener(this);
|
||||
moved = false;
|
||||
}
|
||||
|
||||
private Point getImageLocation(Point where) {
|
||||
where.translate(imageOffset.x, imageOffset.y);
|
||||
return where;
|
||||
}
|
||||
|
||||
public void dragEnter(DragSourceDragEvent e) {
|
||||
describe("enter", e);
|
||||
if (ghost != null) {
|
||||
ghost.move(getImageLocation(e.getLocation()));
|
||||
}
|
||||
updateCursor(e);
|
||||
}
|
||||
|
||||
// bug workaround; need to skip initial dragMouseMoved event,
|
||||
// which has reports "0" for the available target actions (1.4+?)
|
||||
// filed a bug for this
|
||||
private boolean moved;
|
||||
public void dragMouseMoved(DragSourceDragEvent e) {
|
||||
describe("move", e);
|
||||
if (ghost != null) {
|
||||
ghost.move(getImageLocation(e.getLocation()));
|
||||
}
|
||||
if (moved)
|
||||
updateCursor(e);
|
||||
moved = true;
|
||||
}
|
||||
|
||||
public void dragOver(DragSourceDragEvent e) {
|
||||
describe("over", e);
|
||||
if (ghost != null) {
|
||||
ghost.move(getImageLocation(e.getLocation()));
|
||||
}
|
||||
updateCursor(e);
|
||||
}
|
||||
|
||||
public void dragExit(DragSourceEvent e) {
|
||||
describe("exit", e);
|
||||
}
|
||||
|
||||
public void dropActionChanged(DragSourceDragEvent e) {
|
||||
describe("change", e);
|
||||
setModifiers(e.getGestureModifiersEx() & KEY_MASK);
|
||||
if (ghost != null) {
|
||||
ghost.move(getImageLocation(e.getLocation()));
|
||||
}
|
||||
updateCursor(e);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,393 @@
|
||||
/* Copyright (c) 2007 Timothy Wall, All Rights Reserved
|
||||
*
|
||||
* 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.
|
||||
* <p/>
|
||||
* 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.
|
||||
*/
|
||||
package com.sun.jna.platform.dnd;
|
||||
|
||||
import java.awt.Component;
|
||||
import java.awt.Point;
|
||||
import java.awt.datatransfer.DataFlavor;
|
||||
import java.awt.datatransfer.Transferable;
|
||||
import java.awt.datatransfer.UnsupportedFlavorException;
|
||||
import java.awt.dnd.DnDConstants;
|
||||
import java.awt.dnd.DropTarget;
|
||||
import java.awt.dnd.DropTargetContext;
|
||||
import java.awt.dnd.DropTargetDragEvent;
|
||||
import java.awt.dnd.DropTargetDropEvent;
|
||||
import java.awt.dnd.DropTargetEvent;
|
||||
import java.awt.dnd.DropTargetListener;
|
||||
import java.io.IOException;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
/** Provides simplified drop handling for a component.
|
||||
* Usage:<br>
|
||||
* <pre><code>
|
||||
* int actions = DnDConstants.MOVE_OR_COPY;
|
||||
* Component component = ...;
|
||||
* DropHandler handler = new DropHandler(component, actions);
|
||||
* </code></pre>
|
||||
* <p>
|
||||
* <ul>
|
||||
* <li>Accept drops where the action is the default (i.e. no modifiers) but
|
||||
* the intersection of source and target actions is <i>not</i> the default.
|
||||
* Doing so allows the source to adjust the cursor appropriately.
|
||||
* <li>Refuse drops where the user modifiers request an action that is not
|
||||
* supported (this works for all cases except when the drag source is not
|
||||
* a {@link DragHandler} and the user explicitly requests a MOVE operation;
|
||||
* this is indistinguishable from a drag with no modifiers unless we have
|
||||
* access to the key modifiers, which {@link DragHandler} provides).
|
||||
* <li>Drops may be refused based on data flavor, location, intended drop
|
||||
* action, or any combination of those, by overriding {@link #canDrop}.
|
||||
* <li>Custom decoration of the drop area may be performed in
|
||||
* {@link #paintDropTarget(DropTargetEvent, int, Point)} or by providing
|
||||
* a {@link DropTargetPainter}.
|
||||
* </ul>
|
||||
*
|
||||
* The method {@link #getDropAction(DropTargetEvent)} follows these steps to
|
||||
* determine the appropriate action (if any).
|
||||
* <ul>
|
||||
* <li>{@link #isSupported(DataFlavor[])} determines if there are any supported
|
||||
* flavors
|
||||
* <li>{@link #getDropActionsForFlavors(DataFlavor[])} reduces the supported
|
||||
* actions based on available flavors. For instance, a text field for file
|
||||
* paths might support {@link DnDConstants#ACTION_COPY_OR_MOVE} on a plain
|
||||
* string, but {@link DnDConstants#ACTION_LINK} might be the only action
|
||||
* supported on a file.
|
||||
* <li>{@link #getDropAction(DropTargetEvent, int, int, int)} relax the action
|
||||
* if it's the default, or restrict it for user requested actions.
|
||||
* <li>{@link #canDrop(DropTargetEvent, int, Point)} change the action based on
|
||||
* the location in the drop target component, or any other criteria.
|
||||
* </ul>
|
||||
*
|
||||
* Override {@link #drop(DropTargetDropEvent, int)} to handle the drop.
|
||||
* You should invoke {@link DropTargetDropEvent#dropComplete} as soon
|
||||
* as the {@link Transferable} data is obtained, to avoid making the DnD
|
||||
* operation look suspended.
|
||||
*
|
||||
* @see DragHandler
|
||||
* @author twall
|
||||
*/
|
||||
// NOTE: you could probably make one of these handlers serve several targets,
|
||||
// but for simplicity, keep the mapping 1-1-1 handler/droptarget/component
|
||||
// TODO: look into making use of the existing
|
||||
// Transferable.SwingDropTarget on JComponent instances instead of
|
||||
// creating a new DropTarget; we can add self as a listener; probably would
|
||||
// want to remove the default TransferHandler.DropHandler, which uses
|
||||
// the TransferHandler to drop
|
||||
public abstract class DropHandler implements DropTargetListener {
|
||||
|
||||
private int acceptedActions;
|
||||
private List<DataFlavor> acceptedFlavors;
|
||||
private DropTarget dropTarget;
|
||||
private boolean active = true;
|
||||
private DropTargetPainter painter;
|
||||
|
||||
/** Create a handler that allows the given set of actions. If using
|
||||
* this constructor, you will need to override {@link #isSupported} to
|
||||
* indicate which data flavors are allowed.
|
||||
*/
|
||||
public DropHandler(Component c, int acceptedActions) {
|
||||
this(c, acceptedActions, new DataFlavor[0]);
|
||||
}
|
||||
|
||||
/** Enable handling of drops, indicating what actions and flavors are
|
||||
* acceptable.
|
||||
* @param c The component to receive drops
|
||||
* @param acceptedActions Allowed actions for drops
|
||||
* @param acceptedFlavors Allowed data flavors for drops
|
||||
* @see #isSupported
|
||||
*/
|
||||
public DropHandler(final Component c, int acceptedActions, DataFlavor[] acceptedFlavors) {
|
||||
this(c, acceptedActions, acceptedFlavors, null);
|
||||
}
|
||||
|
||||
/** Enable handling of drops, indicating what actions and flavors are
|
||||
* acceptable, and providing a painter for drop target feedback.
|
||||
* @param c The component to receive drops
|
||||
* @param acceptedActions Allowed actions for drops
|
||||
* @param acceptedFlavors Allowed data flavors for drops
|
||||
* @param painter Painter to handle drop target feedback
|
||||
* @see #paintDropTarget
|
||||
*/
|
||||
public DropHandler(final Component c, int acceptedActions,
|
||||
DataFlavor[] acceptedFlavors, DropTargetPainter painter) {
|
||||
this.acceptedActions = acceptedActions;
|
||||
this.acceptedFlavors = Arrays.asList(acceptedFlavors);
|
||||
this.painter = painter;
|
||||
dropTarget = new DropTarget(c, acceptedActions, this, active);
|
||||
}
|
||||
|
||||
protected DropTarget getDropTarget() {
|
||||
return dropTarget;
|
||||
}
|
||||
|
||||
/** Whether this drop target is active. */
|
||||
public boolean isActive() { return active; }
|
||||
|
||||
/** Set whether this handler (and thus its drop target) will accept
|
||||
* any drops.
|
||||
*/
|
||||
public void setActive(boolean active) {
|
||||
this.active = active;
|
||||
if (dropTarget != null) {
|
||||
dropTarget.setActive(active);
|
||||
}
|
||||
}
|
||||
|
||||
/** Indicate the actions available for the given list of data flavors.
|
||||
* Override this method if the acceptable drop actions depend
|
||||
* on the currently available {@link DataFlavor}. The default returns
|
||||
* the accepted actions passed into the constructor.
|
||||
* @param dataFlavors currently available flavors
|
||||
* @see #getDropAction(DropTargetEvent, int, int, int)
|
||||
* @see #canDrop(DropTargetEvent, int, Point)
|
||||
*/
|
||||
protected int getDropActionsForFlavors(DataFlavor[] dataFlavors) {
|
||||
return acceptedActions;
|
||||
}
|
||||
|
||||
/** Calculate the effective action. The default implementation
|
||||
* checks whether any {@link DataFlavor}s are supported, and if so,
|
||||
* will change the current action from {@link DnDConstants#ACTION_NONE} to
|
||||
* something in common between the source and destination. Refuse
|
||||
* user-requested actions if they are not supported (rather than silently
|
||||
* accepting a non-user-requested action, which is the Java's DnD default
|
||||
* behavior). The drop action is forced to {@link DnDConstants#ACTION_NONE}
|
||||
* if there is no supported data flavor.<p>
|
||||
* @see #isSupported(DataFlavor[])
|
||||
* @see #getDropActionsForFlavors
|
||||
* @see #getDropAction(DropTargetEvent, int, int, int)
|
||||
* @see #canDrop(DropTargetEvent, int, Point)
|
||||
*/
|
||||
protected int getDropAction(DropTargetEvent e) {
|
||||
int currentAction = DragHandler.NONE;
|
||||
int sourceActions = DragHandler.NONE;
|
||||
Point location = null;
|
||||
DataFlavor[] flavors = new DataFlavor[0];
|
||||
if (e instanceof DropTargetDragEvent) {
|
||||
DropTargetDragEvent ev = (DropTargetDragEvent)e;
|
||||
currentAction = ev.getDropAction();
|
||||
sourceActions = ev.getSourceActions();
|
||||
flavors = ev.getCurrentDataFlavors();
|
||||
location = ev.getLocation();
|
||||
}
|
||||
else if (e instanceof DropTargetDropEvent) {
|
||||
DropTargetDropEvent ev = (DropTargetDropEvent)e;
|
||||
currentAction = ev.getDropAction();
|
||||
sourceActions = ev.getSourceActions();
|
||||
flavors = ev.getCurrentDataFlavors();
|
||||
location = ev.getLocation();
|
||||
}
|
||||
if (isSupported(flavors)) {
|
||||
int availableActions = getDropActionsForFlavors(flavors);
|
||||
currentAction = getDropAction(e, currentAction, sourceActions, availableActions);
|
||||
if (currentAction != DragHandler.NONE) {
|
||||
if (canDrop(e, currentAction, location)) {
|
||||
return currentAction;
|
||||
}
|
||||
}
|
||||
}
|
||||
return DragHandler.NONE;
|
||||
}
|
||||
|
||||
/* Adjust the drop action depending on whether the
|
||||
* current action is the default or a specific user-requested action.
|
||||
* The default implementation will change the current action from
|
||||
* {@link DnDConstants#ACTION_NONE} if there are actions in
|
||||
* common between the source and destination. It will refuse user-requested
|
||||
* actions if they are not supported (rather than silently accepting
|
||||
* a non-user-requested action, which is the behavior of Swing's default
|
||||
* drop handlers).<p>
|
||||
* You can override this method if you wish to adjust the action based
|
||||
* on the the drag location; if you wish to deny drops based on location,
|
||||
* override {@link #canDrop} instead. If you wish to adjust
|
||||
* the action based on the available data flavors, override
|
||||
* {@link #getDropActionsForFlavor} instead.
|
||||
* @see #getDropActionsForFlavor
|
||||
* @see #canDrop(DropTargetEvent, int, Point)
|
||||
*/
|
||||
protected int getDropAction(DropTargetEvent e, int currentAction,
|
||||
int sourceActions, int acceptedActions) {
|
||||
boolean modifiersActive = modifiersActive(currentAction);
|
||||
if ((currentAction & acceptedActions) == DragHandler.NONE
|
||||
&& !modifiersActive) {
|
||||
int action = acceptedActions & sourceActions;
|
||||
currentAction = action;
|
||||
}
|
||||
else if (modifiersActive) {
|
||||
int action = currentAction & acceptedActions & sourceActions;
|
||||
if (action != currentAction) {
|
||||
currentAction = action;
|
||||
}
|
||||
}
|
||||
return currentAction;
|
||||
}
|
||||
|
||||
/** Returns whether there are key modifiers active ,
|
||||
* or false if they can't be determined.
|
||||
* We use the DragHandler hint, if available, or fall back to whether
|
||||
* the drop action is other than the default (move).
|
||||
*/
|
||||
protected boolean modifiersActive(int dropAction) {
|
||||
int mods = DragHandler.getModifiers();
|
||||
if (mods == DragHandler.UNKNOWN_MODIFIERS) {
|
||||
if (dropAction == DragHandler.LINK
|
||||
|| dropAction == DragHandler.COPY) {
|
||||
return true;
|
||||
}
|
||||
// Can't (yet) distinguish between a forced and a default move
|
||||
// without help from DragHandler
|
||||
return false;
|
||||
}
|
||||
return mods != 0;
|
||||
}
|
||||
|
||||
private String lastAction;
|
||||
private void describe(String type, DropTargetEvent e) {
|
||||
if (false) {
|
||||
String msg = "drop: " + type;
|
||||
if (e instanceof DropTargetDragEvent) {
|
||||
DropTargetContext dtc = e.getDropTargetContext();
|
||||
DropTarget dt = dtc.getDropTarget();
|
||||
DropTargetDragEvent ev = (DropTargetDragEvent)e;
|
||||
msg += ": src=" + DragHandler.actionString(ev.getSourceActions())
|
||||
+ " tgt=" + DragHandler.actionString(dt.getDefaultActions())
|
||||
+ " act=" + DragHandler.actionString(ev.getDropAction());
|
||||
}
|
||||
else if (e instanceof DropTargetDropEvent) {
|
||||
DropTargetContext dtc = e.getDropTargetContext();
|
||||
DropTarget dt = dtc.getDropTarget();
|
||||
DropTargetDropEvent ev = (DropTargetDropEvent)e;
|
||||
msg += ": src=" + DragHandler.actionString(ev.getSourceActions())
|
||||
+ " tgt=" + DragHandler.actionString(dt.getDefaultActions())
|
||||
+ " act=" + DragHandler.actionString(ev.getDropAction());
|
||||
}
|
||||
if (!msg.equals(lastAction)) {
|
||||
System.out.println(lastAction = msg);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/** Accept or reject the drag represented by the given event. Returns
|
||||
* the action determined by {@link #getDropAction(DropTargetEvent)}.
|
||||
*/
|
||||
protected int acceptOrReject(DropTargetDragEvent e) {
|
||||
int action = getDropAction(e);
|
||||
if (action != DragHandler.NONE) {
|
||||
// NOTE: the action argument (as of 1.5+) is only passed
|
||||
// to the DropTargetContextPeer, *not* the drag source
|
||||
e.acceptDrag(action);
|
||||
}
|
||||
else {
|
||||
e.rejectDrag();
|
||||
}
|
||||
return action;
|
||||
}
|
||||
|
||||
public void dragEnter(DropTargetDragEvent e) {
|
||||
describe("enter(tgt)", e);
|
||||
int action = acceptOrReject(e);
|
||||
paintDropTarget(e, action, e.getLocation());
|
||||
}
|
||||
|
||||
public void dragOver(DropTargetDragEvent e) {
|
||||
describe("over(tgt)", e);
|
||||
int action = acceptOrReject(e);
|
||||
paintDropTarget(e, action, e.getLocation());
|
||||
}
|
||||
|
||||
public void dragExit(DropTargetEvent e) {
|
||||
describe("exit(tgt)", e);
|
||||
paintDropTarget(e, DragHandler.NONE, null);
|
||||
}
|
||||
|
||||
public void dropActionChanged(DropTargetDragEvent e) {
|
||||
describe("change(tgt)", e);
|
||||
int action = acceptOrReject(e);
|
||||
paintDropTarget(e, action, e.getLocation());
|
||||
}
|
||||
|
||||
/** Indicates the user has initiated a drop. The default performs all
|
||||
* standard drop validity checking and handling, then invokes
|
||||
* {@link #drop(DropTargetDropEvent,int)} if the drop looks acceptable.
|
||||
*/
|
||||
public void drop(DropTargetDropEvent e) {
|
||||
describe("drop(tgt)", e);
|
||||
int action = getDropAction(e);
|
||||
if (action != DragHandler.NONE) {
|
||||
e.acceptDrop(action);
|
||||
try {
|
||||
drop(e, action);
|
||||
// Just in case this hasn't been done yet
|
||||
e.dropComplete(true);
|
||||
}
|
||||
catch (Exception ex) {
|
||||
e.dropComplete(false);
|
||||
}
|
||||
}
|
||||
else {
|
||||
e.rejectDrop();
|
||||
}
|
||||
paintDropTarget(e, DragHandler.NONE, e.getLocation());
|
||||
}
|
||||
|
||||
/** Return whether any of the flavors in the given list are accepted.
|
||||
* The list is compared against the accepted list provided in the
|
||||
* constructor.
|
||||
*/
|
||||
protected boolean isSupported(DataFlavor[] flavors) {
|
||||
Set<DataFlavor> set = new HashSet<DataFlavor>(Arrays.asList(flavors));
|
||||
set.retainAll(acceptedFlavors);
|
||||
return !set.isEmpty();
|
||||
}
|
||||
|
||||
/** Update the appearance of the target component. Normally the decoration
|
||||
* should be painted only if the event is an instance of
|
||||
* {@link DropTargetDragEvent} with an action that is not
|
||||
* {@link DragHandler#NONE}. Otherwise the decoration should be removed
|
||||
* or hidden.
|
||||
* <p>
|
||||
* For an easy way to highlight the drop target, consider using a single
|
||||
* instance of <code>AbstractComponentDecorator</code> and moving it
|
||||
* according to the intended drop location.
|
||||
* @param e The drop target event
|
||||
* @param action The action for the drop
|
||||
* @param location The intended drop location, or null if there is none
|
||||
*/
|
||||
protected void paintDropTarget(DropTargetEvent e, int action, Point location) {
|
||||
if (painter != null) {
|
||||
painter.paintDropTarget(e, action, location);
|
||||
}
|
||||
}
|
||||
|
||||
/** Indicate whether the given drop action is acceptable at the given
|
||||
* location. This method is the last check performed by
|
||||
* {@link #getDropAction(DropTargetEvent)}.
|
||||
* You may override this method to refuse drops on certain areas
|
||||
* within the drop target component. The default always returns true.
|
||||
*/
|
||||
protected boolean canDrop(DropTargetEvent e, int action, Point location) {
|
||||
return true;
|
||||
}
|
||||
|
||||
/** Handle an incoming drop with the given action. The action passed in
|
||||
* might be different from {@link DropTargetDropEvent#getDropAction},
|
||||
* for instance, if there are no modifiers and the default action is not
|
||||
* supported. Calling {@link DropTargetDropEvent#dropComplete} is
|
||||
* recommended as soon as the {@link Transferable} data is obtained; this
|
||||
* allows the drag source to reset the cursor and any drag images which
|
||||
* may be in effect.
|
||||
*/
|
||||
protected abstract void drop(DropTargetDropEvent e, int action) throws UnsupportedFlavorException, IOException;
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
/* Copyright (c) 2007 Timothy Wall, All Rights Reserved
|
||||
*
|
||||
* 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.
|
||||
* <p/>
|
||||
* 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.
|
||||
*/
|
||||
package com.sun.jna.platform.dnd;
|
||||
|
||||
import java.awt.Point;
|
||||
import java.awt.dnd.DropTargetEvent;
|
||||
|
||||
/** Provides a callback for {@link DropHandler} to customize drop target
|
||||
* feedback.
|
||||
* @author twall
|
||||
*/
|
||||
public interface DropTargetPainter {
|
||||
void paintDropTarget(DropTargetEvent e, int action, Point location);
|
||||
}
|
||||
@@ -0,0 +1,144 @@
|
||||
/* Copyright (c) 2007 Timothy Wall, All Rights Reserved
|
||||
*
|
||||
* 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.
|
||||
* <p/>
|
||||
* 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.
|
||||
*/
|
||||
package com.sun.jna.platform.dnd;
|
||||
|
||||
import java.awt.Component;
|
||||
import java.awt.Dimension;
|
||||
import java.awt.Graphics;
|
||||
import java.awt.GraphicsConfiguration;
|
||||
import java.awt.Point;
|
||||
import java.awt.Rectangle;
|
||||
import java.awt.Window;
|
||||
import java.awt.dnd.DragSource;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
import java.awt.geom.Area;
|
||||
|
||||
import javax.swing.Icon;
|
||||
import javax.swing.JOptionPane;
|
||||
import javax.swing.SwingUtilities;
|
||||
import javax.swing.Timer;
|
||||
|
||||
import com.sun.jna.platform.WindowUtils;
|
||||
|
||||
/** Provide a ghosted drag image for use during drags where
|
||||
* {@link DragSource#isDragImageSupported} returns false.<p>
|
||||
* Its location in screen coordinates may be changed via {@link #move}.<p>
|
||||
* When the image is no longer needed, invoke {@link #dispose}, which
|
||||
* hides the graphic immediately, or {@link #returnToOrigin}, which
|
||||
* moves the image to its original location and then disposes it.
|
||||
*/
|
||||
public class GhostedDragImage {
|
||||
|
||||
private static final float DEFAULT_ALPHA = .5f;
|
||||
private Window dragImage;
|
||||
// Initial image position, relative to drag source
|
||||
private Point origin;
|
||||
|
||||
/** Create a ghosted drag image, using the given icon.
|
||||
* @param icon image to be drawn
|
||||
* @param initialScreenLoc initial screen location of the image
|
||||
*/
|
||||
public GhostedDragImage(Component dragSource, final Icon icon, Point initialScreenLoc,
|
||||
final Point cursorOffset) {
|
||||
Window parent = dragSource instanceof Window
|
||||
? (Window)dragSource : SwingUtilities.getWindowAncestor(dragSource);
|
||||
// FIXME ensure gc is compatible (X11)
|
||||
GraphicsConfiguration gc = parent.getGraphicsConfiguration();
|
||||
dragImage = new Window(JOptionPane.getRootFrame(), gc) {
|
||||
private static final long serialVersionUID = 1L;
|
||||
public void paint(Graphics g) {
|
||||
icon.paintIcon(this, g, 0, 0);
|
||||
}
|
||||
public Dimension getPreferredSize() {
|
||||
return new Dimension(icon.getIconWidth(), icon.getIconHeight());
|
||||
}
|
||||
public Dimension getMinimumSize() {
|
||||
return getPreferredSize();
|
||||
}
|
||||
public Dimension getMaximumSize() {
|
||||
return getPreferredSize();
|
||||
}
|
||||
};
|
||||
dragImage.setFocusableWindowState(false);
|
||||
dragImage.setName("###overrideRedirect###");
|
||||
Icon dragIcon = new Icon() {
|
||||
public int getIconHeight() {
|
||||
return icon.getIconHeight();
|
||||
}
|
||||
public int getIconWidth() {
|
||||
return icon.getIconWidth();
|
||||
}
|
||||
public void paintIcon(Component c, Graphics g, int x, int y) {
|
||||
g = g.create();
|
||||
Area area = new Area(new Rectangle(x, y, getIconWidth(), getIconHeight()));
|
||||
// X11 needs more of a window due to differences in event processing
|
||||
area.subtract(new Area(new Rectangle(x + cursorOffset.x-1, y + cursorOffset.y-1, 3, 3)));
|
||||
g.setClip(area);
|
||||
icon.paintIcon(c, g, x, y);
|
||||
g.dispose();
|
||||
}
|
||||
|
||||
};
|
||||
dragImage.pack();
|
||||
WindowUtils.setWindowMask(dragImage, dragIcon);
|
||||
WindowUtils.setWindowAlpha(dragImage, DEFAULT_ALPHA);
|
||||
move(initialScreenLoc);
|
||||
dragImage.setVisible(true);
|
||||
}
|
||||
|
||||
/** Set the transparency of the ghosted image. */
|
||||
public void setAlpha(float alpha) {
|
||||
WindowUtils.setWindowAlpha(dragImage, alpha);
|
||||
}
|
||||
|
||||
/** Make all ghosted images go away. */
|
||||
public void dispose() {
|
||||
dragImage.dispose();
|
||||
dragImage = null;
|
||||
}
|
||||
|
||||
/** Move the ghosted image to the requested location.
|
||||
* @param screenLocation Where to draw the image, in screen coordinates
|
||||
*/
|
||||
public void move(Point screenLocation) {
|
||||
if (origin == null) {
|
||||
origin = screenLocation;
|
||||
}
|
||||
dragImage.setLocation(screenLocation.x, screenLocation.y);
|
||||
}
|
||||
|
||||
private static final int SLIDE_INTERVAL = 1000/30;
|
||||
/** Animate the ghosted image returning to its origin. */
|
||||
public void returnToOrigin() {
|
||||
final Timer timer = new Timer(SLIDE_INTERVAL, null);
|
||||
timer.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
Point location = dragImage.getLocationOnScreen();
|
||||
Point dst = new Point(origin);
|
||||
int dx = (dst.x - location.x)/2;
|
||||
int dy = (dst.y - location.y)/2;
|
||||
if (dx != 0 || dy != 0) {
|
||||
location.translate(dx, dy);
|
||||
move(location);
|
||||
}
|
||||
else {
|
||||
timer.stop();
|
||||
dispose();
|
||||
}
|
||||
}
|
||||
});
|
||||
timer.setInitialDelay(0);
|
||||
timer.start();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
<html>
|
||||
<head>
|
||||
<!--
|
||||
Copyright (c) 2010 Timothy Wall
|
||||
-->
|
||||
</head>
|
||||
<body bgcolor="white">
|
||||
|
||||
<!-- One sentence summary -->
|
||||
Provides integrated, extended drag and drop functionality,
|
||||
allowing ghosted drag images to be used on all platforms.
|
||||
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,92 @@
|
||||
/*
|
||||
* Copyright (c) 2011 Denis Tulskiy
|
||||
*
|
||||
* This program 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program 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
|
||||
* version 3 along with this work. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.sun.jna.platform.mac;
|
||||
|
||||
import java.nio.IntBuffer;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
import com.sun.jna.Library;
|
||||
import com.sun.jna.Callback;
|
||||
import com.sun.jna.Native;
|
||||
import com.sun.jna.Pointer;
|
||||
import com.sun.jna.Structure;
|
||||
import com.sun.jna.ptr.PointerByReference;
|
||||
|
||||
/**
|
||||
* Author: Denis Tulskiy
|
||||
* Date: 7/25/11
|
||||
*/
|
||||
public interface Carbon extends Library {
|
||||
public static Carbon INSTANCE = (Carbon) Native.loadLibrary("Carbon", Carbon.class);
|
||||
|
||||
public static final int cmdKey = 0x0100;
|
||||
public static final int shiftKey = 0x0200;
|
||||
public static final int optionKey = 0x0800;
|
||||
public static final int controlKey = 0x1000;
|
||||
|
||||
/**
|
||||
* Obtains the event target reference for the standard toolbox dispatcher
|
||||
*/
|
||||
public Pointer GetEventDispatcherTarget();
|
||||
|
||||
/**
|
||||
* Installs an event handler on a specified event target.
|
||||
*/
|
||||
public int InstallEventHandler(Pointer inTarget, EventHandlerProcPtr inHandler, int inNumTypes, EventTypeSpec[] inList, Pointer inUserData, PointerByReference outRef);
|
||||
|
||||
/**
|
||||
* Registers a global hot key.
|
||||
*/
|
||||
public int RegisterEventHotKey(int inHotKeyCode, int inHotKeyModifiers, EventHotKeyID.ByValue inHotKeyID, Pointer inTarget, int inOptions, PointerByReference outRef);
|
||||
|
||||
/**
|
||||
* Obtains a parameter from the specified event.
|
||||
*/
|
||||
public int GetEventParameter(Pointer inEvent, int inName, int inDesiredType, Pointer outActualType, int inBufferSize, IntBuffer outActualSize, EventHotKeyID outData);
|
||||
|
||||
/**
|
||||
* Removes the specified event handler
|
||||
*/
|
||||
public int RemoveEventHandler(Pointer inHandlerRef);
|
||||
|
||||
/**
|
||||
* Unregisters a global hot key.
|
||||
*/
|
||||
public int UnregisterEventHotKey(Pointer inHotKey);
|
||||
|
||||
public class EventTypeSpec extends Structure {
|
||||
public int eventClass;
|
||||
public int eventKind;
|
||||
protected List getFieldOrder() {
|
||||
return Arrays.asList(new String[] { "eventClass", "eventKind" }); }
|
||||
}
|
||||
|
||||
public static class EventHotKeyID extends Structure {
|
||||
public int signature;
|
||||
public int id;
|
||||
|
||||
public static class ByValue extends EventHotKeyID implements Structure.ByValue { }
|
||||
protected List getFieldOrder() {
|
||||
return Arrays.asList(new String[] { "signature", "id" }); }
|
||||
}
|
||||
|
||||
public static interface EventHandlerProcPtr extends Callback {
|
||||
public int callback(Pointer inHandlerCallRef, Pointer inEvent, Pointer inUserData);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,86 @@
|
||||
/* Copyright (c) 2007-2013 Timothy Wall, All Rights Reserved
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
package com.sun.jna.platform.mac;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
import com.sun.jna.Library;
|
||||
import com.sun.jna.Native;
|
||||
import com.sun.jna.Pointer;
|
||||
import com.sun.jna.Structure;
|
||||
import com.sun.jna.ptr.PointerByReference;
|
||||
import com.sun.jna.ptr.ByteByReference;
|
||||
import com.sun.jna.platform.FileUtils;
|
||||
|
||||
public class MacFileUtils extends FileUtils {
|
||||
|
||||
public boolean hasTrash() { return true; }
|
||||
|
||||
public interface FileManager extends Library {
|
||||
|
||||
public FileManager INSTANCE = (FileManager)Native.loadLibrary("CoreServices", FileManager.class);
|
||||
|
||||
int kFSFileOperationDefaultOptions = 0;
|
||||
int kFSFileOperationsOverwrite = 0x01;
|
||||
int kFSFileOperationsSkipSourcePermissionErrors = 0x02;
|
||||
int kFSFileOperationsDoNotMoveAcrossVolumes = 0x04;
|
||||
int kFSFileOperationsSkipPreflight = 0x08;
|
||||
|
||||
int kFSPathDefaultOptions = 0x0;
|
||||
int kFSPathMakeRefDoNotFollowLeafSymlink = 0x01;
|
||||
|
||||
class FSRef extends Structure {
|
||||
public byte[] hidden = new byte[80];
|
||||
protected List getFieldOrder() { return Arrays.asList(new String[] { "hidden" }); }
|
||||
}
|
||||
|
||||
// Deprecated; use trashItemAtURL instead:
|
||||
// https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSFileManager_Class/Reference/Reference.html#//apple_ref/occ/instm/NSFileManager/trashItemAtURL:resultingItemURL:error:
|
||||
int FSRefMakePath(FSRef fsref, byte[] path, int maxPathSize);
|
||||
int FSPathMakeRef(String source, int options, ByteByReference isDirectory);
|
||||
int FSPathMakeRefWithOptions(String source, int options, FSRef fsref, ByteByReference isDirectory);
|
||||
int FSPathMoveObjectToTrashSync(String source, PointerByReference target, int options);
|
||||
int FSMoveObjectToTrashSync(FSRef source, FSRef target, int options);
|
||||
}
|
||||
|
||||
public void moveToTrash(File[] files) throws IOException {
|
||||
File home = new File(System.getProperty("user.home"));
|
||||
File trash = new File(home, ".Trash");
|
||||
if (!trash.exists()) {
|
||||
throw new IOException("The Trash was not found in its expected location (" + trash + ")");
|
||||
}
|
||||
List<String> failed = new ArrayList<String>();
|
||||
for (int i=0;i < files.length;i++) {
|
||||
File src = files[i];
|
||||
FileManager.FSRef fsref = new FileManager.FSRef();
|
||||
int status = FileManager.INSTANCE.FSPathMakeRefWithOptions(src.getAbsolutePath(),
|
||||
FileManager.kFSPathMakeRefDoNotFollowLeafSymlink,
|
||||
fsref, null);
|
||||
if (status != 0) {
|
||||
failed.add(src + " (FSRef: " + status + ")");
|
||||
continue;
|
||||
}
|
||||
status = FileManager.INSTANCE.FSMoveObjectToTrashSync(fsref, null, 0);
|
||||
if (status != 0) {
|
||||
failed.add(src + " (" + status + ")");
|
||||
}
|
||||
}
|
||||
if (failed.size() > 0) {
|
||||
throw new IOException("The following files could not be trashed: " + failed);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
<html>
|
||||
<head>
|
||||
<!--
|
||||
Copyright (c) 2010 Timothy Wall
|
||||
-->
|
||||
</head>
|
||||
<body bgcolor="white">
|
||||
|
||||
<!-- One sentence summary -->
|
||||
Provides common library mappings for the OS X platform.
|
||||
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,13 @@
|
||||
<html>
|
||||
<head>
|
||||
<!--
|
||||
Copyright (c) 2010 Timothy Wall
|
||||
-->
|
||||
</head>
|
||||
<body bgcolor="white">
|
||||
|
||||
<!-- One sentence summary -->
|
||||
Provides cross-platform utilities based on platform-specific libraries.
|
||||
|
||||
</body>
|
||||
</html>
|
||||
Diferenças do arquivo suprimidas por serem muito extensas
Carregar Diff
@@ -0,0 +1,13 @@
|
||||
<html>
|
||||
<head>
|
||||
<!--
|
||||
Copyright (c) 2010 Timothy Wall
|
||||
-->
|
||||
</head>
|
||||
<body bgcolor="white">
|
||||
|
||||
<!-- One sentence summary -->
|
||||
Provides common library mappings for Unix and X11-based platforms.
|
||||
|
||||
</body>
|
||||
</html>
|
||||
Diferenças do arquivo suprimidas por serem muito extensas
Carregar Diff
Diferenças do arquivo suprimidas por serem muito extensas
Carregar Diff
@@ -0,0 +1,127 @@
|
||||
/* Copyright (c) 2010 Daniel Doubrovkine, All Rights Reserved
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
package com.sun.jna.platform.win32;
|
||||
|
||||
import com.sun.jna.IntegerType;
|
||||
import com.sun.jna.Pointer;
|
||||
import com.sun.jna.ptr.ByReference;
|
||||
import com.sun.jna.win32.StdCallLibrary;
|
||||
|
||||
/**
|
||||
* Based on basetsd.h (various types)
|
||||
* @author dblock[at]dblock[dot]org
|
||||
*/
|
||||
@SuppressWarnings("serial")
|
||||
public interface BaseTSD extends StdCallLibrary {
|
||||
/**
|
||||
* Signed long type for pointer precision.
|
||||
* Use when casting a pointer to a long to perform pointer arithmetic.
|
||||
*/
|
||||
public static class LONG_PTR extends IntegerType {
|
||||
public LONG_PTR() {
|
||||
this(0);
|
||||
}
|
||||
|
||||
public LONG_PTR(long value) {
|
||||
super(Pointer.SIZE, value);
|
||||
}
|
||||
|
||||
public Pointer toPointer() {
|
||||
return Pointer.createConstant(longValue());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Signed SIZE_T.
|
||||
*/
|
||||
public static class SSIZE_T extends LONG_PTR {
|
||||
public SSIZE_T() {
|
||||
this(0);
|
||||
}
|
||||
|
||||
public SSIZE_T(long value) {
|
||||
super(value);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Unsigned LONG_PTR.
|
||||
*/
|
||||
public static class ULONG_PTR extends IntegerType {
|
||||
public ULONG_PTR() {
|
||||
this(0);
|
||||
}
|
||||
|
||||
public ULONG_PTR(long value) {
|
||||
super(Pointer.SIZE, value, true);
|
||||
}
|
||||
|
||||
public Pointer toPointer() {
|
||||
return Pointer.createConstant(longValue());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* PULONG_PTR
|
||||
*/
|
||||
public static class ULONG_PTRByReference extends ByReference {
|
||||
public ULONG_PTRByReference() {
|
||||
this(new ULONG_PTR(0));
|
||||
}
|
||||
public ULONG_PTRByReference(ULONG_PTR value) {
|
||||
super(Pointer.SIZE);
|
||||
setValue(value);
|
||||
}
|
||||
public void setValue(ULONG_PTR value) {
|
||||
if (Pointer.SIZE == 4) {
|
||||
getPointer().setInt(0, value.intValue());
|
||||
}
|
||||
else {
|
||||
getPointer().setLong(0, value.longValue());
|
||||
}
|
||||
}
|
||||
public ULONG_PTR getValue() {
|
||||
return new ULONG_PTR(Pointer.SIZE == 4
|
||||
? getPointer().getInt(0)
|
||||
: getPointer().getLong(0));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Unsigned DWORD_PTR.
|
||||
*/
|
||||
public static class DWORD_PTR extends IntegerType {
|
||||
public DWORD_PTR() {
|
||||
this(0);
|
||||
}
|
||||
|
||||
public DWORD_PTR(long value) {
|
||||
super(Pointer.SIZE, value);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* The maximum number of bytes to which a pointer can point.
|
||||
* Use for a count that must span the full range of a pointer.
|
||||
*/
|
||||
public static class SIZE_T extends ULONG_PTR {
|
||||
public SIZE_T() {
|
||||
this(0);
|
||||
}
|
||||
|
||||
public SIZE_T(long value) {
|
||||
super(value);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,338 @@
|
||||
/* Copyright (c) 2012 Tobias Wolf, All Rights Reserved
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
package com.sun.jna.platform.win32.COM;
|
||||
|
||||
import com.sun.jna.WString;
|
||||
import com.sun.jna.platform.win32.Guid;
|
||||
import com.sun.jna.platform.win32.Guid.CLSID;
|
||||
import com.sun.jna.platform.win32.Kernel32;
|
||||
import com.sun.jna.platform.win32.OaIdl;
|
||||
import com.sun.jna.platform.win32.OaIdl.DISPID;
|
||||
import com.sun.jna.platform.win32.OaIdl.DISPIDByReference;
|
||||
import com.sun.jna.platform.win32.OaIdl.EXCEPINFO;
|
||||
import com.sun.jna.platform.win32.Ole32;
|
||||
import com.sun.jna.platform.win32.OleAuto;
|
||||
import com.sun.jna.platform.win32.OleAuto.DISPPARAMS;
|
||||
import com.sun.jna.platform.win32.Variant.VARIANT;
|
||||
import com.sun.jna.platform.win32.Variant.VariantArg;
|
||||
import com.sun.jna.platform.win32.WTypes;
|
||||
import com.sun.jna.platform.win32.WinDef.LCID;
|
||||
import com.sun.jna.platform.win32.WinDef.UINT;
|
||||
import com.sun.jna.platform.win32.WinNT.HRESULT;
|
||||
import com.sun.jna.ptr.IntByReference;
|
||||
import com.sun.jna.ptr.PointerByReference;
|
||||
|
||||
// TODO: Auto-generated Javadoc
|
||||
/**
|
||||
* Helper class to provide basic COM support.
|
||||
*
|
||||
* @author Tobias Wolf, wolf.tobias@gmx.net
|
||||
*/
|
||||
public class COMBindingBaseObject extends COMInvoker {
|
||||
|
||||
/** The Constant LOCALE_USER_DEFAULT. */
|
||||
public final static LCID LOCALE_USER_DEFAULT = Kernel32.INSTANCE
|
||||
.GetUserDefaultLCID();
|
||||
|
||||
/** The Constant LOCALE_SYSTEM_DEFAULT. */
|
||||
public final static LCID LOCALE_SYSTEM_DEFAULT = Kernel32.INSTANCE
|
||||
.GetSystemDefaultLCID();
|
||||
|
||||
/** The i unknown. */
|
||||
private IUnknown iUnknown;
|
||||
|
||||
/** The i dispatch. */
|
||||
private IDispatch iDispatch;
|
||||
|
||||
/** IDispatch interface reference. */
|
||||
private PointerByReference pDispatch = new PointerByReference();
|
||||
|
||||
/** IUnknown interface reference. */
|
||||
private PointerByReference pUnknown = new PointerByReference();
|
||||
|
||||
public COMBindingBaseObject(IDispatch dispatch) {
|
||||
// transfer the value
|
||||
this.iDispatch = dispatch;
|
||||
}
|
||||
|
||||
public COMBindingBaseObject(CLSID clsid, boolean useActiveInstance) {
|
||||
this(clsid, useActiveInstance, WTypes.CLSCTX_SERVER);
|
||||
}
|
||||
|
||||
public COMBindingBaseObject(CLSID clsid, boolean useActiveInstance,
|
||||
int dwClsContext) {
|
||||
// Initialize COM for this thread...
|
||||
HRESULT hr = Ole32.INSTANCE.CoInitialize(null);
|
||||
|
||||
if (COMUtils.FAILED(hr)) {
|
||||
Ole32.INSTANCE.CoUninitialize();
|
||||
throw new COMException("CoInitialize() failed!");
|
||||
}
|
||||
|
||||
if (useActiveInstance) {
|
||||
hr = OleAuto.INSTANCE.GetActiveObject(clsid, null, this.pUnknown);
|
||||
|
||||
if (COMUtils.SUCCEEDED(hr)) {
|
||||
this.iUnknown = new Unknown(this.pUnknown.getValue());
|
||||
hr = iUnknown.QueryInterface(IDispatch.IID_IDISPATCH,
|
||||
this.pDispatch);
|
||||
} else {
|
||||
hr = Ole32.INSTANCE.CoCreateInstance(clsid, null, dwClsContext,
|
||||
IDispatch.IID_IDISPATCH, this.pDispatch);
|
||||
}
|
||||
} else {
|
||||
hr = Ole32.INSTANCE.CoCreateInstance(clsid, null, dwClsContext,
|
||||
IDispatch.IID_IDISPATCH, this.pDispatch);
|
||||
}
|
||||
|
||||
if (COMUtils.FAILED(hr)) {
|
||||
throw new COMException("COM object with CLSID "
|
||||
+ clsid.toGuidString() + " not registered properly!");
|
||||
}
|
||||
|
||||
this.iDispatch = new Dispatch(this.pDispatch.getValue());
|
||||
}
|
||||
|
||||
public COMBindingBaseObject(String progId, boolean useActiveInstance,
|
||||
int dwClsContext) throws COMException {
|
||||
// Initialize COM for this thread...
|
||||
HRESULT hr = Ole32.INSTANCE.CoInitialize(null);
|
||||
|
||||
if (COMUtils.FAILED(hr)) {
|
||||
this.release();
|
||||
throw new COMException("CoInitialize() failed!");
|
||||
}
|
||||
|
||||
// Get CLSID for Word.Application...
|
||||
CLSID.ByReference clsid = new CLSID.ByReference();
|
||||
hr = Ole32.INSTANCE.CLSIDFromProgID(progId, clsid);
|
||||
|
||||
if (COMUtils.FAILED(hr)) {
|
||||
Ole32.INSTANCE.CoUninitialize();
|
||||
throw new COMException("CLSIDFromProgID() failed!");
|
||||
}
|
||||
|
||||
if (useActiveInstance) {
|
||||
hr = OleAuto.INSTANCE.GetActiveObject(clsid, null, this.pUnknown);
|
||||
|
||||
if (COMUtils.SUCCEEDED(hr)) {
|
||||
this.iUnknown = new Unknown(this.pUnknown.getValue());
|
||||
hr = iUnknown.QueryInterface(IDispatch.IID_IDISPATCH,
|
||||
this.pDispatch);
|
||||
} else {
|
||||
hr = Ole32.INSTANCE.CoCreateInstance(clsid, null, dwClsContext,
|
||||
IDispatch.IID_IDISPATCH, this.pDispatch);
|
||||
}
|
||||
} else {
|
||||
hr = Ole32.INSTANCE.CoCreateInstance(clsid, null, dwClsContext,
|
||||
IDispatch.IID_IDISPATCH, this.pDispatch);
|
||||
}
|
||||
|
||||
if (COMUtils.FAILED(hr)) {
|
||||
throw new COMException("COM object with ProgID '" + progId
|
||||
+ "' and CLSID " + clsid.toGuidString()
|
||||
+ " not registered properly!");
|
||||
}
|
||||
|
||||
this.iDispatch = new Dispatch(this.pDispatch.getValue());
|
||||
}
|
||||
|
||||
public COMBindingBaseObject(String progId, boolean useActiveInstance)
|
||||
throws COMException {
|
||||
this(progId, useActiveInstance, WTypes.CLSCTX_SERVER);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the i dispatch.
|
||||
*
|
||||
* @return the i dispatch
|
||||
*/
|
||||
public IDispatch getIDispatch() {
|
||||
return iDispatch;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the i dispatch pointer.
|
||||
*
|
||||
* @return the i dispatch pointer
|
||||
*/
|
||||
public PointerByReference getIDispatchPointer() {
|
||||
return pDispatch;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the i unknown.
|
||||
*
|
||||
* @return the i unknown
|
||||
*/
|
||||
public IUnknown getIUnknown() {
|
||||
return iUnknown;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the i unknown pointer.
|
||||
*
|
||||
* @return the i unknown pointer
|
||||
*/
|
||||
public PointerByReference getIUnknownPointer() {
|
||||
return pUnknown;
|
||||
}
|
||||
|
||||
/**
|
||||
* Release.
|
||||
*/
|
||||
public void release() {
|
||||
if (this.iDispatch != null)
|
||||
this.iDispatch.Release();
|
||||
|
||||
Ole32.INSTANCE.CoUninitialize();
|
||||
}
|
||||
|
||||
protected HRESULT oleMethod(int nType, VARIANT.ByReference pvResult,
|
||||
IDispatch pDisp, String name, VARIANT[] pArgs) throws COMException {
|
||||
|
||||
if (pDisp == null)
|
||||
throw new COMException("pDisp (IDispatch) parameter is null!");
|
||||
|
||||
// variable declaration
|
||||
WString[] ptName = new WString[] { new WString(name) };
|
||||
DISPIDByReference pdispID = new DISPIDByReference();
|
||||
|
||||
// Get DISPID for name passed...
|
||||
HRESULT hr = pDisp.GetIDsOfNames(Guid.IID_NULL, ptName, 1,
|
||||
LOCALE_USER_DEFAULT, pdispID);
|
||||
|
||||
COMUtils.checkRC(hr);
|
||||
|
||||
return this
|
||||
.oleMethod(nType, pvResult, pDisp, pdispID.getValue(), pArgs);
|
||||
}
|
||||
|
||||
protected HRESULT oleMethod(int nType, VARIANT.ByReference pvResult,
|
||||
IDispatch pDisp, DISPID dispId, VARIANT[] pArgs)
|
||||
throws COMException {
|
||||
|
||||
if (pDisp == null)
|
||||
throw new COMException("pDisp (IDispatch) parameter is null!");
|
||||
|
||||
// variable declaration
|
||||
int _argsLen = 0;
|
||||
VARIANT[] _args = null;
|
||||
DISPPARAMS dp = new DISPPARAMS();
|
||||
EXCEPINFO.ByReference pExcepInfo = new EXCEPINFO.ByReference();
|
||||
IntByReference puArgErr = new IntByReference();
|
||||
|
||||
// make parameter reverse ordering as expected by COM runtime
|
||||
if ((pArgs != null) && (pArgs.length > 0)) {
|
||||
_argsLen = pArgs.length;
|
||||
_args = new VARIANT[_argsLen];
|
||||
|
||||
int revCount = _argsLen;
|
||||
for (int i = 0; i < _argsLen; i++) {
|
||||
_args[i] = pArgs[--revCount];
|
||||
}
|
||||
}
|
||||
|
||||
// Handle special-case for property-puts!
|
||||
if (nType == OleAuto.DISPATCH_PROPERTYPUT) {
|
||||
dp.cNamedArgs = new UINT(_argsLen);
|
||||
dp.rgdispidNamedArgs = new DISPIDByReference(
|
||||
OaIdl.DISPID_PROPERTYPUT);
|
||||
}
|
||||
|
||||
// Build DISPPARAMS
|
||||
if (_argsLen > 0) {
|
||||
dp.cArgs = new UINT(_args.length);
|
||||
// make pointer of variant array
|
||||
dp.rgvarg = new VariantArg.ByReference(_args);
|
||||
|
||||
// write 'DISPPARAMS' structure to memory
|
||||
dp.write();
|
||||
}
|
||||
|
||||
// Make the call!
|
||||
HRESULT hr = pDisp.Invoke(dispId, Guid.IID_NULL, LOCALE_SYSTEM_DEFAULT,
|
||||
new DISPID(nType), dp, pvResult, pExcepInfo, puArgErr);
|
||||
|
||||
COMUtils.checkRC(hr, pExcepInfo, puArgErr);
|
||||
return hr;
|
||||
}
|
||||
|
||||
/**
|
||||
* Ole method.
|
||||
*
|
||||
* @param nType
|
||||
* the n type
|
||||
* @param pvResult
|
||||
* the pv result
|
||||
* @param pDisp
|
||||
* the disp
|
||||
* @param name
|
||||
* the name
|
||||
* @param pArg
|
||||
* the arg
|
||||
* @return the hresult
|
||||
* @throws COMException
|
||||
* the cOM exception
|
||||
*/
|
||||
protected HRESULT oleMethod(int nType, VARIANT.ByReference pvResult,
|
||||
IDispatch pDisp, String name, VARIANT pArg) throws COMException {
|
||||
|
||||
return this.oleMethod(nType, pvResult, pDisp, name,
|
||||
new VARIANT[] { pArg });
|
||||
}
|
||||
|
||||
protected HRESULT oleMethod(int nType, VARIANT.ByReference pvResult,
|
||||
IDispatch pDisp, DISPID dispId, VARIANT pArg) throws COMException {
|
||||
|
||||
return this.oleMethod(nType, pvResult, pDisp, dispId,
|
||||
new VARIANT[] { pArg });
|
||||
}
|
||||
|
||||
/**
|
||||
* Ole method.
|
||||
*
|
||||
* @param nType
|
||||
* the n type
|
||||
* @param pvResult
|
||||
* the pv result
|
||||
* @param pDisp
|
||||
* the disp
|
||||
* @param name
|
||||
* the name
|
||||
* @return the hresult
|
||||
* @throws COMException
|
||||
* the cOM exception
|
||||
*/
|
||||
protected HRESULT oleMethod(int nType, VARIANT.ByReference pvResult,
|
||||
IDispatch pDisp, String name) throws COMException {
|
||||
|
||||
return this.oleMethod(nType, pvResult, pDisp, name, (VARIANT[]) null);
|
||||
}
|
||||
|
||||
protected HRESULT oleMethod(int nType, VARIANT.ByReference pvResult,
|
||||
IDispatch pDisp, DISPID dispId) throws COMException {
|
||||
|
||||
return this.oleMethod(nType, pvResult, pDisp, dispId, (VARIANT[]) null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Check failed.
|
||||
*
|
||||
* @param hr
|
||||
* the hr
|
||||
*/
|
||||
protected void checkFailed(HRESULT hr) {
|
||||
COMUtils.checkRC(hr, null, null);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,100 @@
|
||||
/* Copyright (c) 2012 Tobias Wolf, All Rights Reserved
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
package com.sun.jna.platform.win32.COM;
|
||||
|
||||
import com.sun.jna.WString;
|
||||
import com.sun.jna.platform.win32.Guid.CLSID;
|
||||
import com.sun.jna.platform.win32.Guid.IID;
|
||||
import com.sun.jna.platform.win32.OaIdl.DISPID;
|
||||
import com.sun.jna.platform.win32.OaIdl.DISPIDByReference;
|
||||
import com.sun.jna.platform.win32.OaIdl.EXCEPINFO;
|
||||
import com.sun.jna.platform.win32.OleAuto;
|
||||
import com.sun.jna.platform.win32.OleAuto.DISPPARAMS;
|
||||
import com.sun.jna.platform.win32.Variant.VARIANT;
|
||||
import com.sun.jna.platform.win32.Variant.VARIANT.ByReference;
|
||||
import com.sun.jna.platform.win32.WinDef.LCID;
|
||||
import com.sun.jna.platform.win32.WinDef.UINT;
|
||||
import com.sun.jna.platform.win32.WinDef.UINTByReference;
|
||||
import com.sun.jna.platform.win32.WinNT.HRESULT;
|
||||
import com.sun.jna.ptr.IntByReference;
|
||||
import com.sun.jna.ptr.PointerByReference;
|
||||
|
||||
// TODO: Auto-generated Javadoc
|
||||
/**
|
||||
* Helper class to provide basic COM support.
|
||||
*
|
||||
* @author Tobias Wolf, wolf.tobias@gmx.net
|
||||
*/
|
||||
public class COMEarlyBindingObject extends COMBindingBaseObject implements
|
||||
IDispatch {
|
||||
|
||||
public COMEarlyBindingObject(CLSID clsid, boolean useActiveInstance,
|
||||
int dwClsContext) {
|
||||
super(clsid, useActiveInstance, dwClsContext);
|
||||
}
|
||||
|
||||
protected String getStringProperty(DISPID dispId) {
|
||||
VARIANT.ByReference result = new VARIANT.ByReference();
|
||||
this.oleMethod(OleAuto.DISPATCH_PROPERTYGET, result,
|
||||
this.getIDispatch(), dispId);
|
||||
|
||||
return result.getValue().toString();
|
||||
}
|
||||
|
||||
protected void setProperty(DISPID dispId, boolean value) {
|
||||
this.oleMethod(OleAuto.DISPATCH_PROPERTYPUT, null, this.getIDispatch(),
|
||||
dispId, new VARIANT(value));
|
||||
}
|
||||
|
||||
@Override
|
||||
public HRESULT QueryInterface(IID riid, PointerByReference ppvObject) {
|
||||
return this.getIDispatch().QueryInterface(riid, ppvObject);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int AddRef() {
|
||||
return this.getIDispatch().AddRef();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int Release() {
|
||||
return this.getIDispatch().Release();
|
||||
}
|
||||
|
||||
@Override
|
||||
public HRESULT GetTypeInfoCount(UINTByReference pctinfo) {
|
||||
return this.getIDispatch().GetTypeInfoCount(pctinfo);
|
||||
}
|
||||
|
||||
@Override
|
||||
public HRESULT GetTypeInfo(UINT iTInfo, LCID lcid,
|
||||
PointerByReference ppTInfo) {
|
||||
return this.getIDispatch().GetTypeInfo(iTInfo, lcid, ppTInfo);
|
||||
}
|
||||
|
||||
@Override
|
||||
public HRESULT GetIDsOfNames(IID riid, WString[] rgszNames, int cNames,
|
||||
LCID lcid, DISPIDByReference rgDispId) {
|
||||
return this.getIDispatch().GetIDsOfNames(riid, rgszNames, cNames, lcid,
|
||||
rgDispId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public HRESULT Invoke(DISPID dispIdMember, IID riid, LCID lcid,
|
||||
DISPID wFlags, DISPPARAMS pDispParams, ByReference pVarResult,
|
||||
EXCEPINFO.ByReference pExcepInfo,
|
||||
IntByReference puArgErr) {
|
||||
return this.getIDispatch().Invoke(dispIdMember, riid, lcid, wFlags,
|
||||
pDispParams, pVarResult, pExcepInfo, puArgErr);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,115 @@
|
||||
/* Copyright (c) 2012 Tobias Wolf, All Rights Reserved
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
package com.sun.jna.platform.win32.COM;
|
||||
|
||||
import com.sun.jna.platform.win32.OaIdl.EXCEPINFO;
|
||||
import com.sun.jna.ptr.IntByReference;
|
||||
|
||||
// TODO: Auto-generated Javadoc
|
||||
/**
|
||||
* Exception class for all COM related classes.
|
||||
*
|
||||
* @author Tobias Wolf, wolf.tobias@gmx.net
|
||||
*/
|
||||
public class COMException extends RuntimeException {
|
||||
|
||||
/** The p excep info. */
|
||||
private EXCEPINFO pExcepInfo;
|
||||
|
||||
/** The pu arg err. */
|
||||
private IntByReference puArgErr;
|
||||
|
||||
private int uArgErr;
|
||||
|
||||
/**
|
||||
* Instantiates a new automation exception.
|
||||
*/
|
||||
public COMException() {
|
||||
super();
|
||||
}
|
||||
|
||||
/**
|
||||
* Instantiates a new automation exception.
|
||||
*
|
||||
* @param message
|
||||
* the message
|
||||
* @param cause
|
||||
* the cause
|
||||
*/
|
||||
public COMException(String message, Throwable cause) {
|
||||
super(message, cause);
|
||||
}
|
||||
|
||||
/**
|
||||
* Instantiates a new automation exception.
|
||||
*
|
||||
* @param message
|
||||
* the message
|
||||
*/
|
||||
public COMException(String message) {
|
||||
super(message);
|
||||
}
|
||||
|
||||
/**
|
||||
* Instantiates a new automation exception.
|
||||
*
|
||||
* @param message
|
||||
* the message
|
||||
* @param pExcepInfo
|
||||
* the excep info
|
||||
* @param puArgErr
|
||||
* the pu arg err
|
||||
*/
|
||||
public COMException(String message, EXCEPINFO pExcepInfo,
|
||||
IntByReference puArgErr) {
|
||||
super(message + " (puArgErr=" + puArgErr.getValue() + ")");
|
||||
this.pExcepInfo = pExcepInfo;
|
||||
this.puArgErr = puArgErr;
|
||||
}
|
||||
|
||||
/**
|
||||
* Instantiates a new automation exception.
|
||||
*
|
||||
* @param cause
|
||||
* the cause
|
||||
*/
|
||||
public COMException(Throwable cause) {
|
||||
super(cause);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the excep info.
|
||||
*
|
||||
* @return the excep info
|
||||
*/
|
||||
public EXCEPINFO getExcepInfo() {
|
||||
return pExcepInfo;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the arg err.
|
||||
*
|
||||
* @return the arg err
|
||||
*/
|
||||
public IntByReference getArgErr() {
|
||||
return puArgErr;
|
||||
}
|
||||
|
||||
public int getuArgErr() {
|
||||
return uArgErr;
|
||||
}
|
||||
|
||||
public void setuArgErr(int uArgErr) {
|
||||
this.uArgErr = uArgErr;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
/* Copyright (c) 2013 Tobias Wolf, All Rights Reserved
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
package com.sun.jna.platform.win32.COM;
|
||||
|
||||
import com.sun.jna.Function;
|
||||
import com.sun.jna.Pointer;
|
||||
import com.sun.jna.PointerType;
|
||||
|
||||
public abstract class COMInvoker extends PointerType {
|
||||
|
||||
protected int _invokeNativeInt(int vtableId, Object[] args) {
|
||||
Pointer vptr = this.getPointer().getPointer(0);
|
||||
// we take the vtable id and multiply with the pointer size (4 bytes on
|
||||
// 32bit OS)
|
||||
Function func = Function.getFunction(vptr.getPointer(vtableId
|
||||
* Pointer.SIZE));
|
||||
return func.invokeInt(args);
|
||||
}
|
||||
|
||||
protected Object _invokeNativeObject(int vtableId, Object[] args,
|
||||
Class returnType) {
|
||||
Pointer vptr = this.getPointer().getPointer(0);
|
||||
// we take the vtable id and multiply with the pointer size (4 bytes on
|
||||
// 32bit OS)
|
||||
Function func = Function.getFunction(vptr.getPointer(vtableId
|
||||
* Pointer.SIZE));
|
||||
return func.invoke(returnType, args);
|
||||
}
|
||||
|
||||
protected void _invokeNativeVoid(int vtableId, Object[] args) {
|
||||
Pointer vptr = this.getPointer().getPointer(0);
|
||||
// we take the vtable id and multiply with the pointer size (4 bytes on
|
||||
// 32bit OS)
|
||||
Function func = Function.getFunction(vptr.getPointer(vtableId
|
||||
* Pointer.SIZE));
|
||||
func.invokeVoid(args);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,622 @@
|
||||
/* Copyright (c) 2012 Tobias Wolf, All Rights Reserved
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
package com.sun.jna.platform.win32.COM;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
import com.sun.jna.platform.win32.Guid.CLSID;
|
||||
import com.sun.jna.platform.win32.OaIdl.VARIANT_BOOL;
|
||||
import com.sun.jna.platform.win32.OleAuto;
|
||||
import com.sun.jna.platform.win32.Variant.VARIANT;
|
||||
import com.sun.jna.platform.win32.WinDef.LONG;
|
||||
import com.sun.jna.platform.win32.WinDef.SHORT;
|
||||
|
||||
// TODO: Auto-generated Javadoc
|
||||
/**
|
||||
* Helper class to provide basic COM support.
|
||||
*
|
||||
* @author Tobias Wolf, wolf.tobias@gmx.net
|
||||
*/
|
||||
public class COMLateBindingObject extends COMBindingBaseObject {
|
||||
|
||||
/**
|
||||
* Instantiates a new cOM object.
|
||||
*
|
||||
* @param iDispatch
|
||||
* the i dispatch
|
||||
*/
|
||||
public COMLateBindingObject(IDispatch iDispatch) {
|
||||
super(iDispatch);
|
||||
}
|
||||
|
||||
/**
|
||||
* Instantiates a new cOM object.
|
||||
*
|
||||
* @param clsid
|
||||
* the clsid
|
||||
* @param useActiveInstance
|
||||
* the use active instance
|
||||
*/
|
||||
public COMLateBindingObject(CLSID clsid, boolean useActiveInstance) {
|
||||
super(clsid, useActiveInstance);
|
||||
}
|
||||
|
||||
/**
|
||||
* Instantiates a new cOM object.
|
||||
*
|
||||
* @param progId
|
||||
* the prog id
|
||||
* @param useActiveInstance
|
||||
* the use active instance
|
||||
* @throws COMException
|
||||
* the automation exception
|
||||
*/
|
||||
public COMLateBindingObject(String progId, boolean useActiveInstance)
|
||||
throws COMException {
|
||||
super(progId, useActiveInstance);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the automation property.
|
||||
*
|
||||
* @param propertyName
|
||||
* the property name
|
||||
* @return the automation property
|
||||
*/
|
||||
protected IDispatch getAutomationProperty(String propertyName) {
|
||||
VARIANT.ByReference result = new VARIANT.ByReference();
|
||||
this.oleMethod(OleAuto.DISPATCH_PROPERTYGET, result,
|
||||
this.getIDispatch(), propertyName);
|
||||
|
||||
return ((IDispatch) result.getValue());
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the automation property.
|
||||
*
|
||||
* @param propertyName
|
||||
* the property name
|
||||
* @param comObject
|
||||
* the com object
|
||||
* @return the automation property
|
||||
*/
|
||||
protected IDispatch getAutomationProperty(String propertyName,
|
||||
COMLateBindingObject comObject) {
|
||||
VARIANT.ByReference result = new VARIANT.ByReference();
|
||||
this.oleMethod(OleAuto.DISPATCH_PROPERTYGET, result,
|
||||
comObject.getIDispatch(), propertyName);
|
||||
|
||||
return ((IDispatch) result.getValue());
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the automation property.
|
||||
*
|
||||
* @param propertyName
|
||||
* the property name
|
||||
* @param comObject
|
||||
* the com object
|
||||
* @param value
|
||||
* the value
|
||||
* @return the automation property
|
||||
*/
|
||||
protected IDispatch getAutomationProperty(String propertyName,
|
||||
COMLateBindingObject comObject, VARIANT value) {
|
||||
VARIANT.ByReference result = new VARIANT.ByReference();
|
||||
this.oleMethod(OleAuto.DISPATCH_PROPERTYGET, result,
|
||||
comObject.getIDispatch(), propertyName, value);
|
||||
|
||||
return ((IDispatch) result.getValue());
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the automation property.
|
||||
*
|
||||
* @param propertyName
|
||||
* the property name
|
||||
* @param iDispatch
|
||||
* the i dispatch
|
||||
* @return the automation property
|
||||
*/
|
||||
protected IDispatch getAutomationProperty(String propertyName,
|
||||
IDispatch iDispatch) {
|
||||
VARIANT.ByReference result = new VARIANT.ByReference();
|
||||
this.oleMethod(OleAuto.DISPATCH_PROPERTYGET, result,
|
||||
this.getIDispatch(), propertyName);
|
||||
|
||||
return ((IDispatch) result.getValue());
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the boolean property.
|
||||
*
|
||||
* @param propertyName
|
||||
* the property name
|
||||
* @return the boolean property
|
||||
*/
|
||||
protected boolean getBooleanProperty(String propertyName) {
|
||||
VARIANT.ByReference result = new VARIANT.ByReference();
|
||||
this.oleMethod(OleAuto.DISPATCH_PROPERTYGET, result,
|
||||
this.getIDispatch(), propertyName);
|
||||
|
||||
return (((VARIANT_BOOL) result.getValue()).intValue() != 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the date property.
|
||||
*
|
||||
* @param propertyName
|
||||
* the property name
|
||||
* @return the date property
|
||||
*/
|
||||
protected Date getDateProperty(String propertyName) {
|
||||
VARIANT.ByReference result = new VARIANT.ByReference();
|
||||
this.oleMethod(OleAuto.DISPATCH_PROPERTYGET, result,
|
||||
this.getIDispatch(), propertyName);
|
||||
|
||||
return result.dateValue();
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the int property.
|
||||
*
|
||||
* @param propertyName
|
||||
* the property name
|
||||
* @return the int property
|
||||
*/
|
||||
protected int getIntProperty(String propertyName) {
|
||||
VARIANT.ByReference result = new VARIANT.ByReference();
|
||||
this.oleMethod(OleAuto.DISPATCH_PROPERTYGET, result,
|
||||
this.getIDispatch(), propertyName);
|
||||
|
||||
return ((LONG) result.getValue()).intValue();
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the short property.
|
||||
*
|
||||
* @param propertyName
|
||||
* the property name
|
||||
* @return the short property
|
||||
*/
|
||||
protected short getShortProperty(String propertyName) {
|
||||
VARIANT.ByReference result = new VARIANT.ByReference();
|
||||
this.oleMethod(OleAuto.DISPATCH_PROPERTYGET, result,
|
||||
this.getIDispatch(), propertyName);
|
||||
|
||||
return ((SHORT) result.getValue()).shortValue();
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the string property.
|
||||
*
|
||||
* @param propertyName
|
||||
* the property name
|
||||
* @return the string property
|
||||
*/
|
||||
protected String getStringProperty(String propertyName) {
|
||||
VARIANT.ByReference result = new VARIANT.ByReference();
|
||||
this.oleMethod(OleAuto.DISPATCH_PROPERTYGET, result,
|
||||
this.getIDispatch(), propertyName);
|
||||
|
||||
return result.getValue().toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Invoke.
|
||||
*
|
||||
* @param methodName
|
||||
* the method name
|
||||
* @return the variant
|
||||
*/
|
||||
protected VARIANT invoke(String methodName) {
|
||||
VARIANT.ByReference result = new VARIANT.ByReference();
|
||||
this.oleMethod(OleAuto.DISPATCH_METHOD, result, this.getIDispatch(),
|
||||
methodName);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Invoke.
|
||||
*
|
||||
* @param methodName
|
||||
* the method name
|
||||
* @param arg
|
||||
* the arg
|
||||
* @return the variant
|
||||
*/
|
||||
protected VARIANT invoke(String methodName, VARIANT arg) {
|
||||
VARIANT.ByReference result = new VARIANT.ByReference();
|
||||
this.oleMethod(OleAuto.DISPATCH_METHOD, result, this.getIDispatch(),
|
||||
methodName, arg);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Invoke.
|
||||
*
|
||||
* @param methodName
|
||||
* the method name
|
||||
* @param args
|
||||
* the args
|
||||
* @return the variant
|
||||
*/
|
||||
protected VARIANT invoke(String methodName, VARIANT[] args) {
|
||||
VARIANT.ByReference result = new VARIANT.ByReference();
|
||||
this.oleMethod(OleAuto.DISPATCH_METHOD, result, this.getIDispatch(),
|
||||
methodName, args);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Invoke.
|
||||
*
|
||||
* @param methodName
|
||||
* the method name
|
||||
* @param arg1
|
||||
* the arg1
|
||||
* @param arg2
|
||||
* the arg2
|
||||
* @return the variant
|
||||
*/
|
||||
protected VARIANT invoke(String methodName, VARIANT arg1, VARIANT arg2) {
|
||||
return invoke(methodName, new VARIANT[] { arg1, arg2 });
|
||||
}
|
||||
|
||||
/**
|
||||
* Invoke.
|
||||
*
|
||||
* @param methodName
|
||||
* the method name
|
||||
* @param arg1
|
||||
* the arg1
|
||||
* @param arg2
|
||||
* the arg2
|
||||
* @param arg3
|
||||
* the arg3
|
||||
* @return the variant
|
||||
*/
|
||||
protected VARIANT invoke(String methodName, VARIANT arg1, VARIANT arg2,
|
||||
VARIANT arg3) {
|
||||
return invoke(methodName, new VARIANT[] { arg1, arg2, arg3 });
|
||||
}
|
||||
|
||||
/**
|
||||
* Invoke.
|
||||
*
|
||||
* @param methodName
|
||||
* the method name
|
||||
* @param arg1
|
||||
* the arg1
|
||||
* @param arg2
|
||||
* the arg2
|
||||
* @param arg3
|
||||
* the arg3
|
||||
* @param arg4
|
||||
* the arg4
|
||||
* @return the variant
|
||||
*/
|
||||
protected VARIANT invoke(String methodName, VARIANT arg1, VARIANT arg2,
|
||||
VARIANT arg3, VARIANT arg4) {
|
||||
return invoke(methodName, new VARIANT[] { arg1, arg2, arg3, arg4 });
|
||||
}
|
||||
|
||||
/**
|
||||
* Invoke no reply.
|
||||
*
|
||||
* @param methodName
|
||||
* the method name
|
||||
* @param dispatch
|
||||
* the dispatch
|
||||
*/
|
||||
protected void invokeNoReply(String methodName, IDispatch dispatch) {
|
||||
this.oleMethod(OleAuto.DISPATCH_METHOD, null, dispatch, methodName);
|
||||
}
|
||||
|
||||
/**
|
||||
* Invoke no reply.
|
||||
*
|
||||
* @param methodName
|
||||
* the method name
|
||||
* @param comObject
|
||||
* the com object
|
||||
*/
|
||||
protected void invokeNoReply(String methodName,
|
||||
COMLateBindingObject comObject) {
|
||||
this.oleMethod(OleAuto.DISPATCH_METHOD, null, comObject.getIDispatch(),
|
||||
methodName);
|
||||
}
|
||||
|
||||
/**
|
||||
* Invoke no reply.
|
||||
*
|
||||
* @param methodName
|
||||
* the method name
|
||||
* @param dispatch
|
||||
* the dispatch
|
||||
* @param arg
|
||||
* the arg
|
||||
*/
|
||||
protected void invokeNoReply(String methodName, IDispatch dispatch,
|
||||
VARIANT arg) {
|
||||
this.oleMethod(OleAuto.DISPATCH_METHOD, null, dispatch, methodName, arg);
|
||||
}
|
||||
|
||||
/**
|
||||
* Invoke no reply.
|
||||
*
|
||||
* @param methodName
|
||||
* the method name
|
||||
* @param dispatch
|
||||
* the dispatch
|
||||
* @param arg1
|
||||
* the arg1
|
||||
* @param arg2
|
||||
* the arg2
|
||||
*/
|
||||
protected void invokeNoReply(String methodName, IDispatch dispatch,
|
||||
VARIANT arg1, VARIANT arg2) {
|
||||
this.oleMethod(OleAuto.DISPATCH_METHOD, null, dispatch, methodName,
|
||||
new VARIANT[] { arg1, arg2 });
|
||||
}
|
||||
|
||||
protected void invokeNoReply(String methodName, COMLateBindingObject comObject,
|
||||
VARIANT arg1, VARIANT arg2) {
|
||||
this.oleMethod(OleAuto.DISPATCH_METHOD, null, comObject.getIDispatch(), methodName,
|
||||
new VARIANT[] { arg1, arg2 });
|
||||
}
|
||||
|
||||
/**
|
||||
* Invoke no reply.
|
||||
*
|
||||
* @param methodName
|
||||
* the method name
|
||||
* @param comObject
|
||||
* the com object
|
||||
* @param arg
|
||||
* the arg
|
||||
*/
|
||||
protected void invokeNoReply(String methodName,
|
||||
COMLateBindingObject comObject, VARIANT arg) {
|
||||
this.oleMethod(OleAuto.DISPATCH_METHOD, null, comObject.getIDispatch(),
|
||||
methodName, arg);
|
||||
}
|
||||
|
||||
/**
|
||||
* Invoke no reply.
|
||||
*
|
||||
* @param methodName
|
||||
* the method name
|
||||
* @param dispatch
|
||||
* the dispatch
|
||||
* @param args
|
||||
* the args
|
||||
*/
|
||||
protected void invokeNoReply(String methodName, IDispatch dispatch,
|
||||
VARIANT[] args) {
|
||||
this.oleMethod(OleAuto.DISPATCH_METHOD, null, dispatch, methodName,
|
||||
args);
|
||||
}
|
||||
|
||||
/**
|
||||
* Invoke no reply.
|
||||
*
|
||||
* @param methodName
|
||||
* the method name
|
||||
*/
|
||||
protected void invokeNoReply(String methodName) {
|
||||
VARIANT.ByReference result = new VARIANT.ByReference();
|
||||
this.oleMethod(OleAuto.DISPATCH_METHOD, result, this.getIDispatch(),
|
||||
methodName);
|
||||
}
|
||||
|
||||
/**
|
||||
* Invoke no reply.
|
||||
*
|
||||
* @param methodName
|
||||
* the method name
|
||||
* @param arg
|
||||
* the arg
|
||||
*/
|
||||
protected void invokeNoReply(String methodName, VARIANT arg) {
|
||||
VARIANT.ByReference result = new VARIANT.ByReference();
|
||||
this.oleMethod(OleAuto.DISPATCH_METHOD, result, this.getIDispatch(),
|
||||
methodName, arg);
|
||||
}
|
||||
|
||||
/**
|
||||
* Invoke no reply.
|
||||
*
|
||||
* @param methodName
|
||||
* the method name
|
||||
* @param args
|
||||
* the args
|
||||
*/
|
||||
protected void invokeNoReply(String methodName, VARIANT[] args) {
|
||||
VARIANT.ByReference result = new VARIANT.ByReference();
|
||||
this.oleMethod(OleAuto.DISPATCH_METHOD, result, this.getIDispatch(),
|
||||
methodName, args);
|
||||
}
|
||||
|
||||
/**
|
||||
* Invoke no reply.
|
||||
*
|
||||
* @param methodName
|
||||
* the method name
|
||||
* @param arg1
|
||||
* the arg1
|
||||
* @param arg2
|
||||
* the arg2
|
||||
*/
|
||||
protected void invokeNoReply(String methodName, VARIANT arg1, VARIANT arg2) {
|
||||
invokeNoReply(methodName, new VARIANT[] { arg1, arg2 });
|
||||
}
|
||||
|
||||
/**
|
||||
* Invoke no reply.
|
||||
*
|
||||
* @param methodName
|
||||
* the method name
|
||||
* @param arg1
|
||||
* the arg1
|
||||
* @param arg2
|
||||
* the arg2
|
||||
* @param arg3
|
||||
* the arg3
|
||||
*/
|
||||
protected void invokeNoReply(String methodName, VARIANT arg1, VARIANT arg2,
|
||||
VARIANT arg3) {
|
||||
invokeNoReply(methodName, new VARIANT[] { arg1, arg2, arg3 });
|
||||
}
|
||||
|
||||
/**
|
||||
* Invoke no reply.
|
||||
*
|
||||
* @param methodName
|
||||
* the method name
|
||||
* @param arg1
|
||||
* the arg1
|
||||
* @param arg2
|
||||
* the arg2
|
||||
* @param arg3
|
||||
* the arg3
|
||||
* @param arg4
|
||||
* the arg4
|
||||
*/
|
||||
protected void invokeNoReply(String methodName, VARIANT arg1, VARIANT arg2,
|
||||
VARIANT arg3, VARIANT arg4) {
|
||||
invokeNoReply(methodName, new VARIANT[] { arg1, arg2, arg3, arg4 });
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the property.
|
||||
*
|
||||
* @param propertyName
|
||||
* the property name
|
||||
* @param value
|
||||
* the value
|
||||
*/
|
||||
protected void setProperty(String propertyName, boolean value) {
|
||||
this.oleMethod(OleAuto.DISPATCH_PROPERTYPUT, null, this.getIDispatch(),
|
||||
propertyName, new VARIANT(value));
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the property.
|
||||
*
|
||||
* @param propertyName
|
||||
* the property name
|
||||
* @param value
|
||||
* the value
|
||||
*/
|
||||
protected void setProperty(String propertyName, Date value) {
|
||||
this.oleMethod(OleAuto.DISPATCH_PROPERTYPUT, null, this.getIDispatch(),
|
||||
propertyName, new VARIANT(value));
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the property.
|
||||
*
|
||||
* @param propertyName
|
||||
* the property name
|
||||
* @param value
|
||||
* the value
|
||||
*/
|
||||
protected void setProperty(String propertyName, IDispatch value) {
|
||||
this.oleMethod(OleAuto.DISPATCH_PROPERTYPUT, null, this.getIDispatch(),
|
||||
propertyName, new VARIANT(value));
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the property.
|
||||
*
|
||||
* @param propertyName
|
||||
* the property name
|
||||
* @param value
|
||||
* the value
|
||||
*/
|
||||
protected void setProperty(String propertyName, int value) {
|
||||
this.oleMethod(OleAuto.DISPATCH_PROPERTYPUT, null, this.getIDispatch(),
|
||||
propertyName, new VARIANT(value));
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the property.
|
||||
*
|
||||
* @param propertyName
|
||||
* the property name
|
||||
* @param value
|
||||
* the value
|
||||
*/
|
||||
protected void setProperty(String propertyName, short value) {
|
||||
this.oleMethod(OleAuto.DISPATCH_PROPERTYPUT, null, this.getIDispatch(),
|
||||
propertyName, new VARIANT(value));
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the property.
|
||||
*
|
||||
* @param propertyName
|
||||
* the property name
|
||||
* @param value
|
||||
* the value
|
||||
*/
|
||||
protected void setProperty(String propertyName, String value) {
|
||||
this.oleMethod(OleAuto.DISPATCH_PROPERTYPUT, null, this.getIDispatch(),
|
||||
propertyName, new VARIANT(value));
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the property.
|
||||
*
|
||||
* @param propertyName
|
||||
* the property name
|
||||
* @param iDispatch
|
||||
* the i dispatch
|
||||
* @param value
|
||||
* the value
|
||||
*/
|
||||
protected void setProperty(String propertyName, IDispatch iDispatch,
|
||||
VARIANT value) {
|
||||
this.oleMethod(OleAuto.DISPATCH_PROPERTYPUT, null, iDispatch,
|
||||
propertyName, value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the property.
|
||||
*
|
||||
* @param propertyName
|
||||
* the property name
|
||||
* @param comObject
|
||||
* the com object
|
||||
* @param value
|
||||
* the value
|
||||
*/
|
||||
protected void setProperty(String propertyName,
|
||||
COMLateBindingObject comObject, VARIANT value) {
|
||||
this.oleMethod(OleAuto.DISPATCH_PROPERTYPUT, null,
|
||||
comObject.getIDispatch(), propertyName, value);
|
||||
}
|
||||
|
||||
/**
|
||||
* To variant.
|
||||
*
|
||||
* @return the variant
|
||||
*/
|
||||
public VARIANT toVariant() {
|
||||
return new VARIANT(this.getIDispatch());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,231 @@
|
||||
/* Copyright (c) 2013 Tobias Wolf, All Rights Reserved
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
package com.sun.jna.platform.win32.COM;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
import com.sun.jna.Native;
|
||||
import com.sun.jna.platform.win32.Advapi32;
|
||||
import com.sun.jna.platform.win32.Advapi32Util;
|
||||
import com.sun.jna.platform.win32.Advapi32Util.EnumKey;
|
||||
import com.sun.jna.platform.win32.Advapi32Util.InfoKey;
|
||||
import com.sun.jna.platform.win32.Kernel32Util;
|
||||
import com.sun.jna.platform.win32.OaIdl.EXCEPINFO;
|
||||
import com.sun.jna.platform.win32.WTypes.BSTR;
|
||||
import com.sun.jna.platform.win32.WinNT;
|
||||
import com.sun.jna.platform.win32.WinNT.HRESULT;
|
||||
import com.sun.jna.platform.win32.WinReg;
|
||||
import com.sun.jna.platform.win32.WinReg.HKEYByReference;
|
||||
import com.sun.jna.ptr.IntByReference;
|
||||
|
||||
// TODO: Auto-generated Javadoc
|
||||
/**
|
||||
* The Class COMUtils.
|
||||
*
|
||||
* @author wolf.tobias@gmx.net The Class COMUtils.
|
||||
*/
|
||||
public abstract class COMUtils {
|
||||
|
||||
/** The Constant CO_E_NOTINITIALIZED. */
|
||||
public static final int S_OK = 0;
|
||||
|
||||
/**
|
||||
* Succeeded.
|
||||
*
|
||||
* @param hr
|
||||
* the hr
|
||||
* @return true, if successful
|
||||
*/
|
||||
public static boolean SUCCEEDED(HRESULT hr) {
|
||||
return SUCCEEDED(hr.intValue());
|
||||
}
|
||||
|
||||
/**
|
||||
* Succeeded.
|
||||
*
|
||||
* @param hr
|
||||
* the hr
|
||||
* @return true, if successful
|
||||
*/
|
||||
public static boolean SUCCEEDED(int hr) {
|
||||
if (hr == S_OK)
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Failed.
|
||||
*
|
||||
* @param hr
|
||||
* the hr
|
||||
* @return true, if successful
|
||||
*/
|
||||
public static boolean FAILED(HRESULT hr) {
|
||||
return FAILED(hr.intValue());
|
||||
}
|
||||
|
||||
/**
|
||||
* Failed.
|
||||
*
|
||||
* @param hr
|
||||
* the hr
|
||||
* @return true, if successful
|
||||
*/
|
||||
public static boolean FAILED(int hr) {
|
||||
if (hr != S_OK)
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Throw new exception.
|
||||
*
|
||||
* @param hr
|
||||
* the hr
|
||||
*/
|
||||
public static void checkRC(HRESULT hr) {
|
||||
checkRC(hr, null, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Throw new exception.
|
||||
*
|
||||
* @param hr
|
||||
* the hr
|
||||
* @param pExcepInfo
|
||||
* the excep info
|
||||
* @param puArgErr
|
||||
* the pu arg err
|
||||
*/
|
||||
public static void checkRC(HRESULT hr, EXCEPINFO pExcepInfo,
|
||||
IntByReference puArgErr) {
|
||||
if (FAILED(hr)) {
|
||||
String formatMessageFromHR = Kernel32Util.formatMessage(hr);
|
||||
throw new COMException(formatMessageFromHR, pExcepInfo, puArgErr);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the all com info on system.
|
||||
*
|
||||
* @return the all com info on system
|
||||
*/
|
||||
public static ArrayList<COMInfo> getAllCOMInfoOnSystem() {
|
||||
HKEYByReference phkResult = new HKEYByReference();
|
||||
HKEYByReference phkResult2 = new HKEYByReference();
|
||||
String subKey;
|
||||
ArrayList<COMInfo> comInfos = new ArrayList<COMUtils.COMInfo>();
|
||||
|
||||
try {
|
||||
// open root key
|
||||
phkResult = Advapi32Util.registryGetKey(WinReg.HKEY_CLASSES_ROOT,
|
||||
"CLSID", WinNT.KEY_ALL_ACCESS);
|
||||
// open subkey
|
||||
InfoKey infoKey = Advapi32Util.registryQueryInfoKey(
|
||||
phkResult.getValue(), WinNT.KEY_ALL_ACCESS);
|
||||
|
||||
for (int i = 0; i < infoKey.lpcSubKeys.getValue(); i++) {
|
||||
EnumKey enumKey = Advapi32Util.registryRegEnumKey(
|
||||
phkResult.getValue(), i);
|
||||
subKey = Native.toString(enumKey.lpName);
|
||||
|
||||
COMInfo comInfo = new COMInfo(subKey);
|
||||
|
||||
phkResult2 = Advapi32Util.registryGetKey(phkResult.getValue(),
|
||||
subKey, WinNT.KEY_ALL_ACCESS);
|
||||
InfoKey infoKey2 = Advapi32Util.registryQueryInfoKey(
|
||||
phkResult2.getValue(), WinNT.KEY_ALL_ACCESS);
|
||||
|
||||
for (int y = 0; y < infoKey2.lpcSubKeys.getValue(); y++) {
|
||||
EnumKey enumKey2 = Advapi32Util.registryRegEnumKey(
|
||||
phkResult2.getValue(), y);
|
||||
String subKey2 = Native.toString(enumKey2.lpName);
|
||||
|
||||
if (subKey2.equals("InprocHandler32")) {
|
||||
comInfo.inprocHandler32 = (String) Advapi32Util
|
||||
.registryGetValue(phkResult2.getValue(),
|
||||
subKey2, null);
|
||||
} else if (subKey2.equals("InprocServer32")) {
|
||||
comInfo.inprocServer32 = (String) Advapi32Util
|
||||
.registryGetValue(phkResult2.getValue(),
|
||||
subKey2, null);
|
||||
} else if (subKey2.equals("LocalServer32")) {
|
||||
comInfo.localServer32 = (String) Advapi32Util
|
||||
.registryGetValue(phkResult2.getValue(),
|
||||
subKey2, null);
|
||||
} else if (subKey2.equals("ProgID")) {
|
||||
comInfo.progID = (String) Advapi32Util
|
||||
.registryGetValue(phkResult2.getValue(),
|
||||
subKey2, null);
|
||||
} else if (subKey2.equals("TypeLib")) {
|
||||
comInfo.typeLib = (String) Advapi32Util
|
||||
.registryGetValue(phkResult2.getValue(),
|
||||
subKey2, null);
|
||||
}
|
||||
}
|
||||
|
||||
Advapi32.INSTANCE.RegCloseKey(phkResult2.getValue());
|
||||
comInfos.add(comInfo);
|
||||
}
|
||||
} finally {
|
||||
Advapi32.INSTANCE.RegCloseKey(phkResult.getValue());
|
||||
Advapi32.INSTANCE.RegCloseKey(phkResult2.getValue());
|
||||
}
|
||||
|
||||
return comInfos;
|
||||
}
|
||||
|
||||
/**
|
||||
* The Class COMInfo.
|
||||
*
|
||||
* @author wolf.tobias@gmx.net The Class COMInfo.
|
||||
*/
|
||||
public static class COMInfo {
|
||||
|
||||
/** The clsid. */
|
||||
public String clsid;
|
||||
|
||||
/** The inproc handler32. */
|
||||
public String inprocHandler32;
|
||||
|
||||
/** The inproc server32. */
|
||||
public String inprocServer32;
|
||||
|
||||
/** The local server32. */
|
||||
public String localServer32;
|
||||
|
||||
/** The prog id. */
|
||||
public String progID;
|
||||
|
||||
/** The type lib. */
|
||||
public String typeLib;
|
||||
|
||||
/**
|
||||
* Instantiates a new cOM info.
|
||||
*/
|
||||
public COMInfo() {
|
||||
}
|
||||
|
||||
/**
|
||||
* Instantiates a new cOM info.
|
||||
*
|
||||
* @param clsid
|
||||
* the clsid
|
||||
*/
|
||||
public COMInfo(String clsid) {
|
||||
this.clsid = clsid;
|
||||
}
|
||||
}
|
||||
}
|
||||
Alguns arquivos não foram exibidos porque demasiados arquivos foram alterados neste diff Mostrar Mais
Referência em uma Nova Issue
Bloquear um usuário